diff options
-rw-r--r-- | fs/nfsd/auth.c | 3 | ||||
-rw-r--r-- | fs/nfsd/vfs.c | 13 | ||||
-rw-r--r-- | include/linux/nfsd/export.h | 1 |
3 files changed, 6 insertions, 11 deletions
diff --git a/fs/nfsd/auth.c b/fs/nfsd/auth.c index cf61dc8ae942..21928056e35e 100644 --- a/fs/nfsd/auth.c +++ b/fs/nfsd/auth.c | |||
@@ -9,10 +9,11 @@ | |||
9 | #include <linux/sunrpc/svc.h> | 9 | #include <linux/sunrpc/svc.h> |
10 | #include <linux/sunrpc/svcauth.h> | 10 | #include <linux/sunrpc/svcauth.h> |
11 | #include <linux/nfsd/nfsd.h> | 11 | #include <linux/nfsd/nfsd.h> |
12 | #include <linux/nfsd/export.h> | ||
12 | 13 | ||
13 | #define CAP_NFSD_MASK (CAP_FS_MASK|CAP_TO_MASK(CAP_SYS_RESOURCE)) | 14 | #define CAP_NFSD_MASK (CAP_FS_MASK|CAP_TO_MASK(CAP_SYS_RESOURCE)) |
14 | 15 | ||
15 | static int nfsexp_flags(struct svc_rqst *rqstp, struct svc_export *exp) | 16 | int nfsexp_flags(struct svc_rqst *rqstp, struct svc_export *exp) |
16 | { | 17 | { |
17 | struct exp_flavor_info *f; | 18 | struct exp_flavor_info *f; |
18 | struct exp_flavor_info *end = exp->ex_flavors + exp->ex_nflavors; | 19 | struct exp_flavor_info *end = exp->ex_flavors + exp->ex_nflavors; |
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index f2684e57cf22..ee96a897a29e 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c | |||
@@ -1797,16 +1797,9 @@ nfsd_statfs(struct svc_rqst *rqstp, struct svc_fh *fhp, struct kstatfs *stat) | |||
1797 | return err; | 1797 | return err; |
1798 | } | 1798 | } |
1799 | 1799 | ||
1800 | static inline int EX_RDONLY(struct svc_export *exp, struct svc_rqst *rqstp) | 1800 | static int exp_rdonly(struct svc_rqst *rqstp, struct svc_export *exp) |
1801 | { | 1801 | { |
1802 | struct exp_flavor_info *f; | 1802 | return nfsexp_flags(rqstp, exp) & NFSEXP_READONLY; |
1803 | struct exp_flavor_info *end = exp->ex_flavors + exp->ex_nflavors; | ||
1804 | |||
1805 | for (f = exp->ex_flavors; f < end; f++) { | ||
1806 | if (f->pseudoflavor == rqstp->rq_flavor) | ||
1807 | return f->flags & NFSEXP_READONLY; | ||
1808 | } | ||
1809 | return exp->ex_flags & NFSEXP_READONLY; | ||
1810 | } | 1803 | } |
1811 | 1804 | ||
1812 | /* | 1805 | /* |
@@ -1845,7 +1838,7 @@ nfsd_permission(struct svc_rqst *rqstp, struct svc_export *exp, | |||
1845 | */ | 1838 | */ |
1846 | if (!(acc & MAY_LOCAL_ACCESS)) | 1839 | if (!(acc & MAY_LOCAL_ACCESS)) |
1847 | if (acc & (MAY_WRITE | MAY_SATTR | MAY_TRUNC)) { | 1840 | if (acc & (MAY_WRITE | MAY_SATTR | MAY_TRUNC)) { |
1848 | if (EX_RDONLY(exp, rqstp) || IS_RDONLY(inode)) | 1841 | if (exp_rdonly(rqstp, exp) || IS_RDONLY(inode)) |
1849 | return nfserr_rofs; | 1842 | return nfserr_rofs; |
1850 | if (/* (acc & MAY_WRITE) && */ IS_IMMUTABLE(inode)) | 1843 | if (/* (acc & MAY_WRITE) && */ IS_IMMUTABLE(inode)) |
1851 | return nfserr_perm; | 1844 | return nfserr_perm; |
diff --git a/include/linux/nfsd/export.h b/include/linux/nfsd/export.h index fb4e93016666..5cd192469096 100644 --- a/include/linux/nfsd/export.h +++ b/include/linux/nfsd/export.h | |||
@@ -116,6 +116,7 @@ struct svc_expkey { | |||
116 | #define EX_NOHIDE(exp) ((exp)->ex_flags & NFSEXP_NOHIDE) | 116 | #define EX_NOHIDE(exp) ((exp)->ex_flags & NFSEXP_NOHIDE) |
117 | #define EX_WGATHER(exp) ((exp)->ex_flags & NFSEXP_GATHERED_WRITES) | 117 | #define EX_WGATHER(exp) ((exp)->ex_flags & NFSEXP_GATHERED_WRITES) |
118 | 118 | ||
119 | int nfsexp_flags(struct svc_rqst *rqstp, struct svc_export *exp); | ||
119 | __be32 check_nfsd_access(struct svc_export *exp, struct svc_rqst *rqstp); | 120 | __be32 check_nfsd_access(struct svc_export *exp, struct svc_rqst *rqstp); |
120 | 121 | ||
121 | /* | 122 | /* |