All of lore.kernel.org
 help / color / mirror / Atom feed
From: Boaz Harrosh <bharrosh@panasas.com>
To: Trond Myklebust <Trond.Myklebust@netapp.com>,
	Benny Halevy <bhalevy@panasas.com>,
	NFS list <linux-nfs@vger.kernel.org>,
	open-osd <osd-dev@open-osd.org>
Cc: Benny Halevy <bhalevy@panasas.com>
Subject: [PATCH 28/32] NFSv4.1: unify pnfs_pageio_init functions
Date: Sun, 29 May 2011 21:27:46 +0300	[thread overview]
Message-ID: <1306693666-8493-1-git-send-email-bharrosh@panasas.com> (raw)
In-Reply-To: <4DE28CFB.4060608@panasas.com>

From: Benny Halevy <bhalevy@panasas.com>

Use common code for pnfs_pageio_init_{read,write} and use
a common generic pg_test function.

Note that this function always assumes the the layout driver's
pg_test method is implemented.

[Fix BUG]
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
Signed-off-by: Benny Halevy <bhalevy@panasas.com>
---
 fs/nfs/pagelist.c |    2 +
 fs/nfs/pnfs.c     |   55 ++++++++++++++--------------------------------------
 fs/nfs/pnfs.h     |   21 +++++++++----------
 fs/nfs/read.c     |    1 -
 fs/nfs/write.c    |    2 -
 5 files changed, 27 insertions(+), 54 deletions(-)

diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c
index c80add6..b8704fe 100644
--- a/fs/nfs/pagelist.c
+++ b/fs/nfs/pagelist.c
@@ -229,6 +229,8 @@ void nfs_pageio_init(struct nfs_pageio_descriptor *desc,
 	desc->pg_ioflags = io_flags;
 	desc->pg_error = 0;
 	desc->pg_lseg = NULL;
+	desc->pg_test = NULL;
+	pnfs_pageio_init(desc, inode);
 }
 
 /**
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 00b1282..568ab0e 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -1043,46 +1043,30 @@ out_forget_reply:
 	goto out;
 }
 
-static int pnfs_read_pg_test(struct nfs_pageio_descriptor *pgio,
-			     struct nfs_page *prev,
-			     struct nfs_page *req)
-{
-	if (pgio->pg_count == prev->wb_bytes) {
-		/* This is first coelesce call for a series of nfs_pages */
-		pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
-						   prev->wb_context,
-						   req_offset(req),
-						   pgio->pg_count,
-						   IOMODE_READ,
-						   GFP_KERNEL);
-	} else if (pgio->pg_lseg &&
-		   req_offset(req) > end_offset(pgio->pg_lseg->pls_range.offset,
-						pgio->pg_lseg->pls_range.length))
-		return 0;
-	return NFS_SERVER(pgio->pg_inode)->pnfs_curr_ld->pg_test(pgio, prev, req);
-}
-
-void
-pnfs_pageio_init_read(struct nfs_pageio_descriptor *pgio, struct inode *inode)
+int
+pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev,
+		     struct nfs_page *req)
 {
-	struct pnfs_layoutdriver_type *ld;
+	enum pnfs_iomode access_type;
+	gfp_t gfp_flags;
 
-	ld = NFS_SERVER(inode)->pnfs_curr_ld;
-	pgio->pg_test = (ld && ld->pg_test) ? pnfs_read_pg_test : NULL;
-}
+	/* We assume that pg_ioflags == 0 iff we're reading a page */
+	if (pgio->pg_ioflags == 0) {
+		access_type = IOMODE_READ;
+		gfp_flags = GFP_KERNEL;
+	} else {
+		access_type = IOMODE_RW;
+		gfp_flags = GFP_NOFS;
+	}
 
-static int pnfs_write_pg_test(struct nfs_pageio_descriptor *pgio,
-			      struct nfs_page *prev,
-			      struct nfs_page *req)
-{
 	if (pgio->pg_count == prev->wb_bytes) {
 		/* This is first coelesce call for a series of nfs_pages */
 		pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
 						   prev->wb_context,
 						   req_offset(req),
 						   pgio->pg_count,
-						   IOMODE_RW,
-						   GFP_NOFS);
+						   access_type,
+						   gfp_flags);
 	} else if (pgio->pg_lseg &&
 		   req_offset(req) > end_offset(pgio->pg_lseg->pls_range.offset,
 						pgio->pg_lseg->pls_range.length))
