Re: [PATCH 3/3] NFSv4.1: Add a helper pnfs_commit_and_return_layout

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 2013-03-21 at 13:27 +0200, Benny Halevy wrote:
> On 2013-03-20 19:39, Trond Myklebust wrote:
> > In order to be able to safely return the layout in nfs4_proc_setattr,
> > we need to block new uses of the layout, wait for all outstanding
> > users of the layout to complete, commit the layout and then return it.
> > 
> > This patch adds a helper in order to do all this safely.
> > 
> > Signed-off-by: Trond Myklebust <Trond.Myklebust@xxxxxxxxxx>
> > Cc: Boaz Harrosh <bharrosh@xxxxxxxxxxx>
> > ---
> >  fs/nfs/nfs4proc.c |  2 +-
> >  fs/nfs/pnfs.c     | 22 ++++++++++++++++++++++
> >  fs/nfs/pnfs.h     |  6 ++++++
> >  3 files changed, 29 insertions(+), 1 deletion(-)
> > 
> > diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
> > index 5122753..c560c8f 100644
> > --- a/fs/nfs/nfs4proc.c
> > +++ b/fs/nfs/nfs4proc.c
> > @@ -2695,7 +2695,7 @@ nfs4_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
> >  	int status;
> >  
> >  	if (pnfs_ld_layoutret_on_setattr(inode))
> > -		pnfs_return_layout(inode);
> > +		pnfs_commit_and_return_layout(inode);
> >  
> >  	nfs_fattr_init(fattr);
> >  	
> > diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
> > index 45badca..5a5e14d 100644
> > --- a/fs/nfs/pnfs.c
> > +++ b/fs/nfs/pnfs.c
> > @@ -868,6 +868,28 @@ out:
> >  }
> >  EXPORT_SYMBOL_GPL(_pnfs_return_layout);
> >  
> > +int
> > +pnfs_commit_and_return_layout(struct inode *inode)
> > +{
> > +	struct pnfs_layout_hdr *lo;
> > +	int ret;
> > +
> > +	spin_lock(&inode->i_lock);
> > +	lo = NFS_I(inode)->layout;
> > +	if (lo == NULL) {
> > +		spin_unlock(&inode->i_lock);
> > +		return 0;
> > +	}
> > +	/* Block new layoutgets and read/write to ds */
> > +	lo->plh_block_lgets++;
> > +	spin_unlock(&inode->i_lock);
> > +	filemap_fdatawait(inode->i_mapping);
> > +	ret = pnfs_layoutcommit_inode(inode, true);
> > +	if (ret == 0)
> > +		ret = _pnfs_return_layout(inode);
> 
> else {
> 	spin_lock(&inode->i_lock);
> 	lo->plh_block_lgets--;
> 	spin_unlock(&inode->i_lock);
> }
> 
> ?

Yeah... We should probably do that unconditionally. That means we need
to pin the layout, though. I'll fix and resend.

-- 
Trond Myklebust
Linux NFS client maintainer

NetApp
Trond.Myklebust@xxxxxxxxxx
www.netapp.com
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux