Commit e39928f9 authored by Trond Myklebust's avatar Trond Myklebust Committed by Anna Schumaker

NFS: Fix a COMMIT race in pNFS

We must make sure that cinfo->ds->nwritten is in sync with the
commit list, since it is checked as part of pnfs_scan_commit_lists().
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
parent 89a6814d
...@@ -159,13 +159,18 @@ void pnfs_generic_recover_commit_reqs(struct list_head *dst, ...@@ -159,13 +159,18 @@ void pnfs_generic_recover_commit_reqs(struct list_head *dst,
{ {
struct pnfs_commit_bucket *b; struct pnfs_commit_bucket *b;
struct pnfs_layout_segment *freeme; struct pnfs_layout_segment *freeme;
int nwritten;
int i; int i;
lockdep_assert_held(&cinfo->inode->i_lock); lockdep_assert_held(&cinfo->inode->i_lock);
restart: restart:
for (i = 0, b = cinfo->ds->buckets; i < cinfo->ds->nbuckets; i++, b++) { for (i = 0, b = cinfo->ds->buckets; i < cinfo->ds->nbuckets; i++, b++) {
if (pnfs_generic_transfer_commit_list(&b->written, dst, nwritten = pnfs_generic_transfer_commit_list(&b->written,
cinfo, 0)) { dst, cinfo, 0);
if (!nwritten)
continue;
cinfo->ds->nwritten -= nwritten;
if (list_empty(&b->written)) {
freeme = b->wlseg; freeme = b->wlseg;
b->wlseg = NULL; b->wlseg = NULL;
spin_unlock(&cinfo->inode->i_lock); spin_unlock(&cinfo->inode->i_lock);
...@@ -174,7 +179,6 @@ void pnfs_generic_recover_commit_reqs(struct list_head *dst, ...@@ -174,7 +179,6 @@ void pnfs_generic_recover_commit_reqs(struct list_head *dst,
goto restart; goto restart;
} }
} }
cinfo->ds->nwritten = 0;
} }
EXPORT_SYMBOL_GPL(pnfs_generic_recover_commit_reqs); EXPORT_SYMBOL_GPL(pnfs_generic_recover_commit_reqs);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment