diff mbox

[v2,04/49] nfs41: pull nfs4_ds_connect from file layout to generic pnfs

Message ID 1419405208-25975-5-git-send-email-loghyr@primarydata.com (mailing list archive)
State New, archived
Headers show

Commit Message

Thomas Haynes Dec. 24, 2014, 7:12 a.m. UTC
From: Peng Tao <tao.peng@primarydata.com>

It can be reused by flexfiles layout client.

Reviewed-by: Jeff Layton <jlayton@primarydata.com>
Signed-off-by: Peng Tao <tao.peng@primarydata.com>
Signed-off-by: Tom Haynes <Thomas.Haynes@primarydata.com>
---
 fs/nfs/filelayout/filelayoutdev.c | 78 +++------------------------------------
 fs/nfs/pnfs.h                     |  3 ++
 2 files changed, 8 insertions(+), 73 deletions(-)

Comments

Schumaker, Anna Jan. 5, 2015, 3:51 p.m. UTC | #1
Hey Tom and Peng,

On 12/24/2014 02:12 AM, Tom Haynes wrote:
> From: Peng Tao <tao.peng@primarydata.com>
> 
> It can be reused by flexfiles layout client.
> 
> Reviewed-by: Jeff Layton <jlayton@primarydata.com>
> Signed-off-by: Peng Tao <tao.peng@primarydata.com>
> Signed-off-by: Tom Haynes <Thomas.Haynes@primarydata.com>
> ---
>  fs/nfs/filelayout/filelayoutdev.c | 78 +++------------------------------------
>  fs/nfs/pnfs.h                     |  3 ++
>  2 files changed, 8 insertions(+), 73 deletions(-)
> 
> diff --git a/fs/nfs/filelayout/filelayoutdev.c b/fs/nfs/filelayout/filelayoutdev.c
> index fbfbb70..eb2e93b 100644
> --- a/fs/nfs/filelayout/filelayoutdev.c
> +++ b/fs/nfs/filelayout/filelayoutdev.c
> @@ -42,51 +42,6 @@
>  static unsigned int dataserver_timeo = NFS4_DEF_DS_TIMEO;
>  static unsigned int dataserver_retrans = NFS4_DEF_DS_RETRANS;
>  
> -/*
> - * Create an rpc connection to the nfs4_pnfs_ds data server
> - * Currently only supports IPv4 and IPv6 addresses
> - */
> -static int
> -nfs4_ds_connect(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds)
> -{
> -	struct nfs_client *clp = ERR_PTR(-EIO);
> -	struct nfs4_pnfs_ds_addr *da;
> -	int status = 0;
> -
> -	dprintk("--> %s DS %s au_flavor %d\n", __func__, ds->ds_remotestr,
> -		mds_srv->nfs_client->cl_rpcclient->cl_auth->au_flavor);
> -
> -	list_for_each_entry(da, &ds->ds_addrs, da_node) {
> -		dprintk("%s: DS %s: trying address %s\n",
> -			__func__, ds->ds_remotestr, da->da_remotestr);
> -
> -		clp = nfs4_set_ds_client(mds_srv->nfs_client,
> -					(struct sockaddr *)&da->da_addr,
> -					da->da_addrlen, IPPROTO_TCP,
> -					dataserver_timeo, dataserver_retrans);
> -		if (!IS_ERR(clp))
> -			break;
> -	}
> -
> -	if (IS_ERR(clp)) {
> -		status = PTR_ERR(clp);
> -		goto out;
> -	}
> -
> -	status = nfs4_init_ds_session(clp, mds_srv->nfs_client->cl_lease_time);
> -	if (status)
> -		goto out_put;
> -
> -	smp_wmb();
> -	ds->ds_clp = clp;
> -	dprintk("%s [new] addr: %s\n", __func__, ds->ds_remotestr);
> -out:
> -	return status;
> -out_put:
> -	nfs_put_client(clp);
> -	goto out;
> -}
> -
>  void
>  nfs4_fl_free_deviceid(struct nfs4_file_layout_dsaddr *dsaddr)
>  {
> @@ -450,22 +405,7 @@ nfs4_fl_select_ds_fh(struct pnfs_layout_segment *lseg, u32 j)
>  	return flseg->fh_array[i];
>  }
>  
> -static void nfs4_wait_ds_connect(struct nfs4_pnfs_ds *ds)
> -{
> -	might_sleep();
> -	wait_on_bit_action(&ds->ds_state, NFS4DS_CONNECTING,
> -			   nfs_wait_bit_killable, TASK_KILLABLE);
> -}
> -
> -static void nfs4_clear_ds_conn_bit(struct nfs4_pnfs_ds *ds)
> -{
> -	smp_mb__before_atomic();
> -	clear_bit(NFS4DS_CONNECTING, &ds->ds_state);
> -	smp_mb__after_atomic();
> -	wake_up_bit(&ds->ds_state, NFS4DS_CONNECTING);
> -}
> -
> -
> +/* Upon return, either ds is connected, or ds is NULL */
>  struct nfs4_pnfs_ds *
>  nfs4_fl_prepare_ds(struct pnfs_layout_segment *lseg, u32 ds_idx)
>  {
> @@ -473,6 +413,7 @@ nfs4_fl_prepare_ds(struct pnfs_layout_segment *lseg, u32 ds_idx)
>  	struct nfs4_pnfs_ds *ds = dsaddr->ds_list[ds_idx];
>  	struct nfs4_deviceid_node *devid = FILELAYOUT_DEVID_NODE(lseg);
>  	struct nfs4_pnfs_ds *ret = ds;
> +	struct nfs_server *s = NFS_SERVER(lseg->pls_layout->plh_inode);
>  
>  	if (ds == NULL) {
>  		printk(KERN_ERR "NFS: %s: No data server for offset index %d\n",
> @@ -484,18 +425,9 @@ nfs4_fl_prepare_ds(struct pnfs_layout_segment *lseg, u32 ds_idx)
>  	if (ds->ds_clp)
>  		goto out_test_devid;
>  
> -	if (test_and_set_bit(NFS4DS_CONNECTING, &ds->ds_state) == 0) {
> -		struct nfs_server *s = NFS_SERVER(lseg->pls_layout->plh_inode);
> -		int err;
> -
> -		err = nfs4_ds_connect(s, ds);
> -		if (err)
> -			nfs4_mark_deviceid_unavailable(devid);
> -		nfs4_clear_ds_conn_bit(ds);
> -	} else {
> -		/* Either ds is connected, or ds is NULL */
> -		nfs4_wait_ds_connect(ds);
> -	}
> +	nfs4_pnfs_ds_connect(s, ds, devid, dataserver_timeo,
> +			     dataserver_retrans);
> +

When I compile this patch I get:
	ERROR: "nfs4_pnfs_ds_connect" [fs/nfs/filelayout/nfs_layout_nfsv41_files.ko] undefined!

It looks like this function doesn't exist until patch 5.

Anna

>  out_test_devid:
>  	if (filelayout_test_devid_unavailable(devid))
>  		ret = NULL;
> diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
> index d0b8e0c..a213c2d 100644
> --- a/fs/nfs/pnfs.h
> +++ b/fs/nfs/pnfs.h
> @@ -295,6 +295,9 @@ void nfs4_deviceid_purge_client(const struct nfs_client *);
>  void nfs4_pnfs_ds_put(struct nfs4_pnfs_ds *ds);
>  struct nfs4_pnfs_ds *nfs4_pnfs_ds_add(struct list_head *dsaddrs,
>  				      gfp_t gfp_flags);
> +void nfs4_pnfs_ds_connect(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds,
> +			  struct nfs4_deviceid_node *devid, unsigned int timeo,
> +			  unsigned int retrans);
>  
>  /* pnfs_nfsio.c */
>  void pnfs_generic_clear_request_commit(struct nfs_page *req,
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Thomas Haynes Jan. 5, 2015, 7:36 p.m. UTC | #2
On Mon, Jan 05, 2015 at 10:51:46AM -0500, Anna Schumaker wrote:
> Hey Tom and Peng,
> 
> On 12/24/2014 02:12 AM, Tom Haynes wrote:
> > From: Peng Tao <tao.peng@primarydata.com>
> > 
> > It can be reused by flexfiles layout client.
> > 
> > Reviewed-by: Jeff Layton <jlayton@primarydata.com>
> > Signed-off-by: Peng Tao <tao.peng@primarydata.com>
> > Signed-off-by: Tom Haynes <Thomas.Haynes@primarydata.com>
> > ---
> >  fs/nfs/filelayout/filelayoutdev.c | 78 +++------------------------------------
> >  fs/nfs/pnfs.h                     |  3 ++
> >  2 files changed, 8 insertions(+), 73 deletions(-)
> > 
> > diff --git a/fs/nfs/filelayout/filelayoutdev.c b/fs/nfs/filelayout/filelayoutdev.c
> > index fbfbb70..eb2e93b 100644
> > --- a/fs/nfs/filelayout/filelayoutdev.c
> > +++ b/fs/nfs/filelayout/filelayoutdev.c
> > @@ -42,51 +42,6 @@
> >  static unsigned int dataserver_timeo = NFS4_DEF_DS_TIMEO;
> >  static unsigned int dataserver_retrans = NFS4_DEF_DS_RETRANS;
> >  
> > -/*
> > - * Create an rpc connection to the nfs4_pnfs_ds data server
> > - * Currently only supports IPv4 and IPv6 addresses
> > - */
> > -static int
> > -nfs4_ds_connect(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds)
> > -{
> > -	struct nfs_client *clp = ERR_PTR(-EIO);
> > -	struct nfs4_pnfs_ds_addr *da;
> > -	int status = 0;
> > -
> > -	dprintk("--> %s DS %s au_flavor %d\n", __func__, ds->ds_remotestr,
> > -		mds_srv->nfs_client->cl_rpcclient->cl_auth->au_flavor);
> > -
> > -	list_for_each_entry(da, &ds->ds_addrs, da_node) {
> > -		dprintk("%s: DS %s: trying address %s\n",
> > -			__func__, ds->ds_remotestr, da->da_remotestr);
> > -
> > -		clp = nfs4_set_ds_client(mds_srv->nfs_client,
> > -					(struct sockaddr *)&da->da_addr,
> > -					da->da_addrlen, IPPROTO_TCP,
> > -					dataserver_timeo, dataserver_retrans);
> > -		if (!IS_ERR(clp))
> > -			break;
> > -	}
> > -
> > -	if (IS_ERR(clp)) {
> > -		status = PTR_ERR(clp);
> > -		goto out;
> > -	}
> > -
> > -	status = nfs4_init_ds_session(clp, mds_srv->nfs_client->cl_lease_time);
> > -	if (status)
> > -		goto out_put;
> > -
> > -	smp_wmb();
> > -	ds->ds_clp = clp;
> > -	dprintk("%s [new] addr: %s\n", __func__, ds->ds_remotestr);
> > -out:
> > -	return status;
> > -out_put:
> > -	nfs_put_client(clp);
> > -	goto out;
> > -}
> > -
> >  void
> >  nfs4_fl_free_deviceid(struct nfs4_file_layout_dsaddr *dsaddr)
> >  {
> > @@ -450,22 +405,7 @@ nfs4_fl_select_ds_fh(struct pnfs_layout_segment *lseg, u32 j)
> >  	return flseg->fh_array[i];
> >  }
> >  
> > -static void nfs4_wait_ds_connect(struct nfs4_pnfs_ds *ds)
> > -{
> > -	might_sleep();
> > -	wait_on_bit_action(&ds->ds_state, NFS4DS_CONNECTING,
> > -			   nfs_wait_bit_killable, TASK_KILLABLE);
> > -}
> > -
> > -static void nfs4_clear_ds_conn_bit(struct nfs4_pnfs_ds *ds)
> > -{
> > -	smp_mb__before_atomic();
> > -	clear_bit(NFS4DS_CONNECTING, &ds->ds_state);
> > -	smp_mb__after_atomic();
> > -	wake_up_bit(&ds->ds_state, NFS4DS_CONNECTING);
> > -}
> > -
> > -
> > +/* Upon return, either ds is connected, or ds is NULL */
> >  struct nfs4_pnfs_ds *
> >  nfs4_fl_prepare_ds(struct pnfs_layout_segment *lseg, u32 ds_idx)
> >  {
> > @@ -473,6 +413,7 @@ nfs4_fl_prepare_ds(struct pnfs_layout_segment *lseg, u32 ds_idx)
> >  	struct nfs4_pnfs_ds *ds = dsaddr->ds_list[ds_idx];
> >  	struct nfs4_deviceid_node *devid = FILELAYOUT_DEVID_NODE(lseg);
> >  	struct nfs4_pnfs_ds *ret = ds;
> > +	struct nfs_server *s = NFS_SERVER(lseg->pls_layout->plh_inode);
> >  
> >  	if (ds == NULL) {
> >  		printk(KERN_ERR "NFS: %s: No data server for offset index %d\n",
> > @@ -484,18 +425,9 @@ nfs4_fl_prepare_ds(struct pnfs_layout_segment *lseg, u32 ds_idx)
> >  	if (ds->ds_clp)
> >  		goto out_test_devid;
> >  
> > -	if (test_and_set_bit(NFS4DS_CONNECTING, &ds->ds_state) == 0) {
> > -		struct nfs_server *s = NFS_SERVER(lseg->pls_layout->plh_inode);
> > -		int err;
> > -
> > -		err = nfs4_ds_connect(s, ds);
> > -		if (err)
> > -			nfs4_mark_deviceid_unavailable(devid);
> > -		nfs4_clear_ds_conn_bit(ds);
> > -	} else {
> > -		/* Either ds is connected, or ds is NULL */
> > -		nfs4_wait_ds_connect(ds);
> > -	}
> > +	nfs4_pnfs_ds_connect(s, ds, devid, dataserver_timeo,
> > +			     dataserver_retrans);
> > +
> 
> When I compile this patch I get:
> 	ERROR: "nfs4_pnfs_ds_connect" [fs/nfs/filelayout/nfs_layout_nfsv41_files.ko] undefined!
> 
> It looks like this function doesn't exist until patch 5.

Okay, despite building each patch in succession to catch this
type of issue, this is happening.

I'll fix this issue up, thanks for catching it!

> 
> Anna
> 
> >  out_test_devid:
> >  	if (filelayout_test_devid_unavailable(devid))
> >  		ret = NULL;
> > diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
> > index d0b8e0c..a213c2d 100644
> > --- a/fs/nfs/pnfs.h
> > +++ b/fs/nfs/pnfs.h
> > @@ -295,6 +295,9 @@ void nfs4_deviceid_purge_client(const struct nfs_client *);
> >  void nfs4_pnfs_ds_put(struct nfs4_pnfs_ds *ds);
> >  struct nfs4_pnfs_ds *nfs4_pnfs_ds_add(struct list_head *dsaddrs,
> >  				      gfp_t gfp_flags);
> > +void nfs4_pnfs_ds_connect(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds,
> > +			  struct nfs4_deviceid_node *devid, unsigned int timeo,
> > +			  unsigned int retrans);
> >  
> >  /* pnfs_nfsio.c */
> >  void pnfs_generic_clear_request_commit(struct nfs_page *req,
> > 
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/fs/nfs/filelayout/filelayoutdev.c b/fs/nfs/filelayout/filelayoutdev.c
index fbfbb70..eb2e93b 100644
--- a/fs/nfs/filelayout/filelayoutdev.c
+++ b/fs/nfs/filelayout/filelayoutdev.c
@@ -42,51 +42,6 @@ 
 static unsigned int dataserver_timeo = NFS4_DEF_DS_TIMEO;
 static unsigned int dataserver_retrans = NFS4_DEF_DS_RETRANS;
 
-/*
- * Create an rpc connection to the nfs4_pnfs_ds data server
- * Currently only supports IPv4 and IPv6 addresses
- */
-static int
-nfs4_ds_connect(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds)
-{
-	struct nfs_client *clp = ERR_PTR(-EIO);
-	struct nfs4_pnfs_ds_addr *da;
-	int status = 0;
-
-	dprintk("--> %s DS %s au_flavor %d\n", __func__, ds->ds_remotestr,
-		mds_srv->nfs_client->cl_rpcclient->cl_auth->au_flavor);
-
-	list_for_each_entry(da, &ds->ds_addrs, da_node) {
-		dprintk("%s: DS %s: trying address %s\n",
-			__func__, ds->ds_remotestr, da->da_remotestr);
-
-		clp = nfs4_set_ds_client(mds_srv->nfs_client,
-					(struct sockaddr *)&da->da_addr,
-					da->da_addrlen, IPPROTO_TCP,
-					dataserver_timeo, dataserver_retrans);
-		if (!IS_ERR(clp))
-			break;
-	}
-
-	if (IS_ERR(clp)) {
-		status = PTR_ERR(clp);
-		goto out;
-	}
-
-	status = nfs4_init_ds_session(clp, mds_srv->nfs_client->cl_lease_time);
-	if (status)
-		goto out_put;
-
-	smp_wmb();
-	ds->ds_clp = clp;
-	dprintk("%s [new] addr: %s\n", __func__, ds->ds_remotestr);
-out:
-	return status;
-out_put:
-	nfs_put_client(clp);
-	goto out;
-}
-
 void
 nfs4_fl_free_deviceid(struct nfs4_file_layout_dsaddr *dsaddr)
 {
@@ -450,22 +405,7 @@  nfs4_fl_select_ds_fh(struct pnfs_layout_segment *lseg, u32 j)
 	return flseg->fh_array[i];
 }
 
-static void nfs4_wait_ds_connect(struct nfs4_pnfs_ds *ds)
-{
-	might_sleep();
-	wait_on_bit_action(&ds->ds_state, NFS4DS_CONNECTING,
-			   nfs_wait_bit_killable, TASK_KILLABLE);
-}
-
-static void nfs4_clear_ds_conn_bit(struct nfs4_pnfs_ds *ds)
-{
-	smp_mb__before_atomic();
-	clear_bit(NFS4DS_CONNECTING, &ds->ds_state);
-	smp_mb__after_atomic();
-	wake_up_bit(&ds->ds_state, NFS4DS_CONNECTING);
-}
-
-
+/* Upon return, either ds is connected, or ds is NULL */
 struct nfs4_pnfs_ds *
 nfs4_fl_prepare_ds(struct pnfs_layout_segment *lseg, u32 ds_idx)
 {
@@ -473,6 +413,7 @@  nfs4_fl_prepare_ds(struct pnfs_layout_segment *lseg, u32 ds_idx)
 	struct nfs4_pnfs_ds *ds = dsaddr->ds_list[ds_idx];
 	struct nfs4_deviceid_node *devid = FILELAYOUT_DEVID_NODE(lseg);
 	struct nfs4_pnfs_ds *ret = ds;
+	struct nfs_server *s = NFS_SERVER(lseg->pls_layout->plh_inode);
 
 	if (ds == NULL) {
 		printk(KERN_ERR "NFS: %s: No data server for offset index %d\n",
@@ -484,18 +425,9 @@  nfs4_fl_prepare_ds(struct pnfs_layout_segment *lseg, u32 ds_idx)
 	if (ds->ds_clp)
 		goto out_test_devid;
 
-	if (test_and_set_bit(NFS4DS_CONNECTING, &ds->ds_state) == 0) {
-		struct nfs_server *s = NFS_SERVER(lseg->pls_layout->plh_inode);
-		int err;
-
-		err = nfs4_ds_connect(s, ds);
-		if (err)
-			nfs4_mark_deviceid_unavailable(devid);
-		nfs4_clear_ds_conn_bit(ds);
-	} else {
-		/* Either ds is connected, or ds is NULL */
-		nfs4_wait_ds_connect(ds);
-	}
+	nfs4_pnfs_ds_connect(s, ds, devid, dataserver_timeo,
+			     dataserver_retrans);
+
 out_test_devid:
 	if (filelayout_test_devid_unavailable(devid))
 		ret = NULL;
diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
index d0b8e0c..a213c2d 100644
--- a/fs/nfs/pnfs.h
+++ b/fs/nfs/pnfs.h
@@ -295,6 +295,9 @@  void nfs4_deviceid_purge_client(const struct nfs_client *);
 void nfs4_pnfs_ds_put(struct nfs4_pnfs_ds *ds);
 struct nfs4_pnfs_ds *nfs4_pnfs_ds_add(struct list_head *dsaddrs,
 				      gfp_t gfp_flags);
+void nfs4_pnfs_ds_connect(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds,
+			  struct nfs4_deviceid_node *devid, unsigned int timeo,
+			  unsigned int retrans);
 
 /* pnfs_nfsio.c */
 void pnfs_generic_clear_request_commit(struct nfs_page *req,