]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
NFSv4/pNFS: Scan the full list of commit arrays when committing
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Thu, 19 Mar 2020 17:41:08 +0000 (13:41 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Fri, 27 Mar 2020 20:34:34 +0000 (16:34 -0400)
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>
fs/nfs/pnfs_nfs.c

index c8518ce3a4ef55172eb18621873aeea28506de25..81fd85e66fd9f787adb657baa35a2229b914d5d9 100644 (file)
@@ -118,10 +118,14 @@ 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,
-                                struct nfs_commit_info *cinfo,
-                                int max)
+pnfs_bucket_scan_ds_commit_list(struct pnfs_commit_bucket *bucket,
+                               struct nfs_commit_info *cinfo,
+                               int max)
 {
        struct list_head *src = &bucket->written;
        struct list_head *dst = &bucket->committing;
@@ -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;
-
-       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;
+       struct pnfs_ds_commit_info *fl_cinfo = cinfo->ds;
+       struct pnfs_commit_array *array;
+       int rv = 0, 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;
 }