X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Flvfs%2Ffsfilt_reiserfs.c;h=861b663d379a44190863b5086973437e6df4568e;hb=471854590f94f6c214b78e3d4bd4e2076667379f;hp=2e16c18fc3b9f12c25a8f882b5c0ae3150e452b6;hpb=250866233e4ae873f047277f990ce647cb5de246;p=fs%2Flustre-release.git diff --git a/lustre/lvfs/fsfilt_reiserfs.c b/lustre/lvfs/fsfilt_reiserfs.c index 2e16c18..861b663 100644 --- a/lustre/lvfs/fsfilt_reiserfs.c +++ b/lustre/lvfs/fsfilt_reiserfs.c @@ -33,7 +33,6 @@ #define DEBUG_SUBSYSTEM S_FILTER #include -#include #include #include #include @@ -49,15 +48,22 @@ #include #include +/* XXX We cannot include linux/reiserfs_fs.h here, because of symbols clash, + but we need MAX_HEIGHT definition for proper reserve calculations +#include +*/ +#define MAX_HEIGHT 5 /* maximal height of a tree. don't change this without + changing JOURNAL_PER_BALANCE_CNT */ + static void *fsfilt_reiserfs_start(struct inode *inode, int op, - void *desc_private) + void *desc_private, int logs) { return (void *)0xf00f00be; } static void *fsfilt_reiserfs_brw_start(int objcount, struct fsfilt_objinfo *fso, int niocount, struct niobuf_local *nb, - void *desc_private) + void *desc_private, int logs) { return (void *)0xf00f00be; } @@ -158,10 +164,15 @@ static int fsfilt_reiserfs_add_journal_cb(struct obd_device *obd, return 0; } -static int fsfilt_reiserfs_statfs(struct super_block *sb, struct obd_statfs *osfs) +static int fsfilt_reiserfs_statfs(struct super_block *sb, + struct obd_statfs *osfs) { - struct statfs sfs; - int rc = vfs_statfs(sb, &sfs); + struct kstatfs sfs; + int rc; + + memset(&sfs, 0, sizeof(sfs)); + + rc = sb->s_op->statfs(sb, &sfs); statfs_pack(osfs, &sfs); return rc; @@ -172,19 +183,49 @@ static int fsfilt_reiserfs_sync(struct super_block *sb) return fsync_dev(sb->s_dev); } +/* If fso is NULL, op is FSFILT operation, otherwise op is number of fso + objects. Logs is number of logfiles to update */ +static int fsfilt_reiserfs_get_op_len(int op, struct fsfilt_objinfo *fso, + int logs) +{ + if ( !fso ) { + switch(op) { + case FSFILT_OP_CREATE: + /* directory leaf, index & indirect & EA*/ + return MAX_HEIGHT + logs; + case FSFILT_OP_UNLINK: + return MAX_HEIGHT + logs; + } + + } else { + int i; + int needed = MAX_HEIGHT; + struct super_block *sb = fso->fso_dentry->d_inode->i_sb; + int blockpp = 1 << (PAGE_CACHE_SHIFT - sb->s_blocksize_bits); + for (i = 0; i < op; i++, fso++) { + int nblocks = fso->fso_bufcnt * blockpp; + + needed += nblocks; + } + return needed + logs; + } + + return 0; +} static struct fsfilt_operations fsfilt_reiserfs_ops = { - fs_type: "reiserfs", - fs_owner: THIS_MODULE, - fs_start: fsfilt_reiserfs_start, - fs_brw_start: fsfilt_reiserfs_brw_start, - fs_commit: fsfilt_reiserfs_commit, - fs_setattr: fsfilt_reiserfs_setattr, - fs_set_md: fsfilt_reiserfs_set_md, - fs_get_md: fsfilt_reiserfs_get_md, - fs_readpage: fsfilt_reiserfs_readpage, - fs_add_journal_cb: fsfilt_reiserfs_add_journal_cb, - fs_statfs: fsfilt_reiserfs_statfs, - fs_sync: fsfilt_reiserfs_sync, + .fs_type = "reiserfs", + .fs_owner = THIS_MODULE, + .fs_start = fsfilt_reiserfs_start, + .fs_brw_start = fsfilt_reiserfs_brw_start, + .fs_commit = fsfilt_reiserfs_commit, + .fs_setattr = fsfilt_reiserfs_setattr, + .fs_set_md = fsfilt_reiserfs_set_md, + .fs_get_md = fsfilt_reiserfs_get_md, + .fs_readpage = fsfilt_reiserfs_readpage, + .fs_add_journal_cb = fsfilt_reiserfs_add_journal_cb, + .fs_statfs = fsfilt_reiserfs_statfs, + .fs_sync = fsfilt_reiserfs_sync, + .fs_get_op_len = fsfilt_reiserfs_get_op_len, }; static int __init fsfilt_reiserfs_init(void)