diff options
Diffstat (limited to 'fs/nfs/write.c')
-rw-r--r-- | fs/nfs/write.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/fs/nfs/write.c b/fs/nfs/write.c index e056f617adf2..175d5d073ccf 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c | |||
@@ -478,13 +478,23 @@ try_again: | |||
478 | return NULL; | 478 | return NULL; |
479 | } | 479 | } |
480 | 480 | ||
481 | /* lock each request in the page group */ | 481 | /* holding inode lock, so always make a non-blocking call to try the |
482 | * page group lock */ | ||
482 | ret = nfs_page_group_lock(head, true); | 483 | ret = nfs_page_group_lock(head, true); |
483 | if (ret < 0) { | 484 | if (ret < 0) { |
484 | spin_unlock(&inode->i_lock); | 485 | spin_unlock(&inode->i_lock); |
486 | |||
487 | if (!nonblock && ret == -EAGAIN) { | ||
488 | nfs_page_group_lock_wait(head); | ||
489 | nfs_release_request(head); | ||
490 | goto try_again; | ||
491 | } | ||
492 | |||
485 | nfs_release_request(head); | 493 | nfs_release_request(head); |
486 | return ERR_PTR(ret); | 494 | return ERR_PTR(ret); |
487 | } | 495 | } |
496 | |||
497 | /* lock each request in the page group */ | ||
488 | subreq = head; | 498 | subreq = head; |
489 | do { | 499 | do { |
490 | /* | 500 | /* |