X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Flvfs%2Ffsfilt_reiserfs.c;h=83c30223472cb8c2904e7c6ccaf621ad4006b1c7;hb=846732d7f4b49d87e2498e2369df7449887cb375;hp=c8a5d47a5f50202291eba0d1cec59f1bbbf9f9b2;hpb=c5050e412572b00cbe93d8517d2d1f767bebfa92;p=fs%2Flustre-release.git diff --git a/lustre/lvfs/fsfilt_reiserfs.c b/lustre/lvfs/fsfilt_reiserfs.c index c8a5d47..83c3022 100644 --- a/lustre/lvfs/fsfilt_reiserfs.c +++ b/lustre/lvfs/fsfilt_reiserfs.c @@ -33,30 +33,34 @@ #define DEBUG_SUBSYSTEM S_FILTER #include -#include #include #include #include #include -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) #include #include -#endif -#include -#include -#include -#include +#include +#include +#include #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, void *desc_private) + int niocount, struct niobuf_local *nb, + void *desc_private, int logs) { return (void *)0xf00f00be; } @@ -89,7 +93,7 @@ static int fsfilt_reiserfs_setattr(struct dentry *dentry, void *handle, if (iattr->ia_valid & ATTR_SIZE && !do_trunc) { /* ATTR_SIZE would invoke truncate: clear it */ iattr->ia_valid &= ~ATTR_SIZE; - inode->i_size = iattr->ia_size; + i_size_write(inode, iattr->ia_size); /* make sure _something_ gets set - so new inode * goes to disk (probably won't work over XFS @@ -118,7 +122,7 @@ static int fsfilt_reiserfs_setattr(struct dentry *dentry, void *handle, } static int fsfilt_reiserfs_set_md(struct inode *inode, void *handle, - void *lmm, int lmm_size) + void *lmm, int lmm_size, const char *name) { /* XXX write stripe data into MDS file itself */ CERROR("not implemented yet\n"); @@ -126,10 +130,11 @@ static int fsfilt_reiserfs_set_md(struct inode *inode, void *handle, return -ENOSYS; } -static int fsfilt_reiserfs_get_md(struct inode *inode, void *lmm, int lmm_size) +static int fsfilt_reiserfs_get_md(struct inode *inode, void *lmm, int lmm_size, + const char *name) { if (lmm == NULL) - return inode->i_size; + return i_size_read(inode); CERROR("not implemented yet\n"); return -ENOSYS; @@ -145,7 +150,7 @@ static int fsfilt_reiserfs_add_journal_cb(struct obd_device *obd, __u64 last_rcvd, void *handle, fsfilt_cb_t cb_func, void *cb_data) { - static long next = 0; + static unsigned long next = 0; if (time_after(jiffies, next)) { CERROR("no journal callback kernel patch, faking it...\n"); @@ -157,10 +162,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 = ll_do_statfs(sb, &sfs); statfs_pack(osfs, &sfs); return rc; @@ -171,19 +181,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 << (CFS_PAGE_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)