nfs: don't sleep with inode lock in lock_and_join_requests
[firefly-linux-kernel-4.4.55.git] / fs / nfs / write.c
index e056f617adf2f927bcc86b8cda118479a9588bee..175d5d073ccf350db485daf81ab3030555d80a60 100644 (file)
@@ -478,13 +478,23 @@ try_again:
                return NULL;
        }
 
-       /* lock each request in the page group */
+       /* holding inode lock, so always make a non-blocking call to try the
+        * page group lock */
        ret = nfs_page_group_lock(head, true);
        if (ret < 0) {
                spin_unlock(&inode->i_lock);
+
+               if (!nonblock && ret == -EAGAIN) {
+                       nfs_page_group_lock_wait(head);
+                       nfs_release_request(head);
+                       goto try_again;
+               }
+
                nfs_release_request(head);
                return ERR_PTR(ret);
        }
+
+       /* lock each request in the page group */
        subreq = head;
        do {
                /*