|
@@ -2880,13 +2880,13 @@ out:
|
|
|
}
|
|
|
|
|
|
static struct cifs_readdata *
|
|
|
-cifs_readdata_alloc(unsigned int nr_pages, work_func_t complete)
|
|
|
+cifs_readdata_direct_alloc(struct page **pages, work_func_t complete)
|
|
|
{
|
|
|
struct cifs_readdata *rdata;
|
|
|
|
|
|
- rdata = kzalloc(sizeof(*rdata) + (sizeof(struct page *) * nr_pages),
|
|
|
- GFP_KERNEL);
|
|
|
+ rdata = kzalloc(sizeof(*rdata), GFP_KERNEL);
|
|
|
if (rdata != NULL) {
|
|
|
+ rdata->pages = pages;
|
|
|
kref_init(&rdata->refcount);
|
|
|
INIT_LIST_HEAD(&rdata->list);
|
|
|
init_completion(&rdata->done);
|
|
@@ -2896,6 +2896,22 @@ cifs_readdata_alloc(unsigned int nr_pages, work_func_t complete)
|
|
|
return rdata;
|
|
|
}
|
|
|
|
|
|
+static struct cifs_readdata *
|
|
|
+cifs_readdata_alloc(unsigned int nr_pages, work_func_t complete)
|
|
|
+{
|
|
|
+ struct page **pages =
|
|
|
+ kzalloc(sizeof(struct page *) * nr_pages, GFP_KERNEL);
|
|
|
+ struct cifs_readdata *ret = NULL;
|
|
|
+
|
|
|
+ if (pages) {
|
|
|
+ ret = cifs_readdata_direct_alloc(pages, complete);
|
|
|
+ if (!ret)
|
|
|
+ kfree(pages);
|
|
|
+ }
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
void
|
|
|
cifs_readdata_release(struct kref *refcount)
|
|
|
{
|
|
@@ -2910,6 +2926,7 @@ cifs_readdata_release(struct kref *refcount)
|
|
|
if (rdata->cfile)
|
|
|
cifsFileInfo_put(rdata->cfile);
|
|
|
|
|
|
+ kvfree(rdata->pages);
|
|
|
kfree(rdata);
|
|
|
}
|
|
|
|