summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorTrond Myklebust <trond.myklebust@primarydata.com>2017-07-19 19:50:07 +0200
committerTrond Myklebust <trond.myklebust@primarydata.com>2017-08-15 17:54:47 +0200
commit902a4c00462a755fe4a6ca655813c8b2a51fab4c (patch)
tree15d882e7eb8ba073643e6b793d1101a07ee8a7dd /fs
parentNFS: Fix nfs_page_group_destroy() and nfs_lock_and_join_requests() race cases (diff)
downloadlinux-902a4c00462a755fe4a6ca655813c8b2a51fab4c.tar.xz
linux-902a4c00462a755fe4a6ca655813c8b2a51fab4c.zip
NFS: Remove nfs_page_group_clear_bits()
At this point, we only expect ever to potentially see PG_REMOVE and PG_TEARDOWN being set on the subrequests. Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/nfs/write.c29
1 files changed, 3 insertions, 26 deletions
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index ffb9934607ef..20d44ea328b6 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -347,22 +347,6 @@ static void nfs_end_page_writeback(struct nfs_page *req)
clear_bdi_congested(inode_to_bdi(inode), BLK_RW_ASYNC);
}
-
-/* nfs_page_group_clear_bits
- * @req - an nfs request
- * clears all page group related bits from @req
- */
-static void
-nfs_page_group_clear_bits(struct nfs_page *req)
-{
- clear_bit(PG_TEARDOWN, &req->wb_flags);
- clear_bit(PG_UNLOCKPAGE, &req->wb_flags);
- clear_bit(PG_UPTODATE, &req->wb_flags);
- clear_bit(PG_WB_END, &req->wb_flags);
- clear_bit(PG_REMOVE, &req->wb_flags);
-}
-
-
/*
* nfs_unroll_locks_and_wait - unlock all newly locked reqs and wait on @req
*
@@ -417,13 +401,12 @@ nfs_destroy_unlinked_subrequests(struct nfs_page *destroy_list,
/* make sure old group is not used */
subreq->wb_this_page = subreq;
+ clear_bit(PG_REMOVE, &subreq->wb_flags);
+
/* Note: races with nfs_page_group_destroy() */
if (!kref_read(&subreq->wb_kref)) {
- bool freeme = test_bit(PG_TEARDOWN, &subreq->wb_flags);
-
- nfs_page_group_clear_bits(subreq);
/* Check if we raced with nfs_page_group_destroy() */
- if (freeme)
+ if (test_and_clear_bit(PG_TEARDOWN, &subreq->wb_flags))
nfs_free_request(subreq);
continue;
}
@@ -437,7 +420,6 @@ nfs_destroy_unlinked_subrequests(struct nfs_page *destroy_list,
spin_unlock(&inode->i_lock);
}
- nfs_page_group_clear_bits(subreq);
/* subreq is now totally disconnected from page group or any
* write / commit lists. last chance to wake any waiters */
nfs_unlock_and_release_request(subreq);
@@ -573,11 +555,6 @@ try_again:
spin_unlock(&inode->i_lock);
}
- /*
- * prepare head request to be added to new pgio descriptor
- */
- nfs_page_group_clear_bits(head);
-
nfs_page_group_unlock(head);
nfs_destroy_unlinked_subrequests(destroy_list, head, inode);