mirror of https://gitee.com/openkylin/linux.git
NFSv4/pNFS: Scan the full list of commit arrays when committing
Add support for scanning the full list of per-layout segment commit arrays to pnfs_generic_scan_commit_lists() Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
parent
c21e716884
commit
a8e3765e51
|
@ -118,8 +118,12 @@ pnfs_free_commit_array(struct pnfs_commit_array *p)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(pnfs_free_commit_array);
|
||||
|
||||
/*
|
||||
* Locks the nfs_page requests for commit and moves them to
|
||||
* @bucket->committing.
|
||||
*/
|
||||
static int
|
||||
pnfs_generic_scan_ds_commit_list(struct pnfs_commit_bucket *bucket,
|
||||
pnfs_bucket_scan_ds_commit_list(struct pnfs_commit_bucket *bucket,
|
||||
struct nfs_commit_info *cinfo,
|
||||
int max)
|
||||
{
|
||||
|
@ -142,20 +146,44 @@ pnfs_generic_scan_ds_commit_list(struct pnfs_commit_bucket *bucket,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int pnfs_bucket_scan_array(struct nfs_commit_info *cinfo,
|
||||
struct pnfs_commit_bucket *buckets,
|
||||
unsigned int nbuckets,
|
||||
int max)
|
||||
{
|
||||
unsigned int i;
|
||||
int rv = 0, cnt;
|
||||
|
||||
for (i = 0; i < nbuckets && max != 0; i++) {
|
||||
cnt = pnfs_bucket_scan_ds_commit_list(&buckets[i], cinfo, max);
|
||||
rv += cnt;
|
||||
max -= cnt;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
/* Move reqs from written to committing lists, returning count
|
||||
* of number moved.
|
||||
*/
|
||||
int pnfs_generic_scan_commit_lists(struct nfs_commit_info *cinfo,
|
||||
int max)
|
||||
int pnfs_generic_scan_commit_lists(struct nfs_commit_info *cinfo, int max)
|
||||
{
|
||||
int i, rv = 0, cnt;
|
||||
struct pnfs_ds_commit_info *fl_cinfo = cinfo->ds;
|
||||
struct pnfs_commit_array *array;
|
||||
int rv = 0, cnt;
|
||||
|
||||
lockdep_assert_held(&NFS_I(cinfo->inode)->commit_mutex);
|
||||
for (i = 0; i < cinfo->ds->nbuckets && max != 0; i++) {
|
||||
cnt = pnfs_generic_scan_ds_commit_list(&cinfo->ds->buckets[i],
|
||||
cinfo, max);
|
||||
max -= cnt;
|
||||
cnt = pnfs_bucket_scan_array(cinfo, fl_cinfo->buckets,
|
||||
fl_cinfo->nbuckets, max);
|
||||
rv += cnt;
|
||||
max -= cnt;
|
||||
if (!max)
|
||||
return rv;
|
||||
list_for_each_entry(array, &fl_cinfo->commits, cinfo_list) {
|
||||
cnt = pnfs_bucket_scan_array(cinfo, array->buckets,
|
||||
array->nbuckets, max);
|
||||
rv += cnt;
|
||||
max -= cnt;
|
||||
if (!max)
|
||||
break;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue