All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2 vers 2] FlexFiles: too many bytes w/ direct+aio retried read
@ 2016-04-01 15:42 Weston Andros Adamson
  2016-04-01 15:42 ` [PATCH 1/2 vers 2] pnfs: set NFS_IOHDR_REDO in pnfs_read_resend_pnfs Weston Andros Adamson
  2016-04-01 15:42 ` [PATCH 2/2 vers 2] nfs: add debug to directio "good_bytes" counting Weston Andros Adamson
  0 siblings, 2 replies; 3+ messages in thread
From: Weston Andros Adamson @ 2016-04-01 15:42 UTC (permalink / raw)
  To: trond.myklebust; +Cc: linux-nfs, Weston Andros Adamson

vers 2 fixes unused var found by buildbot.

Patch 1 fixes an issue seen when using libaio with directio where if a read
is retried (ie due to recalled layout) we return too many bytes.
Specifically, we returned a multiple of the read size.

To reproduce, run fio with ioengine=libaio and direct=1, then revoke the
active layout. This should hit pretty easily.

Patch 2 should help notice similar issues elsewhere.


Weston Andros Adamson (2):
  pnfs: set NFS_IOHDR_REDO in pnfs_read_resend_pnfs
  nfs: add debug to directio "good_bytes" counting

 fs/nfs/direct.c |  7 +++++--
 fs/nfs/pnfs.c   | 14 ++++++++------
 fs/nfs/pnfs.h   |  2 +-
 3 files changed, 14 insertions(+), 9 deletions(-)

-- 
2.6.4 (Apple Git-63)


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH 1/2 vers 2] pnfs: set NFS_IOHDR_REDO in pnfs_read_resend_pnfs
  2016-04-01 15:42 [PATCH 0/2 vers 2] FlexFiles: too many bytes w/ direct+aio retried read Weston Andros Adamson
@ 2016-04-01 15:42 ` Weston Andros Adamson
  2016-04-01 15:42 ` [PATCH 2/2 vers 2] nfs: add debug to directio "good_bytes" counting Weston Andros Adamson
  1 sibling, 0 replies; 3+ messages in thread
From: Weston Andros Adamson @ 2016-04-01 15:42 UTC (permalink / raw)
  To: trond.myklebust; +Cc: linux-nfs, Weston Andros Adamson

Like other resend paths, mark the (old) hdr as NFS_IOHDR_REDO. This
ensures the hdr completion function will not count the (old) hdr
as good bytes.

Also, vector the error back through the hdr->task.tk_status like other
retry calls.

This fixes a bug with the FlexFiles layout where libaio was reporting more
bytes read than requested.

Signed-off-by: Weston Andros Adamson <dros@primarydata.com>
---
 fs/nfs/pnfs.c | 14 ++++++++------
 fs/nfs/pnfs.h |  2 +-
 2 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 2fa483e6dbe2..15e5a8b3babf 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -2143,12 +2143,15 @@ pnfs_try_to_read_data(struct nfs_pgio_header *hdr,
 }
 
 /* Resend all requests through pnfs. */
-int pnfs_read_resend_pnfs(struct nfs_pgio_header *hdr)
+void pnfs_read_resend_pnfs(struct nfs_pgio_header *hdr)
 {
 	struct nfs_pageio_descriptor pgio;
 
-	nfs_pageio_init_read(&pgio, hdr->inode, false, hdr->completion_ops);
-	return nfs_pageio_resend(&pgio, hdr);
+	if (!test_and_set_bit(NFS_IOHDR_REDO, &hdr->flags)) {
+		nfs_pageio_init_read(&pgio, hdr->inode, false,
+					hdr->completion_ops);
+		hdr->task.tk_status = nfs_pageio_resend(&pgio, hdr);
+	}
 }
 EXPORT_SYMBOL_GPL(pnfs_read_resend_pnfs);
 
@@ -2158,12 +2161,11 @@ pnfs_do_read(struct nfs_pageio_descriptor *desc, struct nfs_pgio_header *hdr)
 	const struct rpc_call_ops *call_ops = desc->pg_rpc_callops;
 	struct pnfs_layout_segment *lseg = desc->pg_lseg;
 	enum pnfs_try_status trypnfs;
-	int err = 0;
 
 	trypnfs = pnfs_try_to_read_data(hdr, call_ops, lseg);
 	if (trypnfs == PNFS_TRY_AGAIN)
