Re: [PATCH 4/8] xfs: introduce xfs_rw_lock() helpers for locking the inode

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

 



On Wed, 2011-01-12 at 08:02 +1100, Dave Chinner wrote:
> On Tue, Jan 11, 2011 at 12:36:27PM -0500, Christoph Hellwig wrote:
> > On Tue, Jan 11, 2011 at 10:37:44AM +1100, Dave Chinner wrote:
> > > +/*
> > > + * xfs_file_splice_write() does not use xfs_rw_ilock() because
> > > + * generic_file_splice_write() takes the i_mutex itself. This, in theory,

. . .

> > > +	xfs_rw_iunlock(ip, XFS_ILOCK_EXCL);
> > 
> > While using the xfs_rw_iunlock here actually is correct I think it's
> 
> Argh! I thought I reverted all the changes to
> xfs_file_splice_write().
> 
> > highly confusing, given that we didn't use it to take the ilock.
> 
> It definitely held the ilock around that size update before this
> series. ;)
> 
> > What
> > about just leaving all the code in xfs_file_splice_write as-is and not
> > touching it at all?
> 
> Updated version below.

Your explanation before and this update addressed all
my substantive issues.  I have one other thing (which
is essentially a style issue), which I'll still mention
below, but I think your next patch may make it moot
anyway...

In any case:

Reviewed-by: Alex Elder <aelder@xxxxxxx>

. . .
> @@ -654,16 +690,20 @@ start:
>  				mp->m_rtdev_targp : mp->m_ddev_targp;
>  
>  		if ((pos & target->bt_smask) || (count & target->bt_smask)) {
> -			xfs_iunlock(ip, XFS_ILOCK_EXCL|iolock);
> +			xfs_rw_iunlock(ip, XFS_ILOCK_EXCL|iolock);
>  			return XFS_ERROR(-EINVAL);
>  		}
>  
> -		if (!need_i_mutex && (mapping->nrpages || pos > ip->i_size)) {
> -			xfs_iunlock(ip, XFS_ILOCK_EXCL|iolock);
> +		/*
> +		 * For direct I/O, if there are cached pages or we're extending
> +		 * the file, we need IOLOCK_EXCL until we're sure the bytes at
> +		 * the new EOF have been zeroed and/or the cached pages are
> +		 * flushed out.  Upgrade the I/O lock and start again.
> +		 */
> +		if (iolock != XFS_IOLOCK_EXCL &&

I would prefer:   if (iolock == XFS_IOLOCK_SHARED)

> +		    (mapping->nrpages || pos > ip->i_size)) {
> +			xfs_rw_iunlock(ip, XFS_ILOCK_EXCL|iolock);

and (maybe) this could be             XFS_ILOCK_EXCL|XFS_IOLOCK_SHARED);

>  			iolock = XFS_IOLOCK_EXCL;
> -			need_i_mutex = 1;
> -			mutex_lock(&inode->i_mutex);
> -			xfs_ilock(ip, XFS_ILOCK_EXCL|iolock);
>  			goto start;
>  		}
>  	}

. . .

_______________________________________________
xfs mailing list
xfs@xxxxxxxxxxx
http://oss.sgi.com/mailman/listinfo/xfs


[Index of Archives]     [Linux XFS Devel]     [Linux Filesystem Development]     [Filesystem Testing]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux