Commit e14679b6 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

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
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -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",
		 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);
	if (!ret)
		return err;
+1 −1
Original line number Diff line number Diff line
@@ -143,7 +143,7 @@ static umode_t p9mode2unixmode(struct v9fs_session_info *v9ses,
		default:
			p9_debug(P9_DEBUG_ERROR, "Unknown special type %c %s\n",
				 type, stat->extension);
		};
		}
		*rdev = MKDEV(major, minor);
	} else
		res |= S_IFREG;
+2 −2
Original line number Diff line number Diff line
@@ -73,7 +73,6 @@ enum p9_req_status_t {
 * @wq: wait_queue for the client to block on for this request
 * @tc: the request 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
 */
struct p9_req_t {
@@ -83,7 +82,6 @@ struct p9_req_t {
	wait_queue_head_t wq;
	struct p9_fcall tc;
	struct p9_fcall rc;
	void *aux;
	struct list_head req_list;
};

@@ -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_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_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_readdir(struct p9_fid *fid, char *data, u32 count, u64 offset);
int p9dirent_read(struct p9_client *clnt, char *buf, int len,
+73 −61
Original line number Diff line number Diff line
@@ -1549,19 +1549,36 @@ EXPORT_SYMBOL(p9_client_unlinkat);
int
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;
	*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)) {
		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 rsize, non_zc = 0;
	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;
	if (!rsize || rsize > clnt->msize - P9_IOHDRSZ)
		rsize = clnt->msize - P9_IOHDRSZ;
@@ -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) */
	if (clnt->trans_mod->zc_request && rsize > 1024) {
			/*
			 * response header len is 11
		/* response header len is 11
		 * PDU Header(7) + IO Size (4)
		 */
		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)
	}
	if (IS_ERR(req)) {
		*err = PTR_ERR(req);
			break;
		return 0;
	}

	*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)
	if (*err) {
		trace_9p_protocol_dump(clnt, &req->rc);
		p9_tag_remove(clnt, req);
			break;
		return 0;
	}
	if (rsize < count) {
		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)
	p9_debug(P9_DEBUG_9P, "<<< RREAD count %d\n", count);
	if (!count) {
		p9_tag_remove(clnt, req);
			break;
		return 0;
	}

	if (non_zc) {
		int n = copy_to_iter(dataptr, count, to);
			total += n;
			offset += n;

		if (n != count) {
			*err = -EFAULT;
			p9_tag_remove(clnt, req);
				break;
			return n;
		}
	} else {
		iov_iter_advance(to, count);
			total += count;
			offset += count;
	}
	p9_tag_remove(clnt, req);
	return count;
}
	return total;
}
EXPORT_SYMBOL(p9_client_read);
EXPORT_SYMBOL(p9_client_read_once);

int
p9_client_write(struct p9_fid *fid, u64 offset, struct iov_iter *from, int *err)
+10 −10

File changed.

Contains only whitespace changes.