commit db5f65c7e045c0ef960c14a6fb3feb973b7ff001
Author: Erez Zadok <[email protected]>
Date: Tue Sep 22 17:44:09 2009 -0400
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 <[email protected]>
diff --git a/fs/unionfs/compat.h b/fs/unionfs/compat.h
index 3d93798..42f5ce3 100644
--- a/fs/unionfs/compat.h
+++ b/fs/unionfs/compat.h
@@ -24,6 +24,9 @@ extern void *krealloc2(size_t oldsize, void *ptr, size_t
newsize, int flags);
#define i_mutex i_sem
#define kzalloc(num, flags) kcalloc(1, (num), (flags))
#define UNIONFS_SUPER_MAGIC 0xf15f083d
+#ifndef NFS_SUPER_MAGIC
+# define NFS_SUPER_MAGIC 0x6969 /* from <linx/nfs_fs.h> */
+#endif /* not NFS_SUPER_MAGIC */
#define POISON_INUSE 0x5a /* for use-uninitialised poisoning */
#define SEEK_SET 0 /* seek relative to beginning of file */
#define SEEK_CUR 1 /* seek relative to current file position */
diff --git a/fs/unionfs/inode.c b/fs/unionfs/inode.c
index 2b4fceb..afd21e2 100644
--- a/fs/unionfs/inode.c
+++ b/fs/unionfs/inode.c
@@ -837,6 +837,20 @@ static int unionfs_permission(struct inode *inode, int
mask,
}
/*
+ * 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 = permission(lower_inode, mask, NULL);
+
+ /*
* The permissions are an intersection of the overall directory
* permissions, so we fail if one fails.
*/
_______________________________________________
unionfs-cvs mailing list: http://unionfs.filesystems.org/
[email protected]
http://www.fsl.cs.sunysb.edu/mailman/listinfo/unionfs-cvs