diff options
author | Tiger Yang <tiger.yang@oracle.com> | 2006-11-27 09:59:21 +0800 |
---|---|---|
committer | Mark Fasheh <mark.fasheh@oracle.com> | 2006-12-01 18:29:14 -0800 |
commit | d38eb8db6aa359c060dfb72a29cf8d94a96657d8 (patch) | |
tree | 3d27b15ae8fc1718030147a2ed08812c902a7b2e | |
parent | 58d206c2fa5cc0b35bf3ca48324d7633aa7d0412 (diff) |
ocfs2: implement i_op->permission
Implement .permission() in ocfs2_file_iops, ocfs2_special_file_iops and
ocfs2_dir_iops.
This helps us avoid some multi-node races with mode change and vfs
operations.
Signed-off-by: Tiger Yang <tiger.yang@oracle.com>
Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
-rw-r--r-- | fs/ocfs2/file.c | 24 | ||||
-rw-r--r-- | fs/ocfs2/file.h | 2 | ||||
-rw-r--r-- | fs/ocfs2/namei.c | 1 |
3 files changed, 27 insertions, 0 deletions
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index b64ef7c6e2d..8786b3c490a 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c @@ -945,6 +945,28 @@ bail: return err; } +int ocfs2_permission(struct inode *inode, int mask, struct nameidata *nd) +{ + int ret; + + mlog_entry_void(); + + ret = ocfs2_meta_lock(inode, NULL, 0); + if (ret) { + mlog_errno(ret); + goto out; + } + + ret = generic_permission(inode, mask, NULL); + if (ret) + mlog_errno(ret); + + ocfs2_meta_unlock(inode, 0); +out: + mlog_exit(ret); + return ret; +} + static int ocfs2_write_remove_suid(struct inode *inode) { int ret; @@ -1329,11 +1351,13 @@ bail: struct inode_operations ocfs2_file_iops = { .setattr = ocfs2_setattr, .getattr = ocfs2_getattr, + .permission = ocfs2_permission, }; struct inode_operations ocfs2_special_file_iops = { .setattr = ocfs2_setattr, .getattr = ocfs2_getattr, + .permission = ocfs2_permission, }; const struct file_operations ocfs2_fops = { diff --git a/fs/ocfs2/file.h b/fs/ocfs2/file.h index 475ed8aee8b..601a453f18a 100644 --- a/fs/ocfs2/file.h +++ b/fs/ocfs2/file.h @@ -48,6 +48,8 @@ int ocfs2_do_extend_allocation(struct ocfs2_super *osb, int ocfs2_setattr(struct dentry *dentry, struct iattr *attr); int ocfs2_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat); +int ocfs2_permission(struct inode *inode, int mask, + struct nameidata *nd); int ocfs2_set_inode_size(handle_t *handle, struct inode *inode, diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c index 583bffe9809..21db45ddf14 100644 --- a/fs/ocfs2/namei.c +++ b/fs/ocfs2/namei.c @@ -2311,4 +2311,5 @@ struct inode_operations ocfs2_dir_iops = { .rename = ocfs2_rename, .setattr = ocfs2_setattr, .getattr = ocfs2_getattr, + .permission = ocfs2_permission, }; |