LASSERT(cache_inode->i_fop->write);
sfi = F2SMFI(filp);
-
- if (sfi->magic != SMFS_FILE_MAGIC)
- LBUG();
+ LASSERT(sfi->magic == SMFS_FILE_MAGIC);
if (filp->f_flags & O_APPEND)
msg.pos = filp->f_dentry->d_inode->i_size;
- pre_smfs_inode(filp->f_dentry->d_inode, cache_inode);
-
+ pre_smfs_file(filp, &msg.pos, &cache_ppos);
SMFS_PRE_HOOK(filp->f_dentry->d_inode, HOOK_WRITE, &msg);
- if (ppos != &(filp->f_pos)) {
- cache_ppos = &msg.pos;
- } else {
- cache_ppos = &sfi->c_file->f_pos;
- }
-
- *cache_ppos = *ppos;
-
rc = cache_inode->i_fop->write(sfi->c_file, buf, count,
cache_ppos);
SMFS_POST_HOOK(filp->f_dentry->d_inode, HOOK_WRITE, &msg, rc);
-
- post_smfs_inode(filp->f_dentry->d_inode, cache_inode);
+ post_smfs_file(filp);
*ppos = *cache_ppos;
- duplicate_file(filp, sfi->c_file);
RETURN(rc);
}
LBUG();
pre_smfs_inode(inode, cache_inode);
-
+
rc = cache_inode->i_fop->ioctl(cache_inode, sfi->c_file, cmd, arg);
post_smfs_inode(inode, cache_inode);
{
struct inode *cache_inode = I2CI(filp->f_dentry->d_inode);
struct smfs_file_info *sfi;
- loff_t tmp_ppos;
loff_t *cache_ppos = NULL;
ssize_t rc = 0;
if (sfi->magic != SMFS_FILE_MAGIC)
LBUG();
- if (ppos != &(filp->f_pos)) {
- cache_ppos = &tmp_ppos;
- } else {
- cache_ppos = &sfi->c_file->f_pos;
- }
- *cache_ppos = *ppos;
-
- pre_smfs_inode(filp->f_dentry->d_inode, cache_inode);
-
+ pre_smfs_file(filp, ppos, &cache_ppos);
rc = cache_inode->i_fop->read(sfi->c_file, buf, count, cache_ppos);
+ post_smfs_file(filp);
- *ppos = *cache_ppos;
- post_smfs_inode(filp->f_dentry->d_inode, cache_inode);
- duplicate_file(filp, sfi->c_file);
-
RETURN(rc);
}
struct dentry *cache_dentry;
void *handle = NULL;
int rc = 0;
- struct hook_setattr_msg msg = {
+ struct hook_attr_msg msg = {
.dentry = dentry,
- .attr = attr
+ .attr = attr,
};
ENTRY;
RETURN(rc);
}
-int smfs_setxattr(struct dentry *dentry, const char *name, const void *value,
- size_t size, int flags)
+int smfs_setxattr(struct dentry *dentry, const char *name,
+ const void *value, size_t size, int flags)
{
struct inode *cache_inode = I2CI(dentry->d_inode);
struct dentry *cache_dentry = NULL;
+ struct hook_xattr_msg msg = {
+ .name = (char*)name,
+ };
int rc = 0;
ENTRY;
RETURN(-ENOMEM);
pre_smfs_inode(dentry->d_inode, cache_inode);
+ SMFS_PRE_HOOK(dentry->d_inode, HOOK_SETXATTR, &msg);
rc = cache_inode->i_op->setxattr(cache_dentry, name, value,
size, flags);
+
+ SMFS_POST_HOOK(dentry->d_inode, HOOK_SETXATTR, &msg, rc);
post_smfs_inode(dentry->d_inode, cache_inode);
post_smfs_dentry(cache_dentry);
RETURN(rc);
}
-int smfs_getxattr(struct dentry *dentry, const char *name, void *buffer,
- size_t size)
+int smfs_getxattr(struct dentry *dentry, const char *name,
+ void *buffer, size_t size)
{
struct inode *cache_inode = I2CI(dentry->d_inode);
struct dentry *cache_dentry;
+ struct hook_xattr_msg msg = {
+ .name = (char*)name,
+ };
int rc = 0;
ENTRY;
RETURN(-ENOMEM);
pre_smfs_inode(dentry->d_inode, cache_inode);
-
+ SMFS_PRE_HOOK(dentry->d_inode, HOOK_GETXATTR, &msg);
rc = cache_inode->i_op->getxattr(cache_dentry, name, buffer,
size);
-
+ SMFS_POST_HOOK(dentry->d_inode, HOOK_GETXATTR, &msg, rc);
post_smfs_inode(dentry->d_inode, cache_inode);
post_smfs_dentry(cache_dentry);
struct inode *cache_inode = I2CI(dentry->d_inode);
struct dentry *cache_dentry;
int rc = 0;
-
+ struct hook_xattr_msg msg = {
+ .name = NULL,
+ };
+
ENTRY;
LASSERT(cache_inode);
RETURN(-ENOMEM);
pre_smfs_inode(dentry->d_inode, cache_inode);
+ SMFS_PRE_HOOK(dentry->d_inode, HOOK_LISTXATTR, &msg);
rc = cache_inode->i_op->listxattr(cache_dentry, buffer, size);
+ SMFS_POST_HOOK(dentry->d_inode, HOOK_LISTXATTR, &msg, rc);
post_smfs_inode(dentry->d_inode, cache_inode);
post_smfs_dentry(cache_dentry);
struct inode *cache_inode = I2CI(dentry->d_inode);
struct dentry *cache_dentry;
int rc = 0;
-
+ struct hook_xattr_msg msg = {
+ .name = (char*)name,
+ };
ENTRY;
LASSERT(cache_inode);
RETURN(-ENOMEM);
pre_smfs_inode(dentry->d_inode, cache_inode);
+ SMFS_PRE_HOOK(dentry->d_inode, HOOK_REMOVEXATTR, &msg);
rc = cache_inode->i_op->removexattr(cache_dentry, name);
+ SMFS_POST_HOOK(dentry->d_inode, HOOK_REMOVEXATTR, &msg, rc);
post_smfs_inode(dentry->d_inode, cache_inode);
post_smfs_dentry(cache_dentry);
RETURN(rc);
}
+int smfs_permission(struct inode *inode, int mask, struct nameidata *nd)
+{
+ struct inode *cache_inode = I2CI(inode);
+ int rc = 0;
+
+ ENTRY;
+
+ LASSERT(cache_inode);
+ LASSERT(cache_inode->i_op->permission);
+
+ pre_smfs_inode(inode, cache_inode);
+
+ rc = cache_inode->i_op->permission(cache_inode, mask, nd);
+
+ post_smfs_inode(inode, cache_inode);
+
+ RETURN(rc);
+}
+
struct inode_operations smfs_file_iops = {
.truncate = smfs_truncate, /* BKL held */
.setattr = smfs_setattr, /* BKL held */
- .setxattr = smfs_setxattr, /* BKL held */
- .getxattr = smfs_getxattr, /* BKL held */
- .listxattr = smfs_listxattr, /* BKL held */
- .removexattr = smfs_removexattr, /* BKL held */
+ .setxattr = smfs_setxattr,
+ .getxattr = smfs_getxattr,
+ .listxattr = smfs_listxattr,
+ .removexattr = smfs_removexattr,
+ .permission = smfs_permission,
+};
+
+struct inode_operations smfs_special_iops = {
+ .setattr = smfs_setattr, /* BKL held */
+ .setxattr = smfs_setxattr,
+ .getxattr = smfs_getxattr,
+ .listxattr = smfs_listxattr,
+ .removexattr = smfs_removexattr,
+ .permission = smfs_permission,
};