diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/nfs/pnfs.h | 3 | ||||
| -rw-r--r-- | fs/nfs/pnfs_nfs.c | 31 | 
2 files changed, 34 insertions, 0 deletions
diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h index 7bfb6970134a..f6b1099aa151 100644 --- a/fs/nfs/pnfs.h +++ b/fs/nfs/pnfs.h @@ -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); diff --git a/fs/nfs/pnfs_nfs.c b/fs/nfs/pnfs_nfs.c index 3d0942541618..c8518ce3a4ef 100644 --- a/fs/nfs/pnfs_nfs.c +++ b/fs/nfs/pnfs_nfs.c @@ -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,  | 
