concurrent direct IO write in xfs
Christoph Hellwig
hch at infradead.org
Mon Feb 13 11:48:06 CST 2012
On Thu, Feb 09, 2012 at 05:09:20PM +1100, Dave Chinner wrote:
> if (create) {
> - lockmode = XFS_ILOCK_EXCL;
> + /*
> + * For direct IO, we lock in shared mode so that write
> + * operations that don't require allocation can occur
> + * concurrently. The ilock has to be dropped over the allocation
> + * transaction reservation, so the only thing the ilock is
> + * providing here is modification exclusion. i.e. there is no
> + * need to hold the lock exclusive.
> + *
> + * For buffered IO, if we need to do delayed allocation then
> + * hold the ilock exclusive so that the lookup and delalloc
> + * reservation is atomic.
> + */
> + if (direct)
> + lockmode = XFS_ILOCK_SHARED;
> + else
> + lockmode = XFS_ILOCK_EXCL;
> xfs_ilock(ip, lockmode);
> } else {
> lockmode = xfs_ilock_map_shared(ip);
We'll actually need to use xfs_ilock_map_shared for the the direct
create case too, to make sure we have the exclusive lock when we first
read the extent list in.
Also xfs_qm_dqattach_locked really wants the inode locked exclusively,
which your current code doesn't handle.
More information about the xfs
mailing list