[pnfs] git tree up to date

Marc Eshel eshel at almaden.ibm.com
Mon Mar 26 17:30:58 EDT 2007


Hi Andy,
You did not include this patch
Marc.


Marc Eshel wrote:

>From: Marc Eshel <eshel at almaden.ibm.com>
>
>This is a temporary fix to allow for the MDS and DS to be on the same
>machine and share a session. There are still problem on the second mount,
>some fields are not cleaned/reset properly after the first umount.
>---
>
> fs/nfs/nfs4filelayoutdev.c |   54 ++++++++++++++++++++++++++------------------
> 1 files changed, 32 insertions(+), 22 deletions(-)
>
>diff --git a/fs/nfs/nfs4filelayoutdev.c b/fs/nfs/nfs4filelayoutdev.c
>index acb36fa..8861f4f 100644
>--- a/fs/nfs/nfs4filelayoutdev.c
>+++ b/fs/nfs/nfs4filelayoutdev.c
>@@ -117,19 +117,24 @@ device_create(struct nfs_server *server,
> 		goto out;
> 	}
> 
>-	dprintk("device_create: dev_id=%u, ip=%x, port=%hu\n", dev->dev_id, ntohl(dev->ip_addr), ntohs(dev->port));
>+	dprintk("device_create: dev_id=%u, ip=%x, port=%hu, rpcclient %p\n",
>+		dev->dev_id, ntohl(dev->ip_addr), ntohs(dev->port), clp->cl_rpcclient);
> 
>-	xprt = xprt_create_proto(IPPROTO_TCP, &sin,
>-				 &mds_rpc->cl_xprt->timeout);
>-	if (IS_ERR(xprt)) {
>-		err = PTR_ERR(xprt);
>-		goto out;
>-	}
>+	if (PTR_ERR(clp->cl_rpcclient) == -EINVAL || clp->cl_rpcclient == NULL)
>+	{
>+		xprt = xprt_create_proto(IPPROTO_TCP, &sin,
>+					 &mds_rpc->cl_xprt->timeout);
>+		if (IS_ERR(xprt)) {
>+			err = PTR_ERR(xprt);
>+			goto out;
>+		}
> 
>-	clp->cl_rpcclient = create_nfs_rpcclient(xprt, "nfs4_pnfs_dserver", mds_rpc->cl_vers, mds_rpc->cl_auth->au_flavor, &err);
>-	if (clp->cl_rpcclient == NULL) {
>-		printk("%s: Can't create nfs rpc client!\n", __FUNCTION__);
>-		goto out;
>+		clp->cl_rpcclient = create_nfs_rpcclient(xprt, "nfs4_pnfs_dserver", mds_rpc->cl_vers, mds_rpc->cl_auth->au_flavor, &err);
>+		if (clp->cl_rpcclient == NULL) {
>+			printk("%s: Can't create nfs rpc client!\n",
>+								__FUNCTION__);
>+			goto out;
>+		}
> 	}
> 
> 	dev->clp = clp;
>@@ -146,12 +151,16 @@ device_destroy(struct nfs4_pnfs_dev_item
> 	if (!dev)
> 		return;
> 
>-	if ((status = _nfs4_proc_destroy_session(&dev->clp->cl_session, dev->clp->cl_rpcclient)))
>-		printk(KERN_WARNING "destroy session on data server failed with status %d...\
>+	/* if not created for DS just return */
>+	if (dev->clp->cl_exchange_flags & EXCHGID4_FLAG_USE_PNFS_DS) {
>+
>+		if ((status = _nfs4_proc_destroy_session(&dev->clp->cl_session, dev->clp->cl_rpcclient)))
>+			printk(KERN_WARNING "destroy session on data server failed with status %d...\
> 				 blowing away device anyways!\n", status);
> 
>-	/*	BUG_ON(!atomic_sub_and_test(0, &dev->count)); */
>-	rpc_shutdown_client(dev->clp->cl_rpcclient);
>+		/*	BUG_ON(!atomic_sub_and_test(0, &dev->count)); */
>+		rpc_shutdown_client(dev->clp->cl_rpcclient);
>+	}
> 
> 	kfree(dev);
> }
>@@ -217,14 +226,15 @@ nfs4_pnfs_device_add(struct filelayout_m
> 		return err;
> 	}
> 
>-	/* Set exchange id and create session flags */
>-	dev->clp->cl_session_flags = 0;
>-	dev->clp->cl_exchange_flags = EXCHGID4_FLAG_USE_PNFS_DS;
>-
>-	err = server->rpc_ops->setup_session(dev->clp);
>-	if (err)
>-		return err;
>+	if (dev->clp->cl_session == NULL) {
>+		/* Set exchange id and create session flags */
>+		dev->clp->cl_session_flags = 0;
>+		dev->clp->cl_exchange_flags = EXCHGID4_FLAG_USE_PNFS_DS;
> 
>+		err = server->rpc_ops->setup_session(dev->clp);
>+		if (err)
>+			return err;
>+        }
> 	/* Write lock, do lookup again, and then add device */
> 	write_lock(&hlist->dev_lock);
> 	tmp_dev = _device_lookup(hlist, dev->dev_id);
>_______________________________________________
>pNFS mailing list
>pNFS at linux-nfs.org
>http://linux-nfs.org/cgi-bin/mailman/listinfo/pnfs
>
>
>  
>



More information about the pNFS mailing list