[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