[pnfs] CVS: nfsv4

Benny Halevy Panasas bhalevy at citi.umich.edu
Tue Dec 12 05:02:59 EST 2006


CVSROOT:	/cvs
Module name:	nfsv4
Changes by:	bhalevy at citi.	2006/12/12 05:02:59

Modified files:
	cvs/pnfs/fs/nfs: nfs4state.c nfs4xdr.c pnfs.c 
	cvs/pnfs/fs/nfsd: nfs4xdr.c 
	cvs/pnfs/include/linux: nfs4_pnfs.h pnfs_xdr.h 
	cvs/pnfs/include/linux/nfsd: nfsd4_pnfs.h 

Log message:
- Add the return_on_close flag to the layout_get results structure
- Save a return_on_close iomode in the pnfs_layout_type structure
- Return the layout before sending a close operation (currently for any iomode)

Signed-off-by: Benny Halevy bhalevy at panasas.com

Index: fs/nfs/nfs4state.c
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfs/nfs4state.c,v
retrieving revision 1.2
diff -u -p -r1.2 nfs4state.c
--- fs/nfs/nfs4state.c	12 Dec 2006 09:03:51 -0000	1.2
+++ fs/nfs/nfs4state.c	12 Dec 2006 10:01:37 -0000
@@ -42,6 +42,7 @@
#include <linux/slab.h>
#include <linux/smp_lock.h>
#include <linux/nfs_fs.h>
+#include <linux/nfs4_pnfs.h>
#include <linux/nfs_idmap.h>
#include <linux/kthread.h>
#include <linux/module.h>
@@ -515,6 +516,11 @@ void nfs4_close_state(struct nfs4_state
if (pnfs_enabled_sb(NFS_SERVER(inode))) {
if (NFS_I(inode)->layoutcommit_ctx) {
pnfs_layoutcommit_inode(inode, 0);
+			}
+			/* TODO: make finer grained returns here */
+			if (NFS_I(inode)->current_layout &&
+			    NFS_I(inode)->current_layout->roc_iomode) {
+				pnfs_return_layout(inode);
}
}
if (nfs4_do_close(inode, state) == 0)
Index: fs/nfs/nfs4xdr.c
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfs/nfs4xdr.c,v
retrieving revision 1.24
diff -u -p -r1.24 nfs4xdr.c
--- fs/nfs/nfs4xdr.c	12 Dec 2006 09:43:42 -0000	1.24
+++ fs/nfs/nfs4xdr.c	12 Dec 2006 10:01:41 -0000
@@ -4642,7 +4642,8 @@ static int decode_pnfs_layoutget(struct
status = decode_op_hdr(xdr, OP_LAYOUTGET);
if (status)
return status;
-	READ_BUF(28);
+	READ_BUF(32);
+	READ32(res->return_on_close);
READ64(res->offset);
READ64(res->length);
READ32(res->iomode);
Index: fs/nfs/pnfs.c
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfs/pnfs.c,v
retrieving revision 1.48
diff -u -p -r1.48 pnfs.c
--- fs/nfs/pnfs.c	12 Dec 2006 09:53:17 -0000	1.48
+++ fs/nfs/pnfs.c	12 Dec 2006 10:01:43 -0000
@@ -455,9 +455,15 @@ virtual_update_layout(struct inode* ino,
printk("%s: ERROR!  Could not inject layout (%d)\n",__FUNCTION__,result);
result =  -EIO;
goto out;
-	} else {
-		nfsi->current_layout = layout_new;
}
+
+	if (res.return_on_close) {
+		layout_new->roc_iomode = res.iomode;
+		if (!layout_new->roc_iomode) {
+			layout_new->roc_iomode = IOMODE_ANY;
+		}
+	}
+	nfsi->current_layout = layout_new;

result = 0;
out:
Index: fs/nfsd/nfs4xdr.c
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfsd/nfs4xdr.c,v
retrieving revision 1.30
diff -u -p -r1.30 nfs4xdr.c
--- fs/nfsd/nfs4xdr.c	12 Dec 2006 09:43:43 -0000	1.30
+++ fs/nfsd/nfs4xdr.c	12 Dec 2006 10:01:45 -0000
@@ -2781,7 +2781,8 @@ nfsd4_encode_getdevinfo(struct nfsd4_com
}
}

-/* LAYOUTGET: minorversion1-01.txt
+/* LAYOUTGET: minorversion1-08.txt
+u32            bool                    logr_return_on_close;
u64            offset4                 offset;
u64            length4                 length;
u32            pnfs_layoutiomode4      iomode;
@@ -2795,7 +2796,8 @@ nfsd4_encode_layoutget(struct nfsd4_comp
ENCODE_HEAD;

if (!nfserr) {
-		RESERVE_SPACE(28);
+		RESERVE_SPACE(32);
+		WRITE32(lgp->lg_return_on_close);
WRITE64(lgp->lg_offset);
WRITE64(lgp->lg_length);
WRITE32(lgp->lg_iomode);
Index: include/linux/nfs4_pnfs.h
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/include/linux/nfs4_pnfs.h,v
retrieving revision 1.12
diff -u -p -r1.12 nfs4_pnfs.h
--- include/linux/nfs4_pnfs.h	24 Aug 2006 17:34:51 -0000	1.12
+++ include/linux/nfs4_pnfs.h	12 Dec 2006 10:01:45 -0000
@@ -29,6 +29,7 @@ struct pnfs_mount_type {
struct pnfs_layout_type {
struct pnfs_mount_type* mountid;
void* layoutid;
+	int roc_iomode;	/* iomode to return on close, 0=none */
};

/* Layout driver I/O operations.
Index: include/linux/pnfs_xdr.h
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/include/linux/pnfs_xdr.h,v
retrieving revision 1.13
diff -u -p -r1.13 pnfs_xdr.h
--- include/linux/pnfs_xdr.h	12 Dec 2006 09:53:17 -0000	1.13
+++ include/linux/pnfs_xdr.h	12 Dec 2006 10:01:45 -0000
@@ -47,6 +47,7 @@ struct nfs4_pnfs_layoutget_arg {
};

struct nfs4_pnfs_layoutget_res {
+	__u32 return_on_close;
__u64 offset;
__u64 length;
__u32 iomode;
Index: include/linux/nfsd/nfsd4_pnfs.h
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/include/linux/nfsd/nfsd4_pnfs.h,v
retrieving revision 1.9
diff -u -p -r1.9 nfsd4_pnfs.h
--- include/linux/nfsd/nfsd4_pnfs.h	12 Dec 2006 09:43:43 -0000	1.9
+++ include/linux/nfsd/nfsd4_pnfs.h	12 Dec 2006 10:01:45 -0000
@@ -84,6 +84,7 @@ struct nfsd4_pnfs_layoutget {
/* only for cluster fs file layout 'struct knfsd_fh' */
unsigned char                   lg_fh[NFS_MAXFHSIZE];

+	u32				lg_return_on_close; /* response */
void				*lg_layout;     /* response callback encoded */
};



More information about the pNFS mailing list