diff options
author | J. Bruce Fields <bfields@fieldses.org> | 2006-11-08 20:44:40 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-11-08 21:29:23 -0500 |
commit | 81ac95c5569d7a60ab5db6c1ccec56c12b3ebcb5 (patch) | |
tree | c28ac039697a462527e2aedc4f0c7575d76fbbb1 /fs/nfsd/vfs.c | |
parent | af85852de0b32d92b14295aa6f5ba3a9ad044cf6 (diff) |
[PATCH] nfsd4: fix open-create permissions
In the case where an open creates the file, we shouldn't be rechecking
permissions to open the file; the open succeeds regardless of what the new
file's mode bits say.
This patch fixes the problem, but only by introducing yet another parameter
to nfsd_create_v3. This is ugly. This will be fixed by later patches.
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Acked-by: Neil Brown <neilb@suse.de>
Cc: Jeff Garzik <jeff@garzik.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs/nfsd/vfs.c')
-rw-r--r-- | fs/nfsd/vfs.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index f21e917bb8ed..1a7ad8c983d1 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c | |||
@@ -1237,7 +1237,7 @@ __be32 | |||
1237 | nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp, | 1237 | nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp, |
1238 | char *fname, int flen, struct iattr *iap, | 1238 | char *fname, int flen, struct iattr *iap, |
1239 | struct svc_fh *resfhp, int createmode, u32 *verifier, | 1239 | struct svc_fh *resfhp, int createmode, u32 *verifier, |
1240 | int *truncp) | 1240 | int *truncp, int *created) |
1241 | { | 1241 | { |
1242 | struct dentry *dentry, *dchild = NULL; | 1242 | struct dentry *dentry, *dchild = NULL; |
1243 | struct inode *dirp; | 1243 | struct inode *dirp; |
@@ -1331,6 +1331,8 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp, | |||
1331 | host_err = vfs_create(dirp, dchild, iap->ia_mode, NULL); | 1331 | host_err = vfs_create(dirp, dchild, iap->ia_mode, NULL); |
1332 | if (host_err < 0) | 1332 | if (host_err < 0) |
1333 | goto out_nfserr; | 1333 | goto out_nfserr; |
1334 | if (created) | ||
1335 | *created = 1; | ||
1334 | 1336 | ||
1335 | if (EX_ISSYNC(fhp->fh_export)) { | 1337 | if (EX_ISSYNC(fhp->fh_export)) { |
1336 | err = nfserrno(nfsd_sync_dir(dentry)); | 1338 | err = nfserrno(nfsd_sync_dir(dentry)); |