-		err = pnfs_read_resend_pnfs(hdr);
-	if (trypnfs == PNFS_NOT_ATTEMPTED || err)
+		pnfs_read_resend_pnfs(hdr);
+	if (trypnfs == PNFS_NOT_ATTEMPTED || hdr->task.tk_status)
 		pnfs_read_through_mds(desc, hdr);
 }
 
diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
index 1ac1db5f6dad..7222d3a35439 100644
--- a/fs/nfs/pnfs.h
+++ b/fs/nfs/pnfs.h
@@ -282,7 +282,7 @@ int _pnfs_return_layout(struct inode *);
 int pnfs_commit_and_return_layout(struct inode *);
 void pnfs_ld_write_done(struct nfs_pgio_header *);
 void pnfs_ld_read_done(struct nfs_pgio_header *);
-int pnfs_read_resend_pnfs(struct nfs_pgio_header *);
+void pnfs_read_resend_pnfs(struct nfs_pgio_header *);
 struct pnfs_layout_segment *pnfs_update_layout(struct inode *ino,
 					       struct nfs_open_context *ctx,
 					       loff_t pos,
-- 
2.6.4 (Apple Git-63)


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH 2/2 vers 2] nfs: add debug to directio "good_bytes" counting
  2016-04-01 15:42 [PATCH 0/2 vers 2] FlexFiles: too many bytes w/ direct+aio retried read Weston Andros Adamson
  2016-04-01 15:42 ` [PATCH 1/2 vers 2] pnfs: set NFS_IOHDR_REDO in pnfs_read_resend_pnfs Weston Andros Adamson
@ 2016-04-01 15:42 ` Weston Andros Adamson
  1 sibling, 0 replies; 3+ messages in thread
From: Weston Andros Adamson @ 2016-04-01 15:42 UTC (permalink / raw)
  To: trond.myklebust; +Cc: linux-nfs, Weston Andros Adamson

This will pop a warning if we count too many good bytes.

Signed-off-by: Weston Andros Adamson <dros@primarydata.com>
---
 fs/nfs/direct.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
index 7a0cfd3266e5..5a31f2928530 100644
--- a/fs/nfs/direct.c
+++ b/fs/nfs/direct.c
@@ -87,6 +87,7 @@ struct nfs_direct_req {
 	int			mirror_count;
 
 	ssize_t			count,		/* bytes actually processed */
+				max_count,	/* max expected count */
 				bytes_left,	/* bytes left to be sent */
 				io_start,	/* start of IO */
 				error;		/* any reported error */
@@ -123,6 +124,8 @@ nfs_direct_good_bytes(struct nfs_direct_req *dreq, struct nfs_pgio_header *hdr)
 	int i;
 	ssize_t count;
 
+	WARN_ON_ONCE(dreq->count >= dreq->max_count);
+
 	if (dreq->mirror_count == 1) {
 		dreq->mirrors[hdr->pgio_mirror_idx].count += hdr->good_bytes;
 		dreq->count += hdr->good_bytes;
@@ -593,7 +596,7 @@ ssize_t nfs_file_direct_read(struct kiocb *iocb, struct iov_iter *iter,
 		goto out_unlock;
 
 	dreq->inode = inode;
-	dreq->bytes_left = count;
+	dreq->bytes_left = dreq->max_count = count;
 	dreq->io_start = pos;
 	dreq->ctx = get_nfs_open_context(nfs_file_open_context(iocb->ki_filp));
 	l_ctx = nfs_get_lock_context(dreq->ctx);
@@ -1026,7 +1029,7 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter)
 		goto out_unlock;
 
 	dreq->inode = inode;
-	dreq->bytes_left = iov_iter_count(iter);
+	dreq->bytes_left = dreq->max_count = iov_iter_count(iter);
 	dreq->io_start = pos;
 	dreq->ctx = get_nfs_open_context(nfs_file_open_context(iocb->ki_filp));
 	l_ctx = nfs_get_lock_context(dreq->ctx);
-- 
2.6.4 (Apple Git-63)


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2016-04-01 15:42 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-04-01 15:42 [PATCH 0/2 vers 2] FlexFiles: too many bytes w/ direct+aio retried read Weston Andros Adamson
2016-04-01 15:42 ` [PATCH 1/2 vers 2] pnfs: set NFS_IOHDR_REDO in pnfs_read_resend_pnfs Weston Andros Adamson
2016-04-01 15:42 ` [PATCH 2/2 vers 2] nfs: add debug to directio "good_bytes" counting Weston Andros Adamson

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.