pnfs: clean up filelayout_alloc_commit_info
authorWeston Andros Adamson <dros@primarydata.com>
Thu, 15 May 2014 15:56:49 +0000 (11:56 -0400)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Thu, 29 May 2014 15:11:46 +0000 (11:11 -0400)
Remove unneeded else statement and clean up how commit info
dataserver buckets are replaced.

Suggested-by: Trond Myklebust <trond.myklebust@primarydata.com>
Signed-off-by: Weston Andros Adamson <dros@primarydata.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
fs/nfs/nfs4filelayout.c

index 9319427e43e34ebc3b209d7efb998e9732c4f456..9cea9358fe525d114833630b6da8a0961e6fe49d 100644 (file)
@@ -850,11 +850,15 @@ filelayout_alloc_commit_info(struct pnfs_layout_segment *lseg,
 {
        struct nfs4_filelayout_segment *fl = FILELAYOUT_LSEG(lseg);
        struct pnfs_commit_bucket *buckets;
-       int size;
+       int size, i;
 
        if (fl->commit_through_mds)
                return 0;
-       if (cinfo->ds->nbuckets != 0) {
+
+       size = (fl->stripe_type == STRIPE_SPARSE) ?
+               fl->dsaddr->ds_num : fl->dsaddr->stripe_count;
+
+       if (cinfo->ds->nbuckets >= size) {
                /* This assumes there is only one IOMODE_RW lseg.  What
                 * we really want to do is have a layout_hdr level
                 * dictionary of <multipath_list4, fh> keys, each
@@ -864,30 +868,32 @@ filelayout_alloc_commit_info(struct pnfs_layout_segment *lseg,
                return 0;
        }
 
-       size = (fl->stripe_type == STRIPE_SPARSE) ?
-               fl->dsaddr->ds_num : fl->dsaddr->stripe_count;
-
        buckets = kcalloc(size, sizeof(struct pnfs_commit_bucket),
                          gfp_flags);
        if (!buckets)
                return -ENOMEM;
-       else {
-               int i;
+       for (i = 0; i < size; i++) {
+               INIT_LIST_HEAD(&buckets[i].written);
+               INIT_LIST_HEAD(&buckets[i].committing);
+       }
 
-               spin_lock(cinfo->lock);
-               if (cinfo->ds->nbuckets != 0)
-                       kfree(buckets);
-               else {
-                       cinfo->ds->buckets = buckets;
-                       cinfo->ds->nbuckets = size;
-                       for (i = 0; i < size; i++) {
-                               INIT_LIST_HEAD(&buckets[i].written);
-                               INIT_LIST_HEAD(&buckets[i].committing);
-                       }
-               }
-               spin_unlock(cinfo->lock);
-               return 0;
+       spin_lock(cinfo->lock);
+       if (cinfo->ds->nbuckets >= size)
+               goto out;
+       for (i = 0; i < cinfo->ds->nbuckets; i++) {
+               list_splice(&cinfo->ds->buckets[i].written,
+                           &buckets[i].written);
+               list_splice(&cinfo->ds->buckets[i].committing,
+                           &buckets[i].committing);
+               buckets[i].wlseg = cinfo->ds->buckets[i].wlseg;
+               buckets[i].clseg = cinfo->ds->buckets[i].clseg;
        }
+       swap(cinfo->ds->buckets, buckets);
+       cinfo->ds->nbuckets = size;
+out:
+       spin_unlock(cinfo->lock);
+       kfree(buckets);
+       return 0;
 }
 
 static struct pnfs_layout_segment *