Commit e14679b6 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag '9p-for-5.7' of git://github.com/martinetd/linux

Pull 9p updates from Dominique Martinet:
 "Not much new, but a few patches for this cycle:

   - Fix read with O_NONBLOCK to allow incomplete read and return
     immediately

   - Rest is just cleanup (indent, unused field in struct, extra
     semicolon)"

* tag '9p-for-5.7' of git://github.com/martinetd/linux:
  net/9p: remove unused p9_req_t aux field
  9p: read only once on O_NONBLOCK
  9pnet: allow making incomplete read requests
  9p: Remove unneeded semicolon
  9p: Fix Kconfig indentation
parents 77a73eec 43657496
...@@ -388,6 +388,9 @@ v9fs_file_read_iter(struct kiocb *iocb, struct iov_iter *to) ...@@ -388,6 +388,9 @@ v9fs_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
p9_debug(P9_DEBUG_VFS, "count %zu offset %lld\n", p9_debug(P9_DEBUG_VFS, "count %zu offset %lld\n",
iov_iter_count(to), iocb->ki_pos); iov_iter_count(to), iocb->ki_pos);
if (iocb->ki_filp->f_flags & O_NONBLOCK)
ret = p9_client_read_once(fid, iocb->ki_pos, to, &err);
else
ret = p9_client_read(fid, iocb->ki_pos, to, &err); ret = p9_client_read(fid, iocb->ki_pos, to, &err);
if (!ret) if (!ret)
return err; return err;
......
...@@ -143,7 +143,7 @@ static umode_t p9mode2unixmode(struct v9fs_session_info *v9ses, ...@@ -143,7 +143,7 @@ static umode_t p9mode2unixmode(struct v9fs_session_info *v9ses,
default: default:
p9_debug(P9_DEBUG_ERROR, "Unknown special type %c %s\n", p9_debug(P9_DEBUG_ERROR, "Unknown special type %c %s\n",
type, stat->extension); type, stat->extension);
}; }
*rdev = MKDEV(major, minor); *rdev = MKDEV(major, minor);
} else } else
res |= S_IFREG; res |= S_IFREG;
......
...@@ -73,7 +73,6 @@ enum p9_req_status_t { ...@@ -73,7 +73,6 @@ enum p9_req_status_t {
* @wq: wait_queue for the client to block on for this request * @wq: wait_queue for the client to block on for this request
* @tc: the request fcall structure * @tc: the request fcall structure
* @rc: the response fcall structure * @rc: the response fcall structure
* @aux: transport specific data (provided for trans_fd migration)
* @req_list: link for higher level objects to chain requests * @req_list: link for higher level objects to chain requests
*/ */
struct p9_req_t { struct p9_req_t {
...@@ -83,7 +82,6 @@ struct p9_req_t { ...@@ -83,7 +82,6 @@ struct p9_req_t {
wait_queue_head_t wq; wait_queue_head_t wq;
struct p9_fcall tc; struct p9_fcall tc;
struct p9_fcall rc; struct p9_fcall rc;
void *aux;
struct list_head req_list; struct list_head req_list;
}; };
...@@ -200,6 +198,8 @@ int p9_client_fsync(struct p9_fid *fid, int datasync); ...@@ -200,6 +198,8 @@ int p9_client_fsync(struct p9_fid *fid, int datasync);
int p9_client_remove(struct p9_fid *fid); int p9_client_remove(struct p9_fid *fid);
int p9_client_unlinkat(struct p9_fid *dfid, const char *name, int flags); int p9_client_unlinkat(struct p9_fid *dfid, const char *name, int flags);
int p9_client_read(struct p9_fid *fid, u64 offset, struct iov_iter *to, int *err); int p9_client_read(struct p9_fid *fid, u64 offset, struct iov_iter *to, int *err);
int p9_client_read_once(struct p9_fid *fid, u64 offset, struct iov_iter *to,
int *err);
int p9_client_write(struct p9_fid *fid, u64 offset, struct iov_iter *from, int *err); int p9_client_write(struct p9_fid *fid, u64 offset, struct iov_iter *from, int *err);
int p9_client_readdir(struct p9_fid *fid, char *data, u32 count, u64 offset); int p9_client_readdir(struct p9_fid *fid, char *data, u32 count, u64 offset);
int p9dirent_read(struct p9_client *clnt, char *buf, int len, int p9dirent_read(struct p9_client *clnt, char *buf, int len,
......
...@@ -1549,21 +1549,38 @@ EXPORT_SYMBOL(p9_client_unlinkat); ...@@ -1549,21 +1549,38 @@ EXPORT_SYMBOL(p9_client_unlinkat);
int int
p9_client_read(struct p9_fid *fid, u64 offset, struct iov_iter *to, int *err) p9_client_read(struct p9_fid *fid, u64 offset, struct iov_iter *to, int *err)
{ {
struct p9_client *clnt = fid->clnt;
struct p9_req_t *req;
int total = 0; int total = 0;
*err = 0; *err = 0;
p9_debug(P9_DEBUG_9P, ">>> TREAD fid %d offset %llu %d\n",
fid->fid, (unsigned long long) offset, (int)iov_iter_count(to));
while (iov_iter_count(to)) { while (iov_iter_count(to)) {
int count;
count = p9_client_read_once(fid, offset, to, err);
if (!count || *err)
break;
offset += count;
total += count;
}
return total;
}
EXPORT_SYMBOL(p9_client_read);
int
p9_client_read_once(struct p9_fid *fid, u64 offset, struct iov_iter *to,
int *err)
{
struct p9_client *clnt = fid->clnt;
struct p9_req_t *req;
int count = iov_iter_count(to); int count = iov_iter_count(to);
int rsize, non_zc = 0; int rsize, non_zc = 0;
char *dataptr; char *dataptr;
*err = 0;
p9_debug(P9_DEBUG_9P, ">>> TREAD fid %d offset %llu %d\n",
fid->fid, (unsigned long long) offset, (int)iov_iter_count(to));
rsize = fid->iounit; rsize = fid->iounit;
if (!rsize || rsize > clnt->msize-P9_IOHDRSZ) if (!rsize || rsize > clnt->msize - P9_IOHDRSZ)
rsize = clnt->msize - P9_IOHDRSZ; rsize = clnt->msize - P9_IOHDRSZ;
if (count < rsize) if (count < rsize)
...@@ -1571,8 +1588,7 @@ p9_client_read(struct p9_fid *fid, u64 offset, struct iov_iter *to, int *err) ...@@ -1571,8 +1588,7 @@ p9_client_read(struct p9_fid *fid, u64 offset, struct iov_iter *to, int *err)
/* Don't bother zerocopy for small IO (< 1024) */ /* Don't bother zerocopy for small IO (< 1024) */
if (clnt->trans_mod->zc_request && rsize > 1024) { if (clnt->trans_mod->zc_request && rsize > 1024) {
/* /* response header len is 11
* response header len is 11
* PDU Header(7) + IO Size (4) * PDU Header(7) + IO Size (4)
*/ */
req = p9_client_zc_rpc(clnt, P9_TREAD, to, NULL, rsize, req = p9_client_zc_rpc(clnt, P9_TREAD, to, NULL, rsize,
...@@ -1585,7 +1601,7 @@ p9_client_read(struct p9_fid *fid, u64 offset, struct iov_iter *to, int *err) ...@@ -1585,7 +1601,7 @@ p9_client_read(struct p9_fid *fid, u64 offset, struct iov_iter *to, int *err)
} }
if (IS_ERR(req)) { if (IS_ERR(req)) {
*err = PTR_ERR(req); *err = PTR_ERR(req);
break; return 0;
} }
*err = p9pdu_readf(&req->rc, clnt->proto_version, *err = p9pdu_readf(&req->rc, clnt->proto_version,
...@@ -1593,7 +1609,7 @@ p9_client_read(struct p9_fid *fid, u64 offset, struct iov_iter *to, int *err) ...@@ -1593,7 +1609,7 @@ p9_client_read(struct p9_fid *fid, u64 offset, struct iov_iter *to, int *err)
if (*err) { if (*err) {
trace_9p_protocol_dump(clnt, &req->rc); trace_9p_protocol_dump(clnt, &req->rc);
p9_tag_remove(clnt, req); p9_tag_remove(clnt, req);
break; return 0;
} }
if (rsize < count) { if (rsize < count) {
pr_err("bogus RREAD count (%d > %d)\n", count, rsize); pr_err("bogus RREAD count (%d > %d)\n", count, rsize);
...@@ -1603,28 +1619,24 @@ p9_client_read(struct p9_fid *fid, u64 offset, struct iov_iter *to, int *err) ...@@ -1603,28 +1619,24 @@ p9_client_read(struct p9_fid *fid, u64 offset, struct iov_iter *to, int *err)
p9_debug(P9_DEBUG_9P, "<<< RREAD count %d\n", count); p9_debug(P9_DEBUG_9P, "<<< RREAD count %d\n", count);
if (!count) { if (!count) {
p9_tag_remove(clnt, req); p9_tag_remove(clnt, req);
break; return 0;
} }
if (non_zc) { if (non_zc) {
int n = copy_to_iter(dataptr, count, to); int n = copy_to_iter(dataptr, count, to);
total += n;
offset += n;
if (n != count) { if (n != count) {
*err = -EFAULT; *err = -EFAULT;
p9_tag_remove(clnt, req); p9_tag_remove(clnt, req);
break; return n;
} }
} else { } else {
iov_iter_advance(to, count); iov_iter_advance(to, count);
total += count;
offset += count;
} }
p9_tag_remove(clnt, req); p9_tag_remove(clnt, req);
} return count;
return total;
} }
EXPORT_SYMBOL(p9_client_read); EXPORT_SYMBOL(p9_client_read_once);
int int
p9_client_write(struct p9_fid *fid, u64 offset, struct iov_iter *from, int *err) p9_client_write(struct p9_fid *fid, u64 offset, struct iov_iter *from, int *err)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment