+ RETURN(rc);
+}
+
+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;
+
+ LASSERT(cache_inode);
+ LASSERT(cache_inode->i_op->getxattr);
+
+ cache_dentry = pre_smfs_dentry(NULL, cache_inode, dentry);
+ if (!cache_dentry)
+ 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);
+
+ RETURN(rc);
+}
+
+ssize_t smfs_listxattr(struct dentry *dentry, char *buffer, size_t size)
+{
+ 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);
+ LASSERT(cache_inode->i_op->listxattr);
+
+ cache_dentry = pre_smfs_dentry(NULL, cache_inode, dentry);
+ if (!cache_dentry)
+ 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);
+
+ RETURN(rc);
+}
+
+int smfs_removexattr(struct dentry *dentry, const char *name)
+{
+ 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);
+ LASSERT(cache_inode->i_op->removexattr);
+
+ cache_dentry = pre_smfs_dentry(NULL, cache_inode, dentry);
+ if (!cache_dentry)
+ 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);
+}