From: tappro Date: Mon, 21 Mar 2005 22:29:24 +0000 (+0000) Subject: b=5881 X-Git-Tag: 1.3.4~40 X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=5428cad9926a27d5a4dd73740534924029a2317a;p=fs%2Flustre-release.git b=5881 r=alex d=17 fix design defect. plugins are needed struct inode to check its flags --- diff --git a/lustre/smfs/dir.c b/lustre/smfs/dir.c index b26cca9..3d77ef7 100644 --- a/lustre/smfs/dir.c +++ b/lustre/smfs/dir.c @@ -55,7 +55,6 @@ static int smfs_create(struct inode *dir, struct dentry *dentry, struct dentry *cache_parent = NULL; void *handle = NULL; struct hook_msg msg = { - .dir = dir, .dentry = dentry, }; int rc = 0; @@ -80,7 +79,7 @@ static int smfs_create(struct inode *dir, struct dentry *dentry, goto exit; } - SMFS_PRE_HOOK(dir->i_sb, HOOK_CREATE, &msg); + SMFS_PRE_HOOK(dir, HOOK_CREATE, &msg); pre_smfs_inode(dir, cache_dir); @@ -97,7 +96,7 @@ static int smfs_create(struct inode *dir, struct dentry *dentry, rc = -ENOENT; } - SMFS_POST_HOOK(dir->i_sb, HOOK_CREATE, &msg, rc); + SMFS_POST_HOOK(dir, HOOK_CREATE, &msg, rc); post_smfs_inode(dir, cache_dir); smfs_trans_commit(dir, handle, 0); @@ -124,7 +123,6 @@ static struct dentry *smfs_lookup(struct inode *dir, struct dentry *dentry, struct dentry *rdentry = NULL; int rc = 0; struct hook_msg msg = { - .dir = dir, .dentry = dentry, }; @@ -142,7 +140,7 @@ static struct dentry *smfs_lookup(struct inode *dir, struct dentry *dentry, if (!cache_dentry || !cache_parent) RETURN(ERR_PTR(-ENOMEM)); - SMFS_PRE_HOOK(dir->i_sb, HOOK_LOOKUP, &msg); + SMFS_PRE_HOOK(dir, HOOK_LOOKUP, &msg); /* perform lookup in backing fs. */ #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) @@ -170,7 +168,7 @@ static struct dentry *smfs_lookup(struct inode *dir, struct dentry *dentry, if (!rc) d_add(dentry, inode); - SMFS_POST_HOOK(dir->i_sb, HOOK_LOOKUP, &msg, rc); + SMFS_POST_HOOK(dir, HOOK_LOOKUP, &msg, rc); exit: post_smfs_dentry(cache_dentry); post_smfs_dentry(cache_parent); @@ -189,7 +187,6 @@ static int smfs_link(struct dentry *old_dentry, void *handle = NULL; int rc = 0; struct hook_msg msg = { - .dir = dir, .dentry = old_dentry, }; @@ -222,7 +219,7 @@ static int smfs_link(struct dentry *old_dentry, pre_smfs_inode(old_inode, cache_old_inode); //lock_kernel(); - SMFS_PRE_HOOK(dir->i_sb, HOOK_LINK, &msg); + SMFS_PRE_HOOK(dir, HOOK_LINK, &msg); rc = cache_dir->i_op->link(cache_old_dentry, cache_dir, cache_dentry); if (!rc) { @@ -230,7 +227,7 @@ static int smfs_link(struct dentry *old_dentry, d_instantiate(dentry, old_inode); } - SMFS_POST_HOOK(dir->i_sb, HOOK_LINK, &msg, rc); + SMFS_POST_HOOK(dir, HOOK_LINK, &msg, rc); post_smfs_inode(old_inode, cache_old_inode); post_smfs_inode(dir, cache_dir); @@ -256,7 +253,6 @@ static int smfs_unlink(struct inode * dir, struct dentry *dentry) int rc = 0; //int mode = 0; struct hook_unlink_msg msg = { - .dir = dir, .dentry = dentry, .mode = 0 }; @@ -283,11 +279,11 @@ static int smfs_unlink(struct inode * dir, struct dentry *dentry) pre_smfs_inode(dir, cache_dir); pre_smfs_inode(dentry->d_inode, cache_inode); - SMFS_PRE_HOOK(dir->i_sb, HOOK_UNLINK, &msg); + SMFS_PRE_HOOK(dir, HOOK_UNLINK, &msg); rc = cache_dir->i_op->unlink(cache_dir, cache_dentry); - SMFS_POST_HOOK(dir->i_sb, HOOK_UNLINK, &msg, rc); + SMFS_POST_HOOK(dir, HOOK_UNLINK, &msg, rc); post_smfs_inode(dentry->d_inode, cache_dentry->d_inode); post_smfs_inode(dir, cache_dir); @@ -310,7 +306,6 @@ static int smfs_symlink(struct inode *dir, struct dentry *dentry, void *handle = NULL; int rc = 0; struct hook_symlink_msg msg = { - .dir = dir, .dentry = dentry, .tgt_len = strlen(symname) + 1, .symname = (char*)symname @@ -337,7 +332,7 @@ static int smfs_symlink(struct inode *dir, struct dentry *dentry, //lock_kernel(); pre_smfs_inode(dir, cache_dir); - SMFS_PRE_HOOK(dir->i_sb, HOOK_SYMLINK, &msg); + SMFS_PRE_HOOK(dir, HOOK_SYMLINK, &msg); rc = cache_dir->i_op->symlink(cache_dir, cache_dentry, symname); if (!rc) { @@ -349,7 +344,7 @@ static int smfs_symlink(struct inode *dir, struct dentry *dentry, rc = -ENOENT; } - SMFS_POST_HOOK(dir->i_sb, HOOK_SYMLINK, &msg, rc); + SMFS_POST_HOOK(dir, HOOK_SYMLINK, &msg, rc); post_smfs_inode(dir, cache_dir); smfs_trans_commit(dir, handle, 0); @@ -371,7 +366,6 @@ static int smfs_mkdir(struct inode *dir, struct dentry *dentry, void *handle = NULL; int rc = 0; struct hook_msg msg = { - .dir = dir, .dentry = dentry, }; @@ -395,7 +389,7 @@ static int smfs_mkdir(struct inode *dir, struct dentry *dentry, } pre_smfs_inode(dir, cache_dir); - SMFS_PRE_HOOK(dir->i_sb, HOOK_MKDIR, &msg); + SMFS_PRE_HOOK(dir, HOOK_MKDIR, &msg); rc = cache_dir->i_op->mkdir(cache_dir, cache_dentry, mode); if (!rc) { @@ -407,7 +401,7 @@ static int smfs_mkdir(struct inode *dir, struct dentry *dentry, rc = -ENOENT; } - SMFS_POST_HOOK(dir->i_sb, HOOK_MKDIR, &msg, rc); + SMFS_POST_HOOK(dir, HOOK_MKDIR, &msg, rc); post_smfs_inode(dir, cache_dir); smfs_trans_commit(dir, handle, 0); @@ -426,7 +420,6 @@ static int smfs_rmdir(struct inode *dir, struct dentry *dentry) void *handle = NULL; int rc = 0; struct hook_unlink_msg msg = { - .dir = dir, .dentry = dentry, .mode = S_IFDIR }; @@ -452,11 +445,11 @@ static int smfs_rmdir(struct inode *dir, struct dentry *dentry) pre_smfs_inode(dir, cache_dir); pre_smfs_inode(dentry->d_inode, cache_dentry->d_inode); - SMFS_PRE_HOOK(dir->i_sb, HOOK_RMDIR, &msg); + SMFS_PRE_HOOK(dir, HOOK_RMDIR, &msg); rc = cache_dir->i_op->rmdir(cache_dir, cache_dentry); - SMFS_POST_HOOK(dir->i_sb, HOOK_RMDIR, &msg, rc); + SMFS_POST_HOOK(dir, HOOK_RMDIR, &msg, rc); post_smfs_inode(dir, cache_dir); post_smfs_inode(dentry->d_inode, cache_dentry->d_inode); @@ -484,7 +477,6 @@ static int smfs_mknod(struct inode *dir, struct dentry *dentry, void *handle = NULL; int rc = 0; struct hook_msg msg = { - .dir = dir, .dentry = dentry, }; @@ -509,7 +501,7 @@ static int smfs_mknod(struct inode *dir, struct dentry *dentry, pre_smfs_inode(dir, cache_dir); pre_smfs_inode(dentry->d_inode, cache_dentry->d_inode); - SMFS_PRE_HOOK(dir->i_sb, HOOK_MKNOD, &msg); + SMFS_PRE_HOOK(dir, HOOK_MKNOD, &msg); rc = cache_dir->i_op->mknod(cache_dir, cache_dentry, mode, rdev); if (!rc) { @@ -521,7 +513,7 @@ static int smfs_mknod(struct inode *dir, struct dentry *dentry, rc = -ENOENT; } - SMFS_POST_HOOK(dir->i_sb, HOOK_MKNOD, &msg, rc); + SMFS_POST_HOOK(dir, HOOK_MKNOD, &msg, rc); post_smfs_inode(dir, cache_dir); post_smfs_inode(dentry->d_inode, cache_dentry->d_inode); @@ -547,7 +539,6 @@ static int smfs_rename(struct inode *old_dir, struct dentry *old_dentry, void *handle = NULL; int rc = 0; struct hook_rename_msg msg = { - .dir = old_dir, .dentry = old_dentry, .new_dir = new_dir, .new_dentry = new_dentry @@ -591,12 +582,12 @@ static int smfs_rename(struct inode *old_dir, struct dentry *old_dentry, if (new_dentry->d_inode) pre_smfs_inode(new_dentry->d_inode, cache_new_dentry->d_inode); - SMFS_PRE_HOOK(old_dir->i_sb, HOOK_RENAME, &msg); + SMFS_PRE_HOOK(old_dir, HOOK_RENAME, &msg); rc = cache_old_dir->i_op->rename(cache_old_dir, cache_old_dentry, cache_new_dir, cache_new_dentry); - SMFS_POST_HOOK(old_dir->i_sb, HOOK_RENAME, &msg, rc); + SMFS_POST_HOOK(old_dir, HOOK_RENAME, &msg, rc); post_smfs_inode(old_dir, cache_old_dir); post_smfs_inode(new_dir, cache_new_dir); @@ -675,7 +666,6 @@ static int smfs_readdir(struct file *filp, void *dirent, filldir_t filldir) struct smfs_file_info *sfi = NULL; int rc = 0; struct hook_readdir_msg msg = { - .dir = dentry->d_inode, .dentry = dentry, .filp = filp, .dirent = dirent, @@ -691,11 +681,11 @@ static int smfs_readdir(struct file *filp, void *dirent, filldir_t filldir) sfi = F2SMFI(filp); if (sfi->magic != SMFS_FILE_MAGIC) BUG(); - SMFS_PRE_HOOK(dentry->d_inode->i_sb, HOOK_READDIR, &msg); + SMFS_PRE_HOOK(dentry->d_inode, HOOK_READDIR, &msg); rc = cache_inode->i_fop->readdir(sfi->c_file, dirent, filldir); - SMFS_POST_HOOK(dentry->d_inode->i_sb, HOOK_READDIR, &msg, rc); + SMFS_POST_HOOK(dentry->d_inode, HOOK_READDIR, &msg, rc); duplicate_file(filp, sfi->c_file); exit: diff --git a/lustre/smfs/file.c b/lustre/smfs/file.c index 939cf77..c6ccadb 100644 --- a/lustre/smfs/file.c +++ b/lustre/smfs/file.c @@ -51,7 +51,6 @@ static ssize_t smfs_write(struct file *filp, const char *buf, size_t count, loff_t *cache_ppos = NULL; int rc = 0; struct hook_write_msg msg = { - .inode = filp->f_dentry->d_inode, .dentry = filp->f_dentry, .count = count, .pos = *ppos @@ -73,7 +72,7 @@ static ssize_t smfs_write(struct file *filp, const char *buf, size_t count, pre_smfs_inode(filp->f_dentry->d_inode, cache_inode); - SMFS_PRE_HOOK(filp->f_dentry->d_sb, HOOK_WRITE, &msg); + SMFS_PRE_HOOK(filp->f_dentry->d_inode, HOOK_WRITE, &msg); if (ppos != &(filp->f_pos)) { cache_ppos = &msg.pos; @@ -86,7 +85,7 @@ static ssize_t smfs_write(struct file *filp, const char *buf, size_t count, rc = cache_inode->i_fop->write(sfi->c_file, buf, count, cache_ppos); - SMFS_POST_HOOK(filp->f_dentry->d_sb, HOOK_WRITE, &msg, rc); + SMFS_POST_HOOK(filp->f_dentry->d_inode, HOOK_WRITE, &msg, rc); post_smfs_inode(filp->f_dentry->d_inode, cache_inode); *ppos = *cache_ppos; @@ -403,7 +402,6 @@ int smfs_setattr(struct dentry *dentry, struct iattr *attr) void *handle = NULL; int rc = 0; struct hook_setattr_msg msg = { - .inode = dentry->d_inode, .dentry = dentry, .attr = attr }; @@ -425,11 +423,11 @@ int smfs_setattr(struct dentry *dentry, struct iattr *attr) pre_smfs_inode(dentry->d_inode, cache_inode); - SMFS_PRE_HOOK(dentry->d_sb, HOOK_SETATTR, &msg); + SMFS_PRE_HOOK(dentry->d_inode, HOOK_SETATTR, &msg); rc = cache_inode->i_op->setattr(cache_dentry, attr); - SMFS_POST_HOOK(dentry->d_sb, HOOK_SETATTR, &msg, rc); + SMFS_POST_HOOK(dentry->d_inode, HOOK_SETATTR, &msg, rc); post_smfs_inode(dentry->d_inode, cache_inode); smfs_trans_commit(dentry->d_inode, handle, 0); diff --git a/lustre/smfs/smfs_api.h b/lustre/smfs/smfs_api.h index 379af98..2f3aea3 100644 --- a/lustre/smfs/smfs_api.h +++ b/lustre/smfs/smfs_api.h @@ -8,8 +8,10 @@ #define SMFS_IS_PLG(flags, mask) (flags & mask) #define SMFS_CLEAR_PLG(flags, mask) (flags &= ~mask) -typedef int (*smfs_plg_hook)(int hook_code, void *arg, int, void * priv); -typedef int (*smfs_plg_func)(int help_code, void *arg, void * priv); +typedef int (*smfs_plg_hook)(int hook_code, struct inode *, + void *arg, int rc, void * priv); +typedef int (*smfs_plg_func)(int help_code, struct super_block *, + void *arg, void * priv); struct smfs_plugin { struct list_head plg_list; @@ -36,32 +38,27 @@ struct smfs_plugin { #define HOOK_MAX 13 struct hook_msg { - struct inode * dir; struct dentry * dentry; }; struct hook_unlink_msg { - struct inode * dir; struct dentry * dentry; int mode; }; struct hook_symlink_msg { - struct inode * dir; struct dentry * dentry; int tgt_len; char * symname; }; struct hook_rename_msg { - struct inode * dir; struct dentry * dentry; struct inode * new_dir; struct dentry * new_dentry; }; struct hook_readdir_msg { - struct inode * dir; struct dentry * dentry; struct file * filp; void * dirent; @@ -69,43 +66,38 @@ struct hook_readdir_msg { }; struct hook_write_msg { - struct inode * inode; struct dentry * dentry; size_t count; loff_t pos; }; struct hook_setattr_msg { - struct inode * inode; struct dentry * dentry; struct iattr *attr; }; -#define SMFS_HOOK(sb, op, msg, a,b,c,d,e,f) \ -do { \ -} while(0) -#define SMFS_PRE_HOOK(sb, op, msg) \ +#define SMFS_PRE_HOOK(inode, op, msg) \ do { \ - struct smfs_super_info *smb = S2SMI(sb); \ + struct smfs_super_info *smb = S2SMI(inode->i_sb); \ struct list_head *hlist = &smb->smsi_plg_list; \ struct smfs_plugin *plg; \ \ list_for_each_entry(plg, hlist, plg_list) { \ if (plg->plg_pre_op) \ - plg->plg_pre_op(op, msg, 0, \ + plg->plg_pre_op(op, inode, msg, 0, \ plg->plg_private); \ } \ } while(0) -#define SMFS_POST_HOOK(sb, op, msg, rc) \ +#define SMFS_POST_HOOK(inode, op, msg, rc) \ do { \ - struct smfs_super_info *smb = S2SMI(sb); \ + struct smfs_super_info *smb = S2SMI(inode->i_sb); \ struct list_head *hlist = &smb->smsi_plg_list; \ struct smfs_plugin *plg; \ \ list_for_each_entry(plg, hlist, plg_list) { \ if (plg->plg_post_op) \ - plg->plg_post_op(op, msg, rc, \ + plg->plg_post_op(op, inode, msg, rc, \ plg->plg_private); \ } \ } while(0) @@ -123,7 +115,7 @@ do { \ \ list_for_each_entry_safe(plugin, tmp, hlist, plg_list) { \ if (plugin->plg_helper) \ - plugin->plg_helper(op, data, \ + plugin->plg_helper(op, sb, data, \ plugin->plg_private); \ } \ } while(0) @@ -136,7 +128,3 @@ int smfs_init_kml(struct super_block *); int smfs_init_lru(struct super_block *); int smfs_init_cow(struct super_block *); - - - -