Skip to content

Commit e1200fe

Browse files
author
Al Viro
committed
9p: switch p9_client_read() to passing struct iov_iter *
... and make it loop Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
1 parent 9565a54 commit e1200fe

File tree

7 files changed

+108
-183
lines changed

7 files changed

+108
-183
lines changed

fs/9p/v9fs_vfs.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,6 @@ int v9fs_file_open(struct inode *inode, struct file *file);
6868
void v9fs_inode2stat(struct inode *inode, struct p9_wstat *stat);
6969
int v9fs_uflags2omode(int uflags, int extended);
7070

71-
ssize_t v9fs_file_readn(struct file *, char *, char __user *, u32, u64);
72-
ssize_t v9fs_fid_readn(struct p9_fid *, char *, char __user *, u32, u64);
7371
void v9fs_blank_wstat(struct p9_wstat *wstat);
7472
int v9fs_vfs_setattr_dotl(struct dentry *, struct iattr *);
7573
int v9fs_file_fsync_dotl(struct file *filp, loff_t start, loff_t end,

fs/9p/vfs_addr.c

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,11 @@
5151
*/
5252
static int v9fs_fid_readpage(struct p9_fid *fid, struct page *page)
5353
{
54-
int retval;
55-
loff_t offset;
56-
char *buffer;
57-
struct inode *inode;
54+
struct inode *inode = page->mapping->host;
55+
struct bio_vec bvec = {.bv_page = page, .bv_len = PAGE_SIZE};
56+
struct iov_iter to;
57+
int retval, err;
5858

59-
inode = page->mapping->host;
6059
p9_debug(P9_DEBUG_VFS, "\n");
6160

6261
BUG_ON(!PageLocked(page));
@@ -65,24 +64,23 @@ static int v9fs_fid_readpage(struct p9_fid *fid, struct page *page)
6564
if (retval == 0)
6665
return retval;
6766

68-
buffer = kmap(page);
69-
offset = page_offset(page);
67+
iov_iter_bvec(&to, ITER_BVEC | READ, &bvec, 1, PAGE_SIZE);
7068

71-
retval = v9fs_fid_readn(fid, buffer, NULL, PAGE_CACHE_SIZE, offset);
72-
if (retval < 0) {
69+
retval = p9_client_read(fid, page_offset(page), &to, &err);
70+
if (err) {
7371
v9fs_uncache_page(inode, page);
72+
retval = err;
7473
goto done;
7574
}
7675

77-
memset(buffer + retval, 0, PAGE_CACHE_SIZE - retval);
76+
zero_user(page, retval, PAGE_SIZE - retval);
7877
flush_dcache_page(page);
7978
SetPageUptodate(page);
8079

8180
v9fs_readpage_to_fscache(inode, page);
8281
retval = 0;
8382

8483
done:
85-
kunmap(page);
8684
unlock_page(page);
8785
return retval;
8886
}

fs/9p/vfs_dir.c

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include <linux/inet.h>
3434
#include <linux/idr.h>
3535
#include <linux/slab.h>
36+
#include <linux/uio.h>
3637
#include <net/9p/9p.h>
3738
#include <net/9p/client.h>
3839

@@ -115,6 +116,7 @@ static int v9fs_dir_readdir(struct file *file, struct dir_context *ctx)
115116
int buflen;
116117
int reclen = 0;
117118
struct p9_rdir *rdir;
119+
struct kvec kvec;
118120

119121
p9_debug(P9_DEBUG_VFS, "name %pD\n", file);
120122
fid = file->private_data;
@@ -124,16 +126,21 @@ static int v9fs_dir_readdir(struct file *file, struct dir_context *ctx)
124126
rdir = v9fs_alloc_rdir_buf(file, buflen);
125127
if (!rdir)
126128
return -ENOMEM;
129+
kvec.iov_base = rdir->buf;
130+
kvec.iov_len = buflen;
127131

128132
while (1) {
129133
if (rdir->tail == rdir->head) {
130-
err = v9fs_file_readn(file, rdir->buf, NULL,
131-
buflen, ctx->pos);
132-
if (err <= 0)
134+
struct iov_iter to;
135+
int n;
136+
iov_iter_kvec(&to, READ | ITER_KVEC, &kvec, 1, buflen);
137+
n = p9_client_read(file->private_data, ctx->pos, &to,
138+
&err);
139+
if (err)
133140
return err;
134141

135142
rdir->head = 0;
136-
rdir->tail = err;
143+
rdir->tail = n;
137144
}
138145
while (rdir->head < rdir->tail) {
139146
p9stat_init(&st);

fs/9p/vfs_file.c

Lines changed: 10 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -364,63 +364,6 @@ static int v9fs_file_flock_dotl(struct file *filp, int cmd,
364364
return ret;
365365
}
366366

367-
/**
368-
* v9fs_fid_readn - read from a fid
369-
* @fid: fid to read
370-
* @data: data buffer to read data into
371-
* @udata: user data buffer to read data into
372-
* @count: size of buffer
373-
* @offset: offset at which to read data
374-
*
375-
*/
376-
ssize_t
377-
v9fs_fid_readn(struct p9_fid *fid, char *data, char __user *udata, u32 count,
378-
u64 offset)
379-
{
380-
int n, total, size;
381-
382-
p9_debug(P9_DEBUG_VFS, "fid %d offset %llu count %d\n",
383-
fid->fid, (long long unsigned)offset, count);
384-
n = 0;
385-
total = 0;
386-
size = fid->iounit ? fid->iounit : fid->clnt->msize - P9_IOHDRSZ;
387-
do {
388-
n = p9_client_read(fid, data, udata, offset, count);
389-
if (n <= 0)
390-
break;
391-
392-
if (data)
393-
data += n;
394-
if (udata)
395-
udata += n;
396-
397-
offset += n;
398-
count -= n;
399-
total += n;
400-
} while (count > 0 && n == size);
401-
402-
if (n < 0)
403-
total = n;
404-
405-
return total;
406-
}
407-
408-
/**
409-
* v9fs_file_readn - read from a file
410-
* @filp: file pointer to read
411-
* @data: data buffer to read data into
412-
* @udata: user data buffer to read data into
413-
* @count: size of buffer
414-
* @offset: offset at which to read data
415-
*
416-
*/
417-
ssize_t
418-
v9fs_file_readn(struct file *filp, char *data, char __user *udata, u32 count,
419-
u64 offset)
420-
{
421-
return v9fs_fid_readn(filp->private_data, data, udata, count, offset);
422-
}
423-
424367
/**
425368
* v9fs_file_read - read from a file
426369
* @filp: file pointer to read
@@ -434,22 +377,20 @@ static ssize_t
434377
v9fs_file_read(struct file *filp, char __user *udata, size_t count,
435378
loff_t * offset)
436379
{
437-
int ret;
438-
struct p9_fid *fid;
439-
size_t size;
380+
struct p9_fid *fid = filp->private_data;
381+
struct iovec iov = {.iov_base = udata, .iov_len = count};
382+
struct iov_iter to;
383+
int ret, err;
440384

441-
p9_debug(P9_DEBUG_VFS, "count %zu offset %lld\n", count, *offset);
442-
fid = filp->private_data;
385+
iov_iter_init(&to, READ, &iov, 1, count);
443386

444-
size = fid->iounit ? fid->iounit : fid->clnt->msize - P9_IOHDRSZ;
445-
if (count > size)
446-
ret = v9fs_file_readn(filp, NULL, udata, count, *offset);
447-
else
448-
ret = p9_client_read(fid, NULL, udata, *offset, count);
387+
p9_debug(P9_DEBUG_VFS, "count %zu offset %lld\n", count, *offset);
449388

450-
if (ret > 0)
451-
*offset += ret;
389+
ret = p9_client_read(fid, *offset, &to, &err);
390+
if (!ret)
391+
return err;
452392

393+
*offset += ret;
453394
return ret;
454395
}
455396

fs/9p/xattr.c

Lines changed: 16 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -26,50 +26,34 @@ ssize_t v9fs_fid_xattr_get(struct p9_fid *fid, const char *name,
2626
void *buffer, size_t buffer_size)
2727
{
2828
ssize_t retval;
29-
int msize, read_count;
30-
u64 offset = 0, attr_size;
29+
u64 attr_size;
3130
struct p9_fid *attr_fid;
31+
struct kvec kvec = {.iov_base = buffer, .iov_len = buffer_size};
32+
struct iov_iter to;
33+
int err;
34+
35+
iov_iter_kvec(&to, READ | ITER_KVEC, &kvec, 1, buffer_size);
3236

3337
attr_fid = p9_client_xattrwalk(fid, name, &attr_size);
3438
if (IS_ERR(attr_fid)) {
3539
retval = PTR_ERR(attr_fid);
3640
p9_debug(P9_DEBUG_VFS, "p9_client_attrwalk failed %zd\n",
3741
retval);
38-
attr_fid = NULL;
39-
goto error;
40-
}
41-
if (!buffer_size) {
42-
/* request to get the attr_size */
43-
retval = attr_size;
44-
goto error;
42+
return retval;
4543
}
4644
if (attr_size > buffer_size) {
47-
retval = -ERANGE;
48-
goto error;
49-
}
50-
msize = attr_fid->clnt->msize;
51-
while (attr_size) {
52-
if (attr_size > (msize - P9_IOHDRSZ))
53-
read_count = msize - P9_IOHDRSZ;
45+
if (!buffer_size) /* request to get the attr_size */
46+
retval = attr_size;
5447
else
55-
read_count = attr_size;
56-
read_count = p9_client_read(attr_fid, ((char *)buffer)+offset,
57-
NULL, offset, read_count);
58-
if (read_count < 0) {
59-
/* error in xattr read */
60-
retval = read_count;
61-
goto error;
62-
}
63-
offset += read_count;
64-
attr_size -= read_count;
48+
retval = -ERANGE;
49+
} else {
50+
iov_iter_truncate(&to, attr_size);
51+
retval = p9_client_read(attr_fid, 0, &to, &err);
52+
if (err)
53+
retval = err;
6554
}
66-
/* Total read xattr bytes */
67-
retval = offset;
68-
error:
69-
if (attr_fid)
70-
p9_client_clunk(attr_fid);
55+
p9_client_clunk(attr_fid);
7156
return retval;
72-
7357
}
7458

7559

include/net/9p/client.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,7 @@ int p9_client_clunk(struct p9_fid *fid);
238238
int p9_client_fsync(struct p9_fid *fid, int datasync);
239239
int p9_client_remove(struct p9_fid *fid);
240240
int p9_client_unlinkat(struct p9_fid *dfid, const char *name, int flags);
241-
int p9_client_read(struct p9_fid *fid, char *data, char __user *udata,
242-
u64 offset, u32 count);
241+
int p9_client_read(struct p9_fid *fid, u64 offset, struct iov_iter *to, int *err);
243242
int p9_client_write(struct p9_fid *fid, u64 offset, struct iov_iter *from, int *err);
244243
int p9_client_readdir(struct p9_fid *fid, char *data, u32 count, u64 offset);
245244
int p9dirent_read(struct p9_client *clnt, char *buf, int len,

0 commit comments

Comments
 (0)