diff options
-rw-r--r-- | fs/nfsd/vfs.c | 8 | ||||
-rw-r--r-- | include/linux/nfsd/nfsfh.h | 11 |
2 files changed, 13 insertions, 6 deletions
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index c9e3b5a8fe07..443ebc52e382 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c | |||
@@ -1114,7 +1114,7 @@ nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp, | |||
1114 | */ | 1114 | */ |
1115 | if (!resfhp->fh_dentry) { | 1115 | if (!resfhp->fh_dentry) { |
1116 | /* called from nfsd_proc_mkdir, or possibly nfsd3_proc_create */ | 1116 | /* called from nfsd_proc_mkdir, or possibly nfsd3_proc_create */ |
1117 | fh_lock(fhp); | 1117 | fh_lock_nested(fhp, I_MUTEX_PARENT); |
1118 | dchild = lookup_one_len(fname, dentry, flen); | 1118 | dchild = lookup_one_len(fname, dentry, flen); |
1119 | err = PTR_ERR(dchild); | 1119 | err = PTR_ERR(dchild); |
1120 | if (IS_ERR(dchild)) | 1120 | if (IS_ERR(dchild)) |
@@ -1240,7 +1240,7 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp, | |||
1240 | err = nfserr_notdir; | 1240 | err = nfserr_notdir; |
1241 | if(!dirp->i_op || !dirp->i_op->lookup) | 1241 | if(!dirp->i_op || !dirp->i_op->lookup) |
1242 | goto out; | 1242 | goto out; |
1243 | fh_lock(fhp); | 1243 | fh_lock_nested(fhp, I_MUTEX_PARENT); |
1244 | 1244 | ||
1245 | /* | 1245 | /* |
1246 | * Compose the response file handle. | 1246 | * Compose the response file handle. |
@@ -1494,7 +1494,7 @@ nfsd_link(struct svc_rqst *rqstp, struct svc_fh *ffhp, | |||
1494 | if (isdotent(name, len)) | 1494 | if (isdotent(name, len)) |
1495 | goto out; | 1495 | goto out; |
1496 | 1496 | ||
1497 | fh_lock(ffhp); | 1497 | fh_lock_nested(ffhp, I_MUTEX_PARENT); |
1498 | ddir = ffhp->fh_dentry; | 1498 | ddir = ffhp->fh_dentry; |
1499 | dirp = ddir->d_inode; | 1499 | dirp = ddir->d_inode; |
1500 | 1500 | ||
@@ -1644,7 +1644,7 @@ nfsd_unlink(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, | |||
1644 | if (err) | 1644 | if (err) |
1645 | goto out; | 1645 | goto out; |
1646 | 1646 | ||
1647 | fh_lock(fhp); | 1647 | fh_lock_nested(fhp, I_MUTEX_PARENT); |
1648 | dentry = fhp->fh_dentry; | 1648 | dentry = fhp->fh_dentry; |
1649 | dirp = dentry->d_inode; | 1649 | dirp = dentry->d_inode; |
1650 | 1650 | ||
diff --git a/include/linux/nfsd/nfsfh.h b/include/linux/nfsd/nfsfh.h index 31a3cb617ce0..069257ea99a0 100644 --- a/include/linux/nfsd/nfsfh.h +++ b/include/linux/nfsd/nfsfh.h | |||
@@ -290,8 +290,9 @@ fill_post_wcc(struct svc_fh *fhp) | |||
290 | * vfs.c:nfsd_rename as it needs to grab 2 i_mutex's at once | 290 | * vfs.c:nfsd_rename as it needs to grab 2 i_mutex's at once |
291 | * so, any changes here should be reflected there. | 291 | * so, any changes here should be reflected there. |
292 | */ | 292 | */ |
293 | |||
293 | static inline void | 294 | static inline void |
294 | fh_lock(struct svc_fh *fhp) | 295 | fh_lock_nested(struct svc_fh *fhp, unsigned int subclass) |
295 | { | 296 | { |
296 | struct dentry *dentry = fhp->fh_dentry; | 297 | struct dentry *dentry = fhp->fh_dentry; |
297 | struct inode *inode; | 298 | struct inode *inode; |
@@ -310,11 +311,17 @@ fh_lock(struct svc_fh *fhp) | |||
310 | } | 311 | } |
311 | 312 | ||
312 | inode = dentry->d_inode; | 313 | inode = dentry->d_inode; |
313 | mutex_lock(&inode->i_mutex); | 314 | mutex_lock_nested(&inode->i_mutex, subclass); |
314 | fill_pre_wcc(fhp); | 315 | fill_pre_wcc(fhp); |
315 | fhp->fh_locked = 1; | 316 | fhp->fh_locked = 1; |
316 | } | 317 | } |
317 | 318 | ||
319 | static inline void | ||
320 | fh_lock(struct svc_fh *fhp) | ||
321 | { | ||
322 | fh_lock_nested(fhp, I_MUTEX_NORMAL); | ||
323 | } | ||
324 | |||
318 | /* | 325 | /* |
319 | * Unlock a file handle/inode | 326 | * Unlock a file handle/inode |
320 | */ | 327 | */ |