NFS: create common routine for allocating nfs_direct_req
Factor out a small common piece of the path that allocate nfs_direct_req structures. Test plan: Compile kernel with CONFIG_NFS and CONFIG_NFS_DIRECTIO enabled. Signed-off-by: Chuck Lever <cel@netapp.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
bc0fb201b3
commit
93619e5989
|
@ -152,6 +152,24 @@ static void nfs_free_user_pages(struct page **pages, int npages, int do_dirty)
|
||||||
kfree(pages);
|
kfree(pages);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline struct nfs_direct_req *nfs_direct_req_alloc(void)
|
||||||
|
{
|
||||||
|
struct nfs_direct_req *dreq;
|
||||||
|
|
||||||
|
dreq = kmem_cache_alloc(nfs_direct_cachep, SLAB_KERNEL);
|
||||||
|
if (!dreq)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
kref_init(&dreq->kref);
|
||||||
|
init_waitqueue_head(&dreq->wait);
|
||||||
|
INIT_LIST_HEAD(&dreq->list);
|
||||||
|
dreq->iocb = NULL;
|
||||||
|
atomic_set(&dreq->count, 0);
|
||||||
|
atomic_set(&dreq->error, 0);
|
||||||
|
|
||||||
|
return dreq;
|
||||||
|
}
|
||||||
|
|
||||||
static void nfs_direct_req_release(struct kref *kref)
|
static void nfs_direct_req_release(struct kref *kref)
|
||||||
{
|
{
|
||||||
struct nfs_direct_req *dreq = container_of(kref, struct nfs_direct_req, kref);
|
struct nfs_direct_req *dreq = container_of(kref, struct nfs_direct_req, kref);
|
||||||
|
@ -194,17 +212,10 @@ static struct nfs_direct_req *nfs_direct_read_alloc(size_t nbytes, size_t rsize)
|
||||||
unsigned int reads = 0;
|
unsigned int reads = 0;
|
||||||
unsigned int rpages = (rsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
|
unsigned int rpages = (rsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
|
||||||
|
|
||||||
dreq = kmem_cache_alloc(nfs_direct_cachep, SLAB_KERNEL);
|
dreq = nfs_direct_req_alloc();
|
||||||
if (!dreq)
|
if (!dreq)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
kref_init(&dreq->kref);
|
|
||||||
init_waitqueue_head(&dreq->wait);
|
|
||||||
INIT_LIST_HEAD(&dreq->list);
|
|
||||||
dreq->iocb = NULL;
|
|
||||||
atomic_set(&dreq->count, 0);
|
|
||||||
atomic_set(&dreq->error, 0);
|
|
||||||
|
|
||||||
list = &dreq->list;
|
list = &dreq->list;
|
||||||
for(;;) {
|
for(;;) {
|
||||||
struct nfs_read_data *data = nfs_readdata_alloc(rpages);
|
struct nfs_read_data *data = nfs_readdata_alloc(rpages);
|
||||||
|
|
Loading…
Reference in New Issue