[pnfs] [PATCH] pnfs: initialize ds_[rw]size only after thelayout driver has registered

Labiaga, Ricardo Ricardo.Labiaga at netapp.com
Thu Jan 3 12:55:17 EST 2008


2.6.24-rc6 doesn't trigger this problem because the client is not
setting the SESSION4_BACK_CHAN bit during session creation, so the
server doesn't attempt the callback probe.  It will with the backchannel
changes after I'm done addressing the style issues you pointed out ;-)

- ricardo


> -----Original Message-----
> From: Benny Halevy [mailto:bhalevy at panasas.com] 
> Sent: Thursday, January 03, 2008 12:45 AM
> To: Muntz, Daniel; Sager, Mike
> Cc: pnfs at linux-nfs.org; Labiaga, Ricardo
> Subject: Re: [pnfs] [PATCH] pnfs: initialize ds_[rw]size only 
> after thelayout driver has registered
> 
> On Jan. 03, 2008, 3:34 +0200, "Muntz, Daniel" 
> <Dan.Muntz at netapp.com> wrote:
> > Two issues.  One, a "bad" client shouldn't oops the 2.6.24 kernel no
> > matter which draft they're each on, so something needs to be fixed.
> > Two, the 2.6.18 client was working with the labiaga 
> 2.6.24rc2 tree which
> > I thought was draft 13 compliant. 
> 
> Agreed.  I'm testing my changes with the 2.6.24-rc6 client 
> (with Andy's
> changes and myself's) I'll try to reproduce this with the 
> 2.6.18.3 client
> as well.
> 
> Benny
> 
> > 
> > -----Original Message-----
> > From: Dean Hildebrand [mailto:seattleplus at gmail.com] 
> > Sent: Wednesday, January 02, 2008 3:27 PM
> > To: Sager, Mike
> > Cc: pnfs at linux-nfs.org; Labiaga, Ricardo
> > Subject: Re: [pnfs] [PATCH] pnfs: initialize ds_[rw]size only after
> > thelayout driver has registered
> > 
> > Thanks Ricardo.  I updated the wiki with that information.
> > 
> > Who will be updating this tree with the patches?
> > 
> > Sager, Mike wrote:
> >> As a sidenote, it appears this 2.6.24 repository isn't 
> compatible with
> > 
> >> what I believe is the latest 2.6.18 client.  When I try 
> it, the server
> > 
> >> oops due to a NULL pointer dereference with the following trace:
> >>   
> > The 2.6.18 code base did not make the jump to draft-13 after the
> > bakeathon.  I believe Ricardo applied our bakeathon draft 
> 13 patches to
> > the 2.6.24 git tree, which I think Benny used to create his 
> tree (via
> > Andy).  I'm not sure of your specific error, but since it 
> is in decode
> > compound, I bet that is the problem.  The summary is that the 2.6.18
> > code base is only compatible with itself.
> > Dean
> >> Call Trace:
> >>  [<c0369b48>] call_bind+0x65/0x6b
> >>  [<c0369bf9>] call_reserve+0x3c/0x65
> >>  [<c036fe9d>] __rpc_execute+0x6f/0x214  [<c036f768>] 
> >> rpc_set_active+0x3a/0x5c  [<c036a632>] rpc_do_run_task+0x76/0x8f  
> >> [<c036b485>] rpc_call_async+0x1b/0x2d  [<c01ffc60>] 
> >> nfsd41_probe_callback+0x1b8/0x213  [<c01282ed>] 
> >> local_bh_enable_ip+0x40/0x56  [<c01fbccc>] 
> >> nfsd4_create_session+0x132/0x340  [<c01fbb9a>] 
> >> nfsd4_create_session+0x0/0x340  [<c01ee543>] 
> >> nfsd4_proc_compound+0x272/0x3e9  [<c01f3cce>] 
> >> nfs4svc_decode_compoundargs+0x0/0x5c
> >>  [<c01e0ad2>] nfsd_dispatch+0xd3/0x1a0  [<c03759ce>] 
> >> svcauth_unix_set_client+0x176/0x1ac
> >>  [<c0372427>] svc_process+0x3be/0x66f
> >>  [<c0375249>] svc_recv+0x341/0x3b4
> >>  [<c01e1031>] nfsd+0x181/0x290
> >>  [<c01e0eb0>] nfsd+0x0/0x290
> >>  [<c0104b3b>] kernel_thread_helper+0x7/0x10
> >>
> >>
> >> What client are people using to test pnfs?  Last I heard, the 
> >> 2.6.24-based client doesn't yet support pnfs.
> >>
> >> Mike
> >>
> >> -----Original Message-----
> >> From: Labiaga, Ricardo
> >> Sent: Wednesday, January 02, 2008 2:35 PM
> >> To: Dean Hildebrand; Benny Halevy
> >> Cc: pnfs at linux-nfs.org
> >> Subject: Re: [pnfs] [PATCH] pnfs: initialize ds_[rw]size 
> only after 
> >> thelayout driver has registered
> >>
> >>
> >> Hi Dean,
> >>
> >> As I understand it, Benny is maintaining the new "golden" 
> repository
> > at:
> >>    git://linux-nfs.org/~bhalevy/linux-pnfs.git
> >>
> >> I have a clone and track the following branches:  nfs41 
> and pnfs.  I 
> >> see there are other branches.  Private to Benny's work?
> >>
> >> At least I am working under that understanding based on 
> our last pNFS 
> >> concall.
> >>
> >> - ricardo
> >>
> >>
> >>   
> >>> -----Original Message-----
> >>> From: Dean Hildebrand [mailto:seattleplus at gmail.com]
> >>> Sent: Wednesday, January 02, 2008 1:33 PM
> >>> To: Benny Halevy
> >>> Cc: pnfs at linux-nfs.org
> >>> Subject: Re: [pnfs] [PATCH] pnfs: initialize ds_[rw]size 
> only after 
> >>> the layout driver has registered
> >>>
> >>> I'm confused with the large numbers of git repositories 
> that we now 
> >>> have.  My understanding of the process we were using (most
> >>> recently) for
> >>> 2.6.18 was
> >>> 1. Make change in local repository
> >>> 2. "git send-email --to pnfs at linux-nfs.org  ..." your 
> changes 3. Andy
> > 
> >>> or Bruce would apply the patches to the pNFS repository 
> (or do a git 
> >>> pull I guess)
> >>>
> >>> If this is still the process, what is the git repository I should 
> >>> pull from for step 1 and then have andy/bruce push to for 
> step 3?  Is
> > 
> >>> it Benny's?  Benny, are the patches you sending out in your local 
> >>> repository or the one you created at citi?  Once all of 
> the patches 
> >>> are approved, to which git tree will they be applied?
> >>>
> >>> If someone knows, can they update the wiki?
> >>> Dean
> >>>
> >>> Benny Halevy wrote:
> >>>     
> >>>> Currently, nfs_server_set_fsinfo, which sets the DS I/O
> >>>>       
> >>> sizes, is being called
> >>>     
> >>>> before pnfs has been initialized.
> >>>>
> >>>> Signed-off-by: Benny Halevy <bhalevy at panasas.com>
> >>>> ---
> >>>>  fs/nfs/client.c |   15 ---------------
> >>>>  fs/nfs/pnfs.c   |   22 ++++++++++++++++++++++
> >>>>  fs/nfs/pnfs.h   |    1 +
> >>>>  fs/nfs/super.c  |    1 +
> >>>>  4 files changed, 24 insertions(+), 15 deletions(-)
> >>>>
> >>>> diff --git a/fs/nfs/client.c b/fs/nfs/client.c index 
> >>>> f96aa40..6db3b83 100644
> >>>> --- a/fs/nfs/client.c
> >>>> +++ b/fs/nfs/client.c
> >>>> @@ -620,9 +620,6 @@ error:
> >>>>  static void nfs_server_set_fsinfo(struct nfs_server
> >>>>       
> >>> *server, struct nfs_fsinfo *fsinfo)
> >>>     
> >>>>  {
> >>>>  	unsigned long max_rpc_payload;
> >>>> -#ifdef CONFIG_PNFS
> >>>> -	unsigned long dssize;
> >>>> -#endif
> >>>>  
> >>>>  	/* Work out a lot of parameters */
> >>>>  	if (server->rsize == 0)
> >>>> @@ -652,18 +649,6 @@ static void
> >>>>       
> >>> nfs_server_set_fsinfo(struct nfs_server *server, struct 
> nfs_fsinfo *
> >>>     
> >>>>  #ifdef CONFIG_PNFS
> >>>>  	/* Save the layout type for use during init of 
> layout driver */
> >>>>  	server->pnfs_fs_ltype = fsinfo->layoutclass;
> >>>> -
> >>>> -	/* Set buffer size for data servers */
> >>>> -	dssize = pnfs_getiosize(server);
> >>>> -	if (dssize > 0) {
> >>>> -		server->ds_rsize = server->ds_wsize = 
> >>>>       
> >>> nfs_block_size(dssize, NULL);
> >>>     
> >>>> -		server->ds_rpages = server->ds_wpages = 
> >>>>       
> >>> (server->ds_rsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
> >>>     
> >>>> -	} else {
> >>>> -		server->ds_wsize = server->wsize;
> >>>> -		server->ds_rsize = server->rsize;
> >>>> -		server->ds_rpages = server->rpages;
> >>>> -		server->ds_wpages = server->wpages;
> >>>> -	}
> >>>>  #endif /* CONFIG_PNFS */
> >>>>  
> >>>>  	server->wtmult = nfs_block_bits(fsinfo->wtmult, 
> NULL); diff
> >>>>       
> >> --git
> >>   
> >>>> a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index ca99c44..d49f9ce 100644
> >>>> --- a/fs/nfs/pnfs.c
> >>>> +++ b/fs/nfs/pnfs.c
> >>>> @@ -46,6 +46,8 @@
> >>>>  #include <linux/pnfs_xdr.h>
> >>>>  #include <linux/nfs4_pnfs.h>
> >>>>  
> >>>> +#include "internal.h"
> >>>> +
> >>>>  #include "nfs4_fs.h"
> >>>>  #include "pnfs.h"
> >>>>  
> >>>> @@ -859,6 +861,26 @@ pnfs_getiosize(struct nfs_server *server)
> >>>>  	return ld->ld_policy_ops->get_blocksize(mounttype);
> >>>>  }
> >>>>  
> >>>> +void
> >>>> +pnfs_set_ds_iosize(struct nfs_server *server) {
> >>>> +	unsigned dssize = pnfs_getiosize(server);
> >>>> +
> >>>> +	/* Set buffer size for data servers */
> >>>> +	if (dssize > 0) {
> >>>> +		server->ds_rsize = server->ds_wsize =
> >>>> +			nfs_block_size(dssize, NULL);
> >>>> +		server->ds_rpages = server->ds_wpages =
> >>>> +			(server->ds_rsize + 
> PAGE_CACHE_SIZE - 1) >>
> >>>> +			PAGE_CACHE_SHIFT;
> >>>> +	} else {
> >>>> +		server->ds_wsize = server->wsize;
> >>>> +		server->ds_rsize = server->rsize;
> >>>> +		server->ds_rpages = server->rpages;
> >>>> +		server->ds_wpages = server->wpages;
> >>>> +	}
> >>>> +}
> >>>> +
> >>>>  /* Invoked by all non-NFSv4 I/O layout drivers to mark
> >>>>       
> >>> pages for commit
> >>>     
> >>>>   */
> >>>>  static void
> >>>> diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h index 
> 50e3797..bb7b091 
> >>>> 100644
> >>>> --- a/fs/nfs/pnfs.h
> >>>> +++ b/fs/nfs/pnfs.h
> >>>> @@ -46,6 +46,7 @@ int pnfs_enabled_sb(struct nfs_server 
> *nfss);  int
> >>>>       
> >>   
> >>>> pnfs_use_nfsv4_wproto(struct inode *inode, ssize_t count);  int 
> >>>> pnfs_use_nfsv4_rproto(struct inode *inode, ssize_t 
> count);  unsigned
> >>>>       
> >>   
> >>>> int pnfs_getiosize(struct nfs_server *server);
> >>>> +void pnfs_set_ds_iosize(struct nfs_server *server);
> >>>>  int pnfs_commit(struct inode *inode, struct list_head
> >>>>       
> >>> *head, int sync, struct nfs_write_data *data);
> >>>     
> >>>>  int pnfs_try_to_commit(struct inode *, struct
> >>>>       
> >>> nfs_write_data *, struct list_head *, int);
> >>>     
> >>>>  int pnfs_wsize(struct inode *, unsigned int, struct
> >>>>       
> >>> nfs_write_data *);
> >>>     
> >>>> diff --git a/fs/nfs/super.c b/fs/nfs/super.c index 
> b4aecb1..bb6ffa2 
> >>>> 100644
> >>>> --- a/fs/nfs/super.c
> >>>> +++ b/fs/nfs/super.c
> >>>> @@ -1705,6 +1705,7 @@ int nfs4_init_pnfs(struct super_block
> >>>>       
> >>> *sb, struct nfs_server *server,
> >>>     
> >>>>  	switch (clp->cl_minorversion) {
> >>>>  	case 1:
> >>>>  		set_pnfs_layoutdriver(sb, fh, 
> server->pnfs_fs_ltype);
> >>>> +		pnfs_set_ds_iosize(server);
> >>>>  		break;
> >>>>  	case 0:
> >>>>  		break;
> >>>>   
> >>>>       
> 
> _______________________________________________
> pNFS mailing list
> pNFS at linux-nfs.org
> http://linux-nfs.org/cgi-bin/mailman/listinfo/pnfs
> 


More information about the pNFS mailing list