Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f4e49cd2 authored by Jeff Layton's avatar Jeff Layton Committed by Steve French
Browse files

cifs: allocate kvec array for cifs_readdata as a separate allocation



Eventually, we're going to want to append a list of pages to
cifs_readdata instead of a list of kvecs. To prepare for that, turn
the kvec array allocation into a separate one and just keep a
pointer to it in the readdata.

Signed-off-by: default avatarJeff Layton <jlayton@redhat.com>
parent 67c1f529
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -982,7 +982,7 @@ struct cifs_readdata {
	int (*marshal_iov) (struct cifs_readdata *rdata,
			    unsigned int remaining);
	unsigned int			nr_iov;
	struct kvec			iov[1];
	struct kvec			*iov;
};

struct cifs_writedata;
+12 −3
Original line number Diff line number Diff line
@@ -2410,19 +2410,27 @@ ssize_t cifs_strict_writev(struct kiocb *iocb, const struct iovec *iov,
}

static struct cifs_readdata *
cifs_readdata_alloc(unsigned int nr_vecs, work_func_t complete)
cifs_readdata_alloc(unsigned int nr_pages, work_func_t complete)
{
	struct cifs_readdata *rdata;
	struct kvec *iov;

	rdata = kzalloc(sizeof(*rdata) +
			sizeof(struct kvec) * nr_vecs, GFP_KERNEL);
	iov = kzalloc(sizeof(*iov) * (nr_pages + 1), GFP_KERNEL);
	if (!iov)
		return (struct cifs_readdata *)iov;

	rdata = kzalloc(sizeof(*rdata), GFP_KERNEL);
	if (rdata != NULL) {
		kref_init(&rdata->refcount);
		INIT_LIST_HEAD(&rdata->list);
		init_completion(&rdata->done);
		INIT_WORK(&rdata->work, complete);
		INIT_LIST_HEAD(&rdata->pages);
		rdata->iov = iov;
	} else {
		kfree(iov);
	}

	return rdata;
}

@@ -2435,6 +2443,7 @@ cifs_readdata_release(struct kref *refcount)
	if (rdata->cfile)
		cifsFileInfo_put(rdata->cfile);

	kfree(rdata->iov);
	kfree(rdata);
}