[pnfs] [PATCH] pnfs: change free_layout layout driver api

Benny Halevy bhalevy at panasas.com
Tue Sep 11 19:17:55 EDT 2007


pass (struct pnfs_layout_type **layoutidp) rather than (struct pnfs_layout_type *layoutid)
to free_layout so that layout drivers which manage layout segments
can free *layoutidp when no segments are left; then they should set *layoutidp = NULL;

Signed-off-by: Benny Halevy <bhalevy at panasas.com>
---
 fs/nfs/nfs4filelayout.c   |    6 ++++--
 fs/nfs/pnfs.c             |    3 +--
 include/linux/nfs4_pnfs.h |    2 +-
 3 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c
index 98b222a..6244d6a 100644
--- a/fs/nfs/nfs4filelayout.c
+++ b/fs/nfs/nfs4filelayout.c
@@ -423,18 +423,20 @@ filelayout_alloc_layout(struct pnfs_mount_type * mountid, struct inode * inode)
 /* Free a filelayout layout structure
  */
 void
-filelayout_free_layout(struct pnfs_layout_type * layoutid, struct inode * inode,
+filelayout_free_layout(struct pnfs_layout_type ** layoutidp, struct inode * inode,
                        struct nfs4_pnfs_layout_segment *range)
 {
 	struct nfs4_filelayout* nfslay = NULL;
+	struct pnfs_layout_type *layoutid;
 
 	dprintk("NFS_FILELAYOUT: freeing layout\n");
 
-	if (layoutid)
+	if ((layoutid = *layoutidp))
 		nfslay = (struct nfs4_filelayout*)layoutid->layoutid;
 	if (nfslay != NULL)
 		kfree(nfslay);
 	kfree(layoutid);
+	*layoutidp = NULL;
 }
 
 /* Decode layout and store in layoutid.  Overwrite any existing layout
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 9176ad5..7b70713 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -372,8 +372,7 @@ pnfs_return_layout(struct inode* ino, struct nfs4_pnfs_layout_segment *range)
 
 	if (!status && nfsi->current_layout) {
 		dprintk ("%s: removing layout\n", __FUNCTION__);
-		server->pnfs_curr_ld->ld_io_ops->free_layout(nfsi->current_layout, ino, &arg.lseg);
-		nfsi->current_layout = NULL;
+		server->pnfs_curr_ld->ld_io_ops->free_layout(&nfsi->current_layout, ino, &arg.lseg);
 	}
 
 	dprintk("%s:Exit status %d\n", __FUNCTION__, status);
diff --git a/include/linux/nfs4_pnfs.h b/include/linux/nfs4_pnfs.h
index ab1cbf6..65a7bbc 100644
--- a/include/linux/nfs4_pnfs.h
+++ b/include/linux/nfs4_pnfs.h
@@ -63,7 +63,7 @@ struct layoutdriver_io_operations {
 	 * a set_layout call to set the opaque layout in the layout driver.*/
 	struct pnfs_layout_type* (*alloc_layout) (struct pnfs_mount_type * mountid, struct inode * inode);
 	int (*has_layout) (struct pnfs_layout_type * layoutid, struct inode * inode, struct nfs4_pnfs_layout_segment *range);
-	void (*free_layout) (struct pnfs_layout_type * layoutid, struct inode * inode, struct nfs4_pnfs_layout_segment *range);
+	void (*free_layout) (struct pnfs_layout_type ** layoutid, struct inode * inode, struct nfs4_pnfs_layout_segment *range);
 	struct pnfs_layout_type* (*set_layout) (struct pnfs_layout_type * layoutid, struct inode * inode, struct nfs4_pnfs_layoutget_res *lgr);
 
 	int (*setup_layoutcommit) (struct pnfs_layout_type * layoutid, struct inode * inode, struct pnfs_layoutcommit_arg* arg);
-- 
1.5.3.1



More information about the pNFS mailing list