diff options
Diffstat (limited to 'fs/nfsd/nfsproc.c')
-rw-r--r-- | fs/nfsd/nfsproc.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/fs/nfsd/nfsproc.c b/fs/nfsd/nfsproc.c index e15dc45fc5ec..aad6d457b9e8 100644 --- a/fs/nfsd/nfsproc.c +++ b/fs/nfsd/nfsproc.c | |||
@@ -196,6 +196,7 @@ nfsd_proc_create(struct svc_rqst *rqstp, struct nfsd_createargs *argp, | |||
196 | struct dentry *dchild; | 196 | struct dentry *dchild; |
197 | int type, mode; | 197 | int type, mode; |
198 | __be32 nfserr; | 198 | __be32 nfserr; |
199 | int hosterr; | ||
199 | dev_t rdev = 0, wanted = new_decode_dev(attr->ia_size); | 200 | dev_t rdev = 0, wanted = new_decode_dev(attr->ia_size); |
200 | 201 | ||
201 | dprintk("nfsd: CREATE %s %.*s\n", | 202 | dprintk("nfsd: CREATE %s %.*s\n", |
@@ -214,6 +215,12 @@ nfsd_proc_create(struct svc_rqst *rqstp, struct nfsd_createargs *argp, | |||
214 | nfserr = nfserr_exist; | 215 | nfserr = nfserr_exist; |
215 | if (isdotent(argp->name, argp->len)) | 216 | if (isdotent(argp->name, argp->len)) |
216 | goto done; | 217 | goto done; |
218 | hosterr = fh_want_write(dirfhp); | ||
219 | if (hosterr) { | ||
220 | nfserr = nfserrno(hosterr); | ||
221 | goto done; | ||
222 | } | ||
223 | |||
217 | fh_lock_nested(dirfhp, I_MUTEX_PARENT); | 224 | fh_lock_nested(dirfhp, I_MUTEX_PARENT); |
218 | dchild = lookup_one_len(argp->name, dirfhp->fh_dentry, argp->len); | 225 | dchild = lookup_one_len(argp->name, dirfhp->fh_dentry, argp->len); |
219 | if (IS_ERR(dchild)) { | 226 | if (IS_ERR(dchild)) { |
@@ -330,7 +337,7 @@ nfsd_proc_create(struct svc_rqst *rqstp, struct nfsd_createargs *argp, | |||
330 | out_unlock: | 337 | out_unlock: |
331 | /* We don't really need to unlock, as fh_put does it. */ | 338 | /* We don't really need to unlock, as fh_put does it. */ |
332 | fh_unlock(dirfhp); | 339 | fh_unlock(dirfhp); |
333 | 340 | fh_drop_write(dirfhp); | |
334 | done: | 341 | done: |
335 | fh_put(dirfhp); | 342 | fh_put(dirfhp); |
336 | return nfsd_return_dirop(nfserr, resp); | 343 | return nfsd_return_dirop(nfserr, resp); |