]> git.baikalelectronics.ru Git - kernel.git/commitdiff
pNFS: Add a helper to allocate the array of buckets
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Wed, 18 Mar 2020 21:22:47 +0000 (17:22 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Thu, 26 Mar 2020 14:52:04 +0000 (10:52 -0400)
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/pnfs.h
fs/nfs/pnfs_nfs.c
include/linux/nfs_xdr.h

index 7bfb6970134a1d75024141654b1fca85e83e73eb..f6b1099aa151041faf77ed218d41f4c4e8037568 100644 (file)
@@ -366,6 +366,9 @@ bool nfs4_test_deviceid_unavailable(struct nfs4_deviceid_node *node);
 void nfs4_deviceid_purge_client(const struct nfs_client *);
 
 /* pnfs_nfs.c */
+struct pnfs_commit_array *pnfs_alloc_commit_array(size_t n, gfp_t gfp_flags);
+void pnfs_free_commit_array(struct pnfs_commit_array *p);
+
 void pnfs_generic_clear_request_commit(struct nfs_page *req,
                                       struct nfs_commit_info *cinfo);
 void pnfs_generic_commit_release(void *calldata);
index 3d094254161806a5f1be0a111c1d68ac7a2256de..c8518ce3a4ef55172eb18621873aeea28506de25 100644 (file)
@@ -87,6 +87,37 @@ out:
 }
 EXPORT_SYMBOL_GPL(pnfs_generic_clear_request_commit);
 
+struct pnfs_commit_array *
+pnfs_alloc_commit_array(size_t n, gfp_t gfp_flags)
+{
+       struct pnfs_commit_array *p;
+       struct pnfs_commit_bucket *b;
+
+       p = kmalloc(struct_size(p, buckets, n), gfp_flags);
+       if (!p)
+               return NULL;
+       p->nbuckets = n;
+       INIT_LIST_HEAD(&p->cinfo_list);
+       INIT_LIST_HEAD(&p->lseg_list);
+       p->lseg = NULL;
+       for (b = &p->buckets[0]; n != 0; b++, n--) {
+               INIT_LIST_HEAD(&b->written);
+               INIT_LIST_HEAD(&b->committing);
+               b->wlseg = NULL;
+               b->clseg = NULL;
+               b->direct_verf.committed = NFS_INVALID_STABLE_HOW;
+       }
+       return p;
+}
+EXPORT_SYMBOL_GPL(pnfs_alloc_commit_array);
+
+void
+pnfs_free_commit_array(struct pnfs_commit_array *p)
+{
+       kfree_rcu(p, rcu);
+}
+EXPORT_SYMBOL_GPL(pnfs_free_commit_array);
+
 static int
 pnfs_generic_scan_ds_commit_list(struct pnfs_commit_bucket *bucket,
                                 struct nfs_commit_info *cinfo,
index 94c77ed55ce1b4177f9382121769ac5eb4ea1f3a..e91c917c9c1c15040b19cd4c06f3fd44956532ee 100644 (file)
@@ -1270,10 +1270,19 @@ struct pnfs_commit_bucket {
        struct nfs_writeverf direct_verf;
 };
 
+struct pnfs_commit_array {
+       struct list_head cinfo_list;
+       struct list_head lseg_list;
+       struct pnfs_layout_segment *lseg;
+       struct rcu_head rcu;
+       unsigned int nbuckets;
+       struct pnfs_commit_bucket buckets[];
+};
+
 struct pnfs_ds_commit_info {
-       int nwritten;
-       int ncommitting;
-       int nbuckets;
+       unsigned int nwritten;
+       unsigned int ncommitting;
+       unsigned int nbuckets;
        struct pnfs_commit_bucket *buckets;
 };