On Thu, Mar 03, 2011 at 01:42:28PM +1100, Dave Chinner wrote:
> Yeah, it doesn't seem like there's an easy way around that. I guess
> I'll start by tracking VFS dirty inodes via a tag in the per-ag radix
> tree and kick writeback via a new xfssynd work operation. I'll see
> if that is sufficient to avoid the OOM problem without needing to
> log the inodes in the .dirty_inode callback or changing it's
I don't think we'll be able to get around chaning the dirty_inode
callback. We need a way to prevent the VFS from marking the inode
dirty, otherwise we have no chance of reclaiming it.
Except for that I think it's really simple:
1) we need to reintroduce the i_update_size flag or an equivalent to
distinguish unlogged timestamp from unlogged size updates for fsync
vs fdatasync. At that point we can stop looking at the VFS dirty
bits in fsync.
2) ->dirty_inode needs to tag the inode as dirty in the inode radix
With those minimal changes we should be set - we already
callxfs_sync_attr from the sync_fs path, and xfs_sync_inode_attr
properly picks up inodes with unlogged changes.
In fact that whole scheme might even be able to speed up sync - right
now we first log the inode and then flush all pending data in the log
back to disk, and with this scheme we avoid logging the inode in the