diff --git a/kmod/src/dir.c b/kmod/src/dir.c index a9481ad7..f8ae31f6 100644 --- a/kmod/src/dir.c +++ b/kmod/src/dir.c @@ -19,6 +19,7 @@ #include #include "format.h" +#include "file.h" #include "dir.h" #include "inode.h" #include "ioctl.h" @@ -1131,6 +1132,7 @@ const struct inode_operations scoutfs_dir_iops = { .listxattr = scoutfs_listxattr, .removexattr = scoutfs_removexattr, .symlink = scoutfs_symlink, + .permission = scoutfs_permission, }; void scoutfs_dir_exit(void) diff --git a/kmod/src/file.c b/kmod/src/file.c index f00fb688..5d8e675e 100644 --- a/kmod/src/file.c +++ b/kmod/src/file.c @@ -83,3 +83,24 @@ out: return ret; } + +int scoutfs_permission(struct inode *inode, int mask) +{ + struct super_block *sb = inode->i_sb; + struct scoutfs_lock *inode_lock = NULL; + int ret; + + if (mask & MAY_NOT_BLOCK) + return -ECHILD; + + ret = scoutfs_lock_inode(sb, DLM_LOCK_PR, SCOUTFS_LKF_REFRESH_INODE, + inode, &inode_lock); + if (ret) + return ret; + + ret = generic_permission(inode, mask); + + scoutfs_unlock(sb, inode_lock, DLM_LOCK_PR); + + return ret; +} diff --git a/kmod/src/file.h b/kmod/src/file.h index a55a3bbb..8df0f330 100644 --- a/kmod/src/file.h +++ b/kmod/src/file.h @@ -5,5 +5,6 @@ ssize_t scoutfs_file_aio_read(struct kiocb *iocb, const struct iovec *iov, unsigned long nr_segs, loff_t pos); ssize_t scoutfs_file_aio_write(struct kiocb *iocb, const struct iovec *iov, unsigned long nr_segs, loff_t pos); +int scoutfs_permission(struct inode *inode, int mask); #endif /* _SCOUTFS_FILE_H_ */