[pnfs] CVS: nfsv4

Marc Eshel IBM eshel at citi.umich.edu
Mon Dec 4 16:42:13 EST 2006


CVSROOT:	/cvs
Module name:	nfsv4
Changes by:	eshel at citi.	2006/12/04 16:42:13

Modified files:
	cvs/pnfs/fs/nfsd: nfs4state.c 

Log message:
Add a flags to nfsd/fs interfaces to indicate if it is a new layout
get/return or just update to help the fs to keep track of hold count.

===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfsd/nfs4state.c,v
retrieving revision 1.18
diff -u -r1.18 nfs4state.c
--- nfs4state.c	4 Dec 2006 18:10:59 -0000	1.18
+++ nfs4state.c	4 Dec 2006 21:35:19 -0000
@@ -3414,7 +3414,8 @@
lr.offset = lp->lo_offset;
lr.length = lp->lo_length;
lr.iomode = lp->lo_iomode;
-	lr.layout_type= lp->lo_layout_type;
+	lr.layout_type = lp->lo_layout_type;
+	lr.flags = 0; /* last return */

//??? recall layout

@@ -3475,6 +3476,8 @@
lp->lo_offset = lg->lg_offset;
lp->lo_length = lg->lg_length;
num_layouts++;
+	list_add(&lp->lo_perfile, &fp->fi_layouts);
+	list_add(&lp->lo_perclnt, &clp->cl_layouts);
get_nfs4_file(lp->lo_file);
dprintk("NFSD alloc_init_layout exit\n");
return lp;
@@ -3542,6 +3545,19 @@
if (fp == NULL)
goto out;
}
+	clp = find_confirmed_client((clientid_t *)&lgp->lg_clientid);
+	dprintk("pNFS %s: clp %p \n", __FUNCTION__, clp);
+	if (!clp)
+	        goto out;
+
+	lgp->lg_flags = 0;
+	while (!list_empty(&clp->cl_layouts)) {
+	        lp = list_entry(fp->fi_layouts.next,
+	                                struct nfs4_layout, lo_perfile);
+	        //??? if the right layout
+		lgp->lg_flags = 1; /* update layout */
+	        break;
+	}
if (sb->s_export_op->layout_get) {
status = sb->s_export_op->layout_get(current_fh->fh_dentry->d_inode,
(void *)lgp);
@@ -3566,43 +3582,32 @@
if (status)
goto out;

-		while (!list_empty(&fp->fi_layouts)) {
-			lp = list_entry(fp->fi_layouts.next,
-						struct nfs4_layout, lo_perfile);
-			//??? if the right layout
-			break;
+		if (!lp) {
+			lp = pnfs_alloc_init_layout(fp, clp, current_fh, lgp);
}
-		if (lp) {
+		else {
get_nfs4_layout(lp);
}
-		else {
-			clp = find_confirmed_client((clientid_t *)&lgp->lg_clientid);
-			dprintk("pNFS %s: clp %p \n", __FUNCTION__, clp);
-
-			if (clp) {
-				lp = pnfs_alloc_init_layout(fp, clp, current_fh, lgp);
-			}
-			if (lp) {
-				dprintk("pNFS %s: lp %p\n", __FUNCTION__, lp);
-				pnfs_hash_layoutget(lp);
-				goto out;
-			}
-			status = nfserr_layouttrylater;
-
-			if (lgp->lg_ops->layout_encode == NULL &&
-					lgp->lg_type == LAYOUT_NFSV4_FILES)
-				filelayout_free_layout(lgp->lg_layout);
-			else
-				lgp->lg_ops->layout_free(lgp->lg_layout);
-
-			lr.reclaim = 0;
-			lr.offset = lgp->lg_offset;
-			lr.length = lgp->lg_length;
-			lr.iomode = lgp->lg_iomode;
-			lr.layout_type= lgp->lg_type;
-			if (sb->s_export_op->layout_return)
-				sb->s_export_op->layout_return(ino, &lr);
+		if (lp) {
+			dprintk("pNFS %s: lp %p\n", __FUNCTION__, lp);
+			goto out;
}
+		status = nfserr_layouttrylater;
+
+		if (lgp->lg_ops->layout_encode == NULL &&
+				lgp->lg_type == LAYOUT_NFSV4_FILES)
+			filelayout_free_layout(lgp->lg_layout);
+		else
+			lgp->lg_ops->layout_free(lgp->lg_layout);
+
+		lr.reclaim = 0;
+		lr.offset = lgp->lg_offset;
+		lr.length = lgp->lg_length;
+		lr.iomode = lgp->lg_iomode;
+		lr.layout_type = lgp->lg_type;
+		lr.flags = lgp->lg_flags;
+		if (sb->s_export_op->layout_return)
+			sb->s_export_op->layout_return(ino, &lr);
}
out:
if (fp)
@@ -3619,6 +3624,7 @@
struct inode *ino = current_fh->fh_dentry->d_inode;
struct nfs4_file *fp;
struct nfs4_layout *lp = NULL;
+	struct layout_return lr;

dprintk("NFSD: nfs4_pnfs_return_layout\n");

@@ -3637,6 +3643,12 @@
dprintk("pNFS %s: lp %p\n", __FUNCTION__, lp);

if (lp) {
+		lr.reclaim = 0;
+		lr.offset = lrp->lr_offset;
+		lr.length = lrp->lr_length;
+		lr.iomode = lrp->lr_iomode;
+		lr.layout_type = lrp->lr_type;
+		lr.flags = 1; /* update return */
if (sb->s_export_op->layout_return) {
status = sb->s_export_op->layout_return(current_fh->fh_dentry->d_inode,
lrp);



More information about the pNFS mailing list