Commit a8e3765e authored by Trond Myklebust's avatar Trond Myklebust
Browse files

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: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent c21e7168
Loading
Loading
Loading
Loading
+40 −12
Original line number Diff line number Diff line
@@ -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);
	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;
}