@@ -1090,15 +1074,6 @@ static int pnfs_write_pg_test(struct nfs_pageio_descriptor *pgio,
 	return NFS_SERVER(pgio->pg_inode)->pnfs_curr_ld->pg_test(pgio, prev, req);
 }
 
-void
-pnfs_pageio_init_write(struct nfs_pageio_descriptor *pgio, struct inode *inode)
-{
-	struct pnfs_layoutdriver_type *ld;
-
-	ld = NFS_SERVER(inode)->pnfs_curr_ld;
-	pgio->pg_test = (ld && ld->pg_test) ? pnfs_write_pg_test : NULL;
-}
-
 /*
  * Called by non rpc-based layout drivers
  */
diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
index 3fda971..c056688 100644
--- a/fs/nfs/pnfs.h
+++ b/fs/nfs/pnfs.h
@@ -158,8 +158,7 @@ enum pnfs_try_status pnfs_try_to_write_data(struct nfs_write_data *,
 					     const struct rpc_call_ops *, int);
 enum pnfs_try_status pnfs_try_to_read_data(struct nfs_read_data *,
 					    const struct rpc_call_ops *);
-void pnfs_pageio_init_read(struct nfs_pageio_descriptor *, struct inode *);
-void pnfs_pageio_init_write(struct nfs_pageio_descriptor *, struct inode *);
+int pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, struct nfs_page *req);
 int pnfs_layout_process(struct nfs4_layoutget *lgp);
 void pnfs_free_lseg_list(struct list_head *tmp_list);
 void pnfs_destroy_layout(struct nfs_inode *);
@@ -293,6 +292,13 @@ static inline int pnfs_return_layout(struct inode *ino)
 	return 0;
 }
 
+static inline void pnfs_pageio_init(struct nfs_pageio_descriptor *pgio,
+				    struct inode *inode)
+{
+	if (NFS_SERVER(inode)->pnfs_curr_ld)
+		pgio->pg_test = pnfs_generic_pg_test;
+}
+
 #else  /* CONFIG_NFS_V4_1 */
 
 static inline void pnfs_destroy_all_layouts(struct nfs_client *clp)
@@ -376,16 +382,9 @@ static inline void unset_pnfs_layoutdriver(struct nfs_server *s)
 {
 }
 
