On Tue, Apr 01, 2014 at 08:47:54AM +1100, Dave Chinner wrote:
> On Fri, Mar 28, 2014 at 09:16:00AM -0400, Brian Foster wrote:
> > The flush flag allows the caller to issue a flush for scanned inodes. In
> > ENOSPC conditions caused by project quotas, a flush is required to free
> > up reserved metadata allocations.
> >
> > Signed-off-by: Brian Foster <bfoster@xxxxxxxxxx>
> > ---
> > fs/xfs/xfs_fs.h | 4 +++-
> > fs/xfs/xfs_icache.c | 3 +++
> > 2 files changed, 6 insertions(+), 1 deletion(-)
> >
> > diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h
> > index c5fc116..fa3a58e 100644
> > --- a/fs/xfs/xfs_fs.h
> > +++ b/fs/xfs/xfs_fs.h
> > @@ -374,12 +374,14 @@ struct xfs_fs_eofblocks {
> > #define XFS_EOF_FLAGS_GID (1 << 2) /* filter by gid */
> > #define XFS_EOF_FLAGS_PRID (1 << 3) /* filter by project id */
> > #define XFS_EOF_FLAGS_MINFILESIZE (1 << 4) /* filter by min file size */
> > +#define XFS_EOF_FLAGS_FLUSH (1 << 5) /* issue a flush */
> > #define XFS_EOF_FLAGS_VALID \
> > (XFS_EOF_FLAGS_SYNC | \
> > XFS_EOF_FLAGS_UID | \
> > XFS_EOF_FLAGS_GID | \
> > XFS_EOF_FLAGS_PRID | \
> > - XFS_EOF_FLAGS_MINFILESIZE)
> > + XFS_EOF_FLAGS_MINFILESIZE | \
> > + XFS_EOF_FLAGS_FLUSH)
> >
> >
> > /*
> > diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c
> > index 7ff59c9..d4e15db 100644
> > --- a/fs/xfs/xfs_icache.c
> > +++ b/fs/xfs/xfs_icache.c
> > @@ -1231,6 +1231,9 @@ xfs_inode_free_eofblocks(
> > if (eofb->eof_flags & XFS_EOF_FLAGS_MINFILESIZE &&
> > XFS_ISIZE(ip) < eofb->eof_min_file_size)
> > return 0;
> > +
> > + if (eofb->eof_flags & XFS_EOF_FLAGS_FLUSH)
> > + filemap_flush(VFS_I(ip)->i_mapping);
>
> So this does WB_SYNC_NONE writeback, which means the filesystem is
> free to ignore it when we get to .writepage. Given that we are are
> ENOSPC here, wouldn't it be better to guarantee that writeback will
> occur (i.e. use filemap_fdatawrite())?
>
Yeah, I didn't catch that. That makes sense, thanks.
Brian
> Cheers,
>
> Dave.
> --
> Dave Chinner
> david@xxxxxxxxxxxxx
|