From 56ed1ca26329f3b5ed8200bab9f3d6f5396b814f Mon Sep 17 00:00:00 2001 From: Erez Zadok Date: Tue, 22 Sep 2009 17:27:23 -0400 Subject: [PATCH] Unionfs: fix readonly nfs2/3 permission handling In unionfs_permission: NFSv2/3 return EACCES on readonly-exported, locally readonly-mounted file systems, instead of EROFS like other file systems do. So we have no choice here but to intercept this and ignore it for NFS branches marked readonly. Specifically, we avoid using NFS's own "broken" ->permission method, and rely on generic_permission() to do basic checking for us. Signed-off-by: Erez Zadok --- fs/unionfs/inode.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/fs/unionfs/inode.c b/fs/unionfs/inode.c index 7c17093e0d2..7e86273583d 100644 --- a/fs/unionfs/inode.c +++ b/fs/unionfs/inode.c @@ -842,6 +842,20 @@ static int unionfs_permission(struct inode *inode, int mask) err = 0; } + /* + * NFS HACK: NFSv2/3 return EACCES on readonly-exported, + * locally readonly-mounted file systems, instead of EROFS + * like other file systems do. So we have no choice here + * but to intercept this and ignore it for NFS branches + * marked readonly. Specifically, we avoid using NFS's own + * "broken" ->permission method, and rely on + * generic_permission() to do basic checking for us. + */ + if (err && err == -EACCES && + is_robranch_super(inode->i_sb, bindex) && + lower_inode->i_sb->s_magic == NFS_SUPER_MAGIC) + err = generic_permission(lower_inode, mask, NULL); + /* * The permissions are an intersection of the overall directory * permissions, so we fail if one fails. -- 2.43.0