On Fri, Aug 23, 2024 at 07:04:36PM +0800, Long Li wrote: > Deleting items from the AIL before the log is shut down can result in the > log tail moving forward in the journal on disk because log writes can still > be taking place. As a result, items that have been deleted from the AIL > might not be recovered during the next mount, even though they should be, > as they were never written back to disk. > > Signed-off-by: Long Li <leo.lilong@xxxxxxxxxx> > --- > fs/xfs/xfs_dquot.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c > index c1b211c260a9..4cbe3db6fc32 100644 > --- a/fs/xfs/xfs_dquot.c > +++ b/fs/xfs/xfs_dquot.c > @@ -1332,9 +1332,15 @@ xfs_qm_dqflush( > return 0; > > out_abort: > + /* > + * Shutdown first to stop the log before deleting items from the AIL. > + * Deleting items from the AIL before the log is shut down can result > + * in the log tail moving forward in the journal on disk because log > + * writes can still be taking place. > + */ > + xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); > dqp->q_flags &= ~XFS_DQFLAG_DIRTY; > xfs_trans_ail_delete(lip, 0); > - xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); I see the logic in shutting down the log before letting go of the dquot log item that triggered the shutdown, but I wonder, why do we delete the item from the AIL? AFAICT the inode items don't do that on iflush failure, but OTOH I couldn't figure out how the log items in the AIL get deleted from the AIL after a shutdown. Or maybe during a shutdown we just stop xfsaild and let the higher level objects free the log items during reclaim? --D > out_unlock: > xfs_dqfunlock(dqp); > return error; > -- > 2.39.2 > >