struct dentry *cache_parent = NULL;
void *handle = NULL;
struct hook_msg msg = {
- .dir = dir,
.dentry = dentry,
};
int rc = 0;
goto exit;
}
- SMFS_PRE_HOOK(dir->i_sb, HOOK_CREATE, &msg);
+ SMFS_PRE_HOOK(dir, HOOK_CREATE, &msg);
pre_smfs_inode(dir, cache_dir);
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);
struct dentry *rdentry = NULL;
int rc = 0;
struct hook_msg msg = {
- .dir = dir,
.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))
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);
void *handle = NULL;
int rc = 0;
struct hook_msg msg = {
- .dir = dir,
.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) {
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);
int rc = 0;
//int mode = 0;
struct hook_unlink_msg msg = {
- .dir = dir,
.dentry = dentry,
.mode = 0
};
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);
void *handle = NULL;
int rc = 0;
struct hook_symlink_msg msg = {
- .dir = dir,
.dentry = dentry,
.tgt_len = strlen(symname) + 1,
.symname = (char*)symname
//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) {
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);
void *handle = NULL;
int rc = 0;
struct hook_msg msg = {
- .dir = dir,
.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) {
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);
void *handle = NULL;
int rc = 0;
struct hook_unlink_msg msg = {
- .dir = dir,
.dentry = dentry,
.mode = S_IFDIR
};
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);
void *handle = NULL;
int rc = 0;
struct hook_msg msg = {
- .dir = dir,
.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) {
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);
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
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);
struct smfs_file_info *sfi = NULL;
int rc = 0;
struct hook_readdir_msg msg = {
- .dir = dentry->d_inode,
.dentry = dentry,
.filp = filp,
.dirent = dirent,
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:
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
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;
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;
void *handle = NULL;
int rc = 0;
struct hook_setattr_msg msg = {
- .inode = dentry->d_inode,
.dentry = dentry,
.attr = 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);
#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;
#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;
};
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)
\
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)
int smfs_init_lru(struct super_block *);
int smfs_init_cow(struct super_block *);
-
-
-
-