-static inline void
-pnfs_pageio_init_read(struct nfs_pageio_descriptor *pgio, struct inode *ino)
-{
-	pgio->pg_test = NULL;
-}
-
-static inline void
-pnfs_pageio_init_write(struct nfs_pageio_descriptor *pgio, struct inode *ino)
+static inline void pnfs_pageio_init(struct nfs_pageio_descriptor *pgio,
+				    struct inode *inode)
 {
-	pgio->pg_test = NULL;
 }
 
 static inline void
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index 540c8bc..20a7f95 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -664,7 +664,6 @@ int nfs_readpages(struct file *filp, struct address_space *mapping,
 	if (ret == 0)
 		goto read_complete; /* all pages were read */
 
-	pnfs_pageio_init_read(&pgio, inode);
 	if (rsize < PAGE_CACHE_SIZE)
 		nfs_pageio_init(&pgio, inode, nfs_pagein_multi, rsize, 0);
 	else
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index 7edb72f..e268e3b 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -1036,8 +1036,6 @@ static void nfs_pageio_init_write(struct nfs_pageio_descriptor *pgio,
 {
 	size_t wsize = NFS_SERVER(inode)->wsize;
 
-	pnfs_pageio_init_write(pgio, inode);
-
 	if (wsize < PAGE_CACHE_SIZE)
 		nfs_pageio_init(pgio, inode, nfs_flush_multi, wsize, ioflags);
 	else
-- 
1.7.2.3


  parent reply	other threads:[~2011-05-29 18:27 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-05-29 18:14 [PATCHSET final 00/32] pnfs-obj: pnfs-objects layout driver submission Boaz Harrosh
2011-05-29 18:16 ` [PATCH 01/32] NFSv4.1: fix typo in filelayout_check_layout Boaz Harrosh
2011-05-29 18:17 ` [PATCH 02/32] NFSv4.1: use struct nfs_client to qualify deviceid Boaz Harrosh
2011-05-29 18:17 ` [PATCH 03/32] pnfs: resolve header dependency in pnfs.h Boaz Harrosh
2011-05-29 18:18 ` [PATCH 04/32] NFSv4.1: make deviceid cache global Boaz Harrosh
2011-05-29 18:18 ` [PATCH 05/32] NFSv4.1: purge deviceid cache on nfs_free_client Boaz Harrosh
2011-05-29 18:19 ` [PATCH 06/32] pnfs: CB_NOTIFY_DEVICEID Boaz Harrosh
2011-05-29 18:19 ` [PATCH 07/32] NFSv4.1: use layout driver in global device cache Boaz Harrosh
2011-05-29 18:19 ` [PATCH 08/32] SUNRPC: introduce xdr_init_decode_pages Boaz Harrosh
2011-05-29 18:19 ` [PATCH 09/32] pnfs: Use byte-range for layoutget Boaz Harrosh
2011-05-29 18:20 ` [PATCH 10/32] pnfs: align layoutget requests on page boundaries Boaz Harrosh
2011-05-29 18:20 ` [PATCH 11/32] pnfs: Use byte-range for cb_layoutrecall Boaz Harrosh
2011-05-29 18:21 ` [PATCH 12/32] pnfs: client stats Boaz Harrosh
2011-05-29 18:21 ` [PATCH 13/32] pnfs-obj: objlayoutdriver module skeleton Boaz Harrosh
2011-05-29 18:21 ` [PATCH 14/32] pnfs-obj: pnfs_osd XDR definitions Boaz Harrosh
2011-05-29 18:22 ` [PATCH 15/32] pnfs-obj: pnfs_osd XDR client implementation Boaz Harrosh
2011-05-29 18:22 ` [PATCH 16/32] pnfs-obj: decode layout, alloc/free lseg Boaz Harrosh
2011-05-29 18:22 ` [PATCH 17/32] pnfs-obj: objio_osd device information retrieval and caching Boaz Harrosh
2011-05-29 18:23 ` [PATCH 18/32] pnfs: alloc and free layout_hdr layoutdriver methods Boaz Harrosh
2011-05-29 18:23 ` [PATCH 19/32] pnfs-obj: define per-inode private structure Boaz Harrosh
2011-05-29 18:24 ` [PATCH 20/32] pnfs: support for non-rpc layout drivers Boaz Harrosh
2011-05-29 18:25 ` [PATCH 21/32] pnfs-obj: osd raid engine read/write implementation Boaz Harrosh
2011-05-29 18:25 ` [PATCH 22/32] pnfs: layoutreturn Boaz Harrosh
2011-05-29 18:26 ` [PATCH 23/32] pnfs: layoutret_on_setattr Boaz Harrosh
2011-05-29 18:26 ` [PATCH 24/32] pnfs: encode_layoutreturn Boaz Harrosh
2011-05-29 18:26 ` [PATCH 25/32] pnfs-obj: report errors and .encode_layoutreturn Implementation Boaz Harrosh
2011-05-29 18:27 ` [PATCH 26/32] pnfs: encode_layoutcommit Boaz Harrosh
2011-05-29 18:27 ` [PATCH 27/32] pnfs-obj: objlayout_encode_layoutcommit implementation Boaz Harrosh
2011-05-29 18:27 ` Boaz Harrosh [this message]
2011-05-29 18:28 ` [PATCH 29/32] NFSv4.1: change pg_test return type to bool Boaz Harrosh
2011-05-29 18:28 ` [PATCH 30/32] NFSv4.1: use pnfs_generic_pg_test directly by layout driver Boaz Harrosh
2011-05-29 18:29 ` [PATCH 31/32] NFSv4.1: define nfs_generic_pg_test Boaz Harrosh
2011-05-29 18:30 ` [PATCH 32/32] pnfs-obj: pg_test check for max_io_size Boaz Harrosh
2011-05-29 18:36 ` [osd-dev] [PATCHSET final 00/32] pnfs-obj: pnfs-objects layout driver submission Boaz Harrosh
2011-05-31  5:58 ` Benny Halevy
2011-05-31 23:32   ` Jim Rees
2011-06-01 11:55     ` Benny Halevy

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=1306693666-8493-1-git-send-email-bharrosh@panasas.com \
    --to=bharrosh@panasas.com \
    --cc=Trond.Myklebust@netapp.com \
    --cc=bhalevy@panasas.com \
    --cc=linux-nfs@vger.kernel.org \
    --cc=osd-dev@open-osd.org \
    /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.