All of lore.kernel.org
 help / color / mirror / Atom feed
From: Weston Andros Adamson <dros@primarydata.com>
To: trond.myklebust@primarydata.com
Cc: linux-nfs@vger.kernel.org, Weston Andros Adamson <dros@primarydata.com>
Subject: [PATCH 12/18 v2] nfs: chain calls to pg_test
Date: Thu, 24 Apr 2014 14:15:22 -0400	[thread overview]
Message-ID: <1398363328-7100-13-git-send-email-dros@primarydata.com> (raw)
In-Reply-To: <1398363328-7100-1-git-send-email-dros@primarydata.com>

Now that pg_test can change the size of the request (by returning a non-zero
size smaller than the request), pg_test functions that call other
pg_test functions must return the minimum of the result - or 0 if any fail.

Also clean up the logic of some pg_test functions so that all checks are
for contitions where coalescing is not possible.

Signed-off-by: Weston Andros Adamson <dros@primarydata.com>
---
 fs/nfs/nfs4filelayout.c      | 27 ++++++++++++++-------------
 fs/nfs/objlayout/objio_osd.c |  9 ++++++---
 fs/nfs/pnfs.c                | 15 ++++++++++-----
 3 files changed, 30 insertions(+), 21 deletions(-)

diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c
index 9cea935..7a665e0 100644
--- a/fs/nfs/nfs4filelayout.c
+++ b/fs/nfs/nfs4filelayout.c
@@ -928,26 +928,27 @@ static size_t
 filelayout_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev,
 		   struct nfs_page *req)
 {
+	unsigned int size;
 	u64 p_stripe, r_stripe;
 	u32 stripe_unit;
 
-	if (!pnfs_generic_pg_test(pgio, prev, req) ||
-	    !nfs_generic_pg_test(pgio, prev, req))
+	/* calls nfs_generic_pg_test */
+	size = pnfs_generic_pg_test(pgio, prev, req);
+	if (!size)
 		return 0;
 
-	if (!prev)
-		return req->wb_bytes;
+	if (prev) {
+		p_stripe = (u64)req_offset(prev);
+		r_stripe = (u64)req_offset(req);
+		stripe_unit = FILELAYOUT_LSEG(pgio->pg_lseg)->stripe_unit;
 
-	p_stripe = (u64)req_offset(prev);
-	r_stripe = (u64)req_offset(req);
-	stripe_unit = FILELAYOUT_LSEG(pgio->pg_lseg)->stripe_unit;
+		do_div(p_stripe, stripe_unit);
+		do_div(r_stripe, stripe_unit);
 
-	do_div(p_stripe, stripe_unit);
-	do_div(r_stripe, stripe_unit);
-
-	if (p_stripe == r_stripe)
-		return req->wb_bytes;
-	return 0;
+		if (p_stripe != r_stripe)
+			return 0;
+	}
+	return min(size, req->wb_bytes);
 }
 
 static void
diff --git a/fs/nfs/objlayout/objio_osd.c b/fs/nfs/objlayout/objio_osd.c
index 71b9c69..6113207 100644
--- a/fs/nfs/objlayout/objio_osd.c
+++ b/fs/nfs/objlayout/objio_osd.c
@@ -571,12 +571,15 @@ int objio_write_pagelist(struct nfs_pgio_data *wdata, int how)
 static size_t objio_pg_test(struct nfs_pageio_descriptor *pgio,
 			  struct nfs_page *prev, struct nfs_page *req)
 {
-	if (!pnfs_generic_pg_test(pgio, prev, req) ||
-	    pgio->pg_count + req->wb_bytes >
+	unsigned int size;
+
+	size = pnfs_generic_pg_test(pgio, prev, req);
+
+	if (!size || pgio->pg_count + req->wb_bytes >
 	    (unsigned long)pgio->pg_layout_private)
 		return 0;
 
-	return req->wb_bytes;
+	return min(size, req->wb_bytes);
 }
 
 static void objio_init_read(struct nfs_pageio_descriptor *pgio, struct nfs_page *req)
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index de6eb16..354c53c 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -1442,8 +1442,12 @@ size_t
 pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev,
 		     struct nfs_page *req)
 {
-	if (pgio->pg_lseg == NULL)
-		return nfs_generic_pg_test(pgio, prev, req);
+	unsigned int size;
+
+	size = nfs_generic_pg_test(pgio, prev, req);
+
+	if (!size)
+		return 0;
 
 	/*
 	 * Test if a nfs_page is fully contained in the pnfs_layout_range.
@@ -1459,10 +1463,11 @@ pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev,
 	 * first byte that lies outside the pnfs_layout_range. FIXME?
 	 *
 	 */
-	if (req_offset(req) < end_offset(pgio->pg_lseg->pls_range.offset,
+	if (req_offset(req) >= end_offset(pgio->pg_lseg->pls_range.offset,
 					 pgio->pg_lseg->pls_range.length))
-		return req->wb_bytes;
-	return 0;
+		return 0;
+
+	return min(size, req->wb_bytes);
 }
 EXPORT_SYMBOL_GPL(pnfs_generic_pg_test);
 
-- 
1.8.5.2 (Apple Git-48)


  parent reply	other threads:[~2014-04-24 18:15 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-24 18:15 [PATCH 00/18 v2] nfs: support multiple requests per page Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 01/18 v2] pnfs: fix race in filelayout commit path Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 02/18 v2] nfs: clean up PG_* flags Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 03/18 v2] nfs: remove unused arg from nfs_create_request Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 04/18 v2] nfs: modify pg_test interface to return size_t Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 05/18 v2] nfs: call nfs_can_coalesce_requests for every req Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 06/18 v2] nfs: add support for multiple nfs reqs per page Weston Andros Adamson
2014-04-24 20:49   ` Anna Schumaker
2014-04-24 21:03     ` Anna Schumaker
2014-04-24 23:06       ` Weston Andros Adamson
2014-04-25 13:32         ` Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 07/18 v2] nfs: page group syncing in read path Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 08/18 v2] nfs: page group syncing in write path Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 09/18 v2] nfs: page group support in nfs_mark_uptodate Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 10/18 v2] pnfs: clean up filelayout_alloc_commit_info Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 11/18 v2] nfs: allow coalescing of subpage requests Weston Andros Adamson
2014-04-24 18:15 ` Weston Andros Adamson [this message]
2014-04-24 18:15 ` [PATCH 13/18 v2] nfs: use > 1 request to handle bsize < PAGE_SIZE Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 14/18 v2] nfs: remove list of [rw]data from pgio header Weston Andros Adamson
2014-04-25 13:56   ` Anna Schumaker
2014-04-25 13:58     ` Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 15/18 v2] pnfs: support multiple verfs per direct req Weston Andros Adamson
2014-04-25 14:15   ` Anna Schumaker
2014-04-25 15:12     ` Weston Andros Adamson
2014-04-25 15:38       ` Weston Andros Adamson
2014-04-25 15:53         ` Anna Schumaker
2014-04-25 16:04           ` Weston Andros Adamson
2014-04-25 17:22             ` Anna Schumaker
2014-04-24 18:15 ` [PATCH 16/18 v2] pnfs: allow non page aligned pnfs layout segments Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 17/18 v2] pnfs: filelayout: support non page aligned layouts Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 18/18 v2] nfs: support page groups in nfs_read_completion Weston Andros Adamson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1398363328-7100-13-git-send-email-dros@primarydata.com \
    --to=dros@primarydata.com \
    --cc=linux-nfs@vger.kernel.org \
    --cc=trond.myklebust@primarydata.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.