#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 */
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 = permission(lower_inode, mask, NULL);
+
/*
* The permissions are an intersection of the overall directory
* permissions, so we fail if one fails.