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: Trond Myklebust <trond.myklebust@primarydata.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
parent
89a6814d9b
commit
e39928f942
|
@ -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,
|
||||||
goto restart;
|
goto restart;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cinfo->ds->nwritten = 0;
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(pnfs_generic_recover_commit_reqs);
|
EXPORT_SYMBOL_GPL(pnfs_generic_recover_commit_reqs);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue