mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-29 23:53:32 +00:00
NFS: Fix deadlocks in nfs_scan_commit_list()
[ Upstream commit64a93dbf25
] Partially revert commit2ce209c42c
("NFS: Wait for requests that are locked on the commit list"), since it can lead to deadlocks between commit requests and nfs_join_page_group(). For now we should assume that any locked requests on the commit list are either about to be removed and committed by another task, or the writes they describe are about to be retransmitted. In either case, we should not need to worry. Fixes:2ce209c42c
("NFS: Wait for requests that are locked on the commit list") Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
5a893e0eab
commit
c79c37c775
1 changed files with 2 additions and 15 deletions
|
@ -1050,25 +1050,11 @@ nfs_scan_commit_list(struct list_head *src, struct list_head *dst,
|
|||
struct nfs_page *req, *tmp;
|
||||
int ret = 0;
|
||||
|
||||
restart:
|
||||
list_for_each_entry_safe(req, tmp, src, wb_list) {
|
||||
kref_get(&req->wb_kref);
|
||||
if (!nfs_lock_request(req)) {
|
||||
int status;
|
||||
|
||||
/* Prevent deadlock with nfs_lock_and_join_requests */
|
||||
if (!list_empty(dst)) {
|
||||
nfs_release_request(req);
|
||||
continue;
|
||||
}
|
||||
/* Ensure we make progress to prevent livelock */
|
||||
mutex_unlock(&NFS_I(cinfo->inode)->commit_mutex);
|
||||
status = nfs_wait_on_request(req);
|
||||
nfs_release_request(req);
|
||||
mutex_lock(&NFS_I(cinfo->inode)->commit_mutex);
|
||||
if (status < 0)
|
||||
break;
|
||||
goto restart;
|
||||
continue;
|
||||
}
|
||||
nfs_request_remove_commit_list(req, cinfo);
|
||||
clear_bit(PG_COMMIT_TO_DS, &req->wb_flags);
|
||||
|
@ -1935,6 +1921,7 @@ static int __nfs_commit_inode(struct inode *inode, int how,
|
|||
int may_wait = how & FLUSH_SYNC;
|
||||
int ret, nscan;
|
||||
|
||||
how &= ~FLUSH_SYNC;
|
||||
nfs_init_cinfo_from_inode(&cinfo, inode);
|
||||
nfs_commit_begin(cinfo.mds);
|
||||
for (;;) {
|
||||
|
|
Loading…
Reference in a new issue