On Wed, Nov 29, 2023 at 03:58:31PM +0800, Jiachen Zhang wrote: > In the case of returning -ENOSPC, ensure logflagsp is initialized by 0. > Otherwise the caller __xfs_bunmapi will set uninitialized illegal > tmp_logflags value into xfs log, which might cause unpredictable error > in the log recovery procedure. > > Also, remove the flags variable and set the *logflagsp directly, so that > the code should be more robust in the long run. > > Fixes: 1b24b633aafe ("xfs: move some more code into xfs_bmap_del_extent_real") > Signed-off-by: Jiachen Zhang <zhangjiachen.jaycee@xxxxxxxxxxxxx> > Reviewed-by: Christoph Hellwig <hch@xxxxxx> > --- > fs/xfs/libxfs/xfs_bmap.c | 26 ++++++++++++++------------ > 1 file changed, 14 insertions(+), 12 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c > index be62acffad6c..9435bd6c950b 100644 > --- a/fs/xfs/libxfs/xfs_bmap.c > +++ b/fs/xfs/libxfs/xfs_bmap.c > @@ -5010,7 +5010,6 @@ xfs_bmap_del_extent_real( > xfs_fileoff_t del_endoff; /* first offset past del */ > int do_fx; /* free extent at end of routine */ > int error; /* error return value */ > - int flags = 0;/* inode logging flags */ > struct xfs_bmbt_irec got; /* current extent entry */ > xfs_fileoff_t got_endoff; /* first offset past got */ > int i; /* temp state */ > @@ -5023,6 +5022,8 @@ xfs_bmap_del_extent_real( > uint32_t state = xfs_bmap_fork_to_state(whichfork); > struct xfs_bmbt_irec old; > > + *logflagsp = 0; > + > mp = ip->i_mount; > XFS_STATS_INC(mp, xs_del_exlist); > > @@ -5048,10 +5049,12 @@ xfs_bmap_del_extent_real( > if (tp->t_blk_res == 0 && > ifp->if_format == XFS_DINODE_FMT_EXTENTS && > ifp->if_nextents >= XFS_IFORK_MAXEXT(ip, whichfork) && > - del->br_startoff > got.br_startoff && del_endoff < got_endoff) > - return -ENOSPC; > + del->br_startoff > got.br_startoff && del_endoff < got_endoff) { > + error = -ENOSPC; > + goto done; > + } Now that you've added initialisation of logflagsp, the need for the error stacking goto pattern goes away completely. Anywhere that has a "goto done" can be converted to a direct 'return error' call and the done label can be removed. -Dave. -- Dave Chinner david@xxxxxxxxxxxxx