[pnfs] [PATCH 2/5] pnfs: Only execute a layoutreturn if necessary.

Benny Halevy bhalevy at panasas.com
Wed May 7 16:23:52 EDT 2008


On May. 06, 2008, 16:45 -0700, Dean Hildebrand <seattleplus at gmail.com> wrote:
> Signed-off-by: Dean Hildebrand <dhildeb at us.ibm.com>
> ---
>  fs/nfs/pnfs.c |    8 ++++++--
>  1 files changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
> index a17d2ba..27e37be 100644
> --- a/fs/nfs/pnfs.c
> +++ b/fs/nfs/pnfs.c
> @@ -562,15 +562,19 @@ out:
>  
>  int
>  pnfs_return_layout(struct inode *ino, struct nfs4_pnfs_layout_segment *range,
> -		enum pnfs_layoutrecall_type type)
> +		   enum pnfs_layoutrecall_type type)
>  {
>  	struct pnfs_layout_type *lo;
>  	struct nfs_inode *nfsi = NFS_I(ino);
> +	struct nfs_server *nfss = NFS_SERVER(ino);
>  	struct nfs4_pnfs_layout_segment arg;
> -	int status;
> +	int status = 0;
>  
>  	dprintk("--> %s\n", __func__);
>  
> +	if (!pnfs_enabled_sb(nfss)  || !nfsi->current_layout)
> +		goto out;

the current_layout check is valid (and is an optimization)
only if type == RECALL_FILE.

> +
>  	if (range)
>  		arg = *range;
>  	else {

I suggest that we also make pnfs_return_layout inline
and do the quick checks in the inline wrapper.  This
way we don't need to ifdef it in some call sites.

Here's a cumulative of two patches in my tree:
The first inlines pnfs_enabled_sb and the second -
pnfs_return_layout

Benny

diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
index 94a5240..52c7443 100644
--- a/fs/nfs/inode.c
+++ b/fs/nfs/inode.c
@@ -1159,9 +1159,7 @@ void nfs4_clear_inode(struct inode *inode)
 	nfs_inode_return_delegation_noreclaim(inode);
 	/* First call standard NFS clear_inode() code */
 	nfs_clear_inode(inode);
-#ifdef CONFIG_PNFS
 	pnfs_return_layout(inode, NULL, RECALL_FILE);
-#endif /* CONFIG_PNFS */
 }
 #endif
 
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index f49eb38..d3045db 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -561,8 +561,8 @@ out:
 }
 
 int
-pnfs_return_layout(struct inode *ino, struct nfs4_pnfs_layout_segment *range,
-		enum pnfs_layoutrecall_type type)
+_pnfs_return_layout(struct inode *ino, struct nfs4_pnfs_layout_segment *range,
+		    enum pnfs_layoutrecall_type type)
 {
 	struct pnfs_layout_type *lo;
 	struct nfs_inode *nfsi = NFS_I(ino);
@@ -990,16 +990,6 @@ get_out:
 	return;
 }
 
-/* Return true if a layout driver is being used for this mountpoint */
-int
-pnfs_enabled_sb(struct nfs_server *nfss)
-{
-	if (!nfss->pnfs_curr_ld)
-		return 0;
-
-	return 1;
-}
-
 size_t
 pnfs_getthreshold(struct inode *inode, int iswrite)
 {
diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
index acbce4b..6ae238f 100644
--- a/fs/nfs/pnfs.h
+++ b/fs/nfs/pnfs.h
@@ -28,9 +28,8 @@ int pnfs_update_layout(struct inode *ino, struct nfs_open_context *ctx,
 	size_t count, loff_t pos, enum pnfs_iomode access_type,
 	struct pnfs_layout_segment **lsegpp);
 
-int pnfs_return_layout(struct inode *, struct nfs4_pnfs_layout_segment *,
-		       enum pnfs_layoutrecall_type);
-int pnfs_return_layout_rpc(struct nfs_server *server, struct nfs4_pnfs_layoutreturn_arg *argp);
+int _pnfs_return_layout(struct inode *, struct nfs4_pnfs_layout_segment *,
+			enum pnfs_layoutrecall_type);
 void set_pnfs_layoutdriver(struct super_block *sb, struct nfs_fh *fh, u32 id);
 void unmount_pnfs_layoutdriver(struct super_block *sb);
 int pnfs_use_read(struct inode *inode, ssize_t count);
@@ -45,7 +44,6 @@ void pnfs_layoutcommit_done(struct pnfs_layoutcommit_data *data, int status);
 int pnfs_layoutcommit_inode(struct inode *inode, int sync);
 void pnfs_update_last_write(struct nfs_inode *nfsi, loff_t offset, size_t extent);
 void pnfs_need_layoutcommit(struct nfs_inode *nfsi, struct nfs_open_context *ctx);
-int pnfs_enabled_sb(struct nfs_server *nfss);
 unsigned int pnfs_getiosize(struct nfs_server *server);
 void pnfs_set_ds_iosize(struct nfs_server *server);
 int pnfs_commit(struct nfs_write_data *data, int sync);
@@ -77,6 +75,12 @@ void _pnfs_modify_new_write_request(struct nfs_page *req,
 				     (srv)->pnfs_curr_ld->ld_policy_ops && \
 				     (srv)->pnfs_curr_ld->ld_policy_ops->opname)
 
+/* Return true if a layout driver is being used for this mountpoint */
+static inline int pnfs_enabled_sb(struct nfs_server *nfss)
+{
+	return nfss->pnfs_curr_ld != NULL;
+}
+
 static inline int pnfs_try_to_read_data(struct nfs_read_data *data,
 					const struct rpc_call_ops *call_ops)
 {
@@ -181,6 +185,20 @@ static inline void pnfs_modify_new_request(struct nfs_page *req,
 	/* Should we do something (like set PG_USE_PNFS) if !fsdata ? */
 }
 
+static inline int pnfs_return_layout(struct inode *ino,
+				     struct nfs4_pnfs_layout_segment *lseg,
+				     enum pnfs_layoutrecall_type type)
+{
+	struct nfs_inode *nfsi = NFS_I(ino);
+	struct nfs_server *nfss = NFS_SERVER(ino);
+
+	if (pnfs_enabled_sb(nfss) &&
+	    (nfsi->current_layout || type != RECALL_FILE))
+		return _pnfs_return_layout(ino, lseg, type);
+
+	return 0;
+}
+
 #else  /* CONFIG_PNFS */
 
 static inline int pnfs_try_to_read_data(struct nfs_read_data *data,
@@ -232,6 +250,13 @@ static inline void pnfs_modify_new_request(struct nfs_page *req,
 {
 }
 
+static inline int pnfs_return_layout(struct inode *ino,
+				     struct nfs4_pnfs_layout_segment *lseg,
+				     enum pnfs_layoutrecall_type type);
+{
+	return 0;
+}
+
 #endif /* CONFIG_PNFS */
 
 #endif /* FS_NFS_PNFS_H */



More information about the pNFS mailing list