Message ID | 20200320025255.1705972-2-tytso@mit.edu (mailing list archive) |
---|---|
State | Deferred, archived |
Headers | show |
Series | [1/2] writeback: avoid double-writing the inode on a lazytime expiration | expand |
Christoph, Dave --- does this give you the notification that you were looking such that XFS could get the notification desired that it was the timestamps need to be written back? - Ted On Thu, Mar 19, 2020 at 10:52:55PM -0400, Theodore Ts'o wrote: > Use the flag I_DIRTY_TIME_EXPIRED passed to dirty_inode() to signal to > the file system that it is time to flush the inode's timestamps to > stable storage. > > Signed-off-by: Theodore Ts'o <tytso@mit.edu> > --- > fs/fs-writeback.c | 2 +- > fs/xfs/xfs_super.c | 3 ++- > 2 files changed, 3 insertions(+), 2 deletions(-) > > diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c > index 867454997c9d..32101349ba97 100644 > --- a/fs/fs-writeback.c > +++ b/fs/fs-writeback.c > @@ -1506,7 +1506,7 @@ __writeback_single_inode(struct inode *inode, struct writeback_control *wbc) > > /* This was a lazytime expiration; we need to tell the file system */ > if (dirty & I_DIRTY_TIME_EXPIRED && inode->i_sb->s_op->dirty_inode) > - inode->i_sb->s_op->dirty_inode(inode, I_DIRTY_SYNC); > + inode->i_sb->s_op->dirty_inode(inode, I_DIRTY_TIME_EXPIRED); > /* Don't write the inode if only I_DIRTY_PAGES was set */ > if (dirty & ~I_DIRTY_PAGES) { > int err = write_inode(inode, wbc); > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index 2094386af8ac..f27b9b205f81 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -622,7 +622,8 @@ xfs_fs_dirty_inode( > > if (!(inode->i_sb->s_flags & SB_LAZYTIME)) > return; > - if (flag != I_DIRTY_SYNC || !(inode->i_state & I_DIRTY_TIME)) > + if ((flag != I_DIRTY_SYNC && flag != I_DIRTY_TIME_EXPIRED) || > + !(inode->i_state & I_DIRTY_TIME)) > return; > > if (xfs_trans_alloc(mp, &M_RES(mp)->tr_fsyncts, 0, 0, 0, &tp)) > -- > 2.24.1 >
On Mon, Mar 23, 2020 at 01:58:38PM -0400, Theodore Y. Ts'o wrote: > Christoph, Dave --- does this give you the notification that you were > looking such that XFS could get the notification desired that it was > the timestamps need to be written back? I need to look at it in more detail as it seems convoluted. Also the order seems like you regress XFS in patch 1 and then fix it in patch 2?
On Tue, Mar 24, 2020 at 01:37:59AM -0700, Christoph Hellwig wrote: > On Mon, Mar 23, 2020 at 01:58:38PM -0400, Theodore Y. Ts'o wrote: > > Christoph, Dave --- does this give you the notification that you were > > looking such that XFS could get the notification desired that it was > > the timestamps need to be written back? > > I need to look at it in more detail as it seems convoluted. Also the > order seems like you regress XFS in patch 1 and then fix it in patch 2? In patch one we send I_DIRTY_SYNC as we had been doing as before. So I don't believe that patch #1 would regress XFS; can you confirm? My thinking was to move ahead with patch 1 so that it fixed the bug which Eric Biffers had reported for f2fs, but only to move forward with patch #2 if it would be useful for XFS. Cheers, - Ted
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 867454997c9d..32101349ba97 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -1506,7 +1506,7 @@ __writeback_single_inode(struct inode *inode, struct writeback_control *wbc) /* This was a lazytime expiration; we need to tell the file system */ if (dirty & I_DIRTY_TIME_EXPIRED && inode->i_sb->s_op->dirty_inode) - inode->i_sb->s_op->dirty_inode(inode, I_DIRTY_SYNC); + inode->i_sb->s_op->dirty_inode(inode, I_DIRTY_TIME_EXPIRED); /* Don't write the inode if only I_DIRTY_PAGES was set */ if (dirty & ~I_DIRTY_PAGES) { int err = write_inode(inode, wbc); diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 2094386af8ac..f27b9b205f81 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -622,7 +622,8 @@ xfs_fs_dirty_inode( if (!(inode->i_sb->s_flags & SB_LAZYTIME)) return; - if (flag != I_DIRTY_SYNC || !(inode->i_state & I_DIRTY_TIME)) + if ((flag != I_DIRTY_SYNC && flag != I_DIRTY_TIME_EXPIRED) || + !(inode->i_state & I_DIRTY_TIME)) return; if (xfs_trans_alloc(mp, &M_RES(mp)->tr_fsyncts, 0, 0, 0, &tp))
Use the flag I_DIRTY_TIME_EXPIRED passed to dirty_inode() to signal to the file system that it is time to flush the inode's timestamps to stable storage. Signed-off-by: Theodore Ts'o <tytso@mit.edu> --- fs/fs-writeback.c | 2 +- fs/xfs/xfs_super.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-)