mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-20 21:51:05 +00:00
fs/9p: Update zero-copy implementation in 9p
* remove lot of update to different data structure * add a seperate callback for zero copy request. * above makes non zero copy code path simpler * remove conditionalizing TREAD/TREADDIR/TWRITE in the zero copy path * Fix the dotu p9_check_errors with zero copy. Add sufficient doc around * Add support for both in and output buffers in zero copy callback * pin and unpin pages in the same context * use helpers instead of defining page offset and rest of page ourself * Fix mem leak in p9_check_errors * Remove 'E' and 'F' in p9pdu_vwritef Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
This commit is contained in:
parent
c3b92c8787
commit
abfa034e4b
9 changed files with 522 additions and 364 deletions
|
@ -81,7 +81,7 @@ void p9stat_free(struct p9_wstat *stbuf)
|
|||
}
|
||||
EXPORT_SYMBOL(p9stat_free);
|
||||
|
||||
static size_t pdu_read(struct p9_fcall *pdu, void *data, size_t size)
|
||||
size_t pdu_read(struct p9_fcall *pdu, void *data, size_t size)
|
||||
{
|
||||
size_t len = min(pdu->size - pdu->offset, size);
|
||||
memcpy(data, &pdu->sdata[pdu->offset], len);
|
||||
|
@ -108,26 +108,6 @@ pdu_write_u(struct p9_fcall *pdu, const char __user *udata, size_t size)
|
|||
return size - len;
|
||||
}
|
||||
|
||||
static size_t
|
||||
pdu_write_urw(struct p9_fcall *pdu, const char *kdata, const char __user *udata,
|
||||
size_t size)
|
||||
{
|
||||
BUG_ON(pdu->size > P9_IOHDRSZ);
|
||||
pdu->pubuf = (char __user *)udata;
|
||||
pdu->pkbuf = (char *)kdata;
|
||||
pdu->pbuf_size = size;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static size_t
|
||||
pdu_write_readdir(struct p9_fcall *pdu, const char *kdata, size_t size)
|
||||
{
|
||||
BUG_ON(pdu->size > P9_READDIRHDRSZ);
|
||||
pdu->pkbuf = (char *)kdata;
|
||||
pdu->pbuf_size = size;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
b - int8_t
|
||||
w - int16_t
|
||||
|
@ -459,26 +439,6 @@ p9pdu_vwritef(struct p9_fcall *pdu, int proto_version, const char *fmt,
|
|||
errcode = -EFAULT;
|
||||
}
|
||||
break;
|
||||
case 'E':{
|
||||
int32_t cnt = va_arg(ap, int32_t);
|
||||
const char *k = va_arg(ap, const void *);
|
||||
const char __user *u = va_arg(ap,
|
||||
const void __user *);
|
||||
errcode = p9pdu_writef(pdu, proto_version, "d",
|
||||
cnt);
|
||||
if (!errcode && pdu_write_urw(pdu, k, u, cnt))
|
||||
errcode = -EFAULT;
|
||||
}
|
||||
break;
|
||||
case 'F':{
|
||||
int32_t cnt = va_arg(ap, int32_t);
|
||||
const char *k = va_arg(ap, const void *);
|
||||
errcode = p9pdu_writef(pdu, proto_version, "d",
|
||||
cnt);
|
||||
if (!errcode && pdu_write_readdir(pdu, k, cnt))
|
||||
errcode = -EFAULT;
|
||||
}
|
||||
break;
|
||||
case 'U':{
|
||||
int32_t count = va_arg(ap, int32_t);
|
||||
const char __user *udata =
|
||||
|
@ -637,10 +597,6 @@ void p9pdu_reset(struct p9_fcall *pdu)
|
|||
{
|
||||
pdu->offset = 0;
|
||||
pdu->size = 0;
|
||||
pdu->private = NULL;
|
||||
pdu->pubuf = NULL;
|
||||
pdu->pkbuf = NULL;
|
||||
pdu->pbuf_size = 0;
|
||||
}
|
||||
|
||||
int p9dirent_read(char *buf, int len, struct p9_dirent *dirent,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue