From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from userp2120.oracle.com ([156.151.31.85]:33978 "EHLO userp2120.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751553AbeDMP7Z (ORCPT ); Fri, 13 Apr 2018 11:59:25 -0400 Date: Fri, 13 Apr 2018 08:59:17 -0700 From: "Darrick J. Wong" Subject: Re: [PATCH V3] xfs: enhance dinode verifier Message-ID: <20180413155917.GD32099@magnolia> References: <1ffdb61f-d642-1310-a5df-0f166d90aa28@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1ffdb61f-d642-1310-a5df-0f166d90aa28@sandeen.net> Sender: linux-xfs-owner@vger.kernel.org List-ID: List-Id: xfs To: Eric Sandeen Cc: Eric Sandeen , linux-xfs , wen.xu@gatech.edu On Fri, Apr 13, 2018 at 10:54:14AM -0500, Eric Sandeen wrote: > Add several more validations to xfs_dinode_verify: > > - For LOCAL data fork formats, di_nextents must be 0. > - For LOCAL attr fork formats, di_anextents must be 0. > - For inodes with no attr fork offset, > - format must be XFS_DINODE_FMT_EXTENTS if set at all > - di_anextents must be 0. > > Thanks to dchinner for pointing out a couple related checks I had > forgotten to add. > > Signed-off-by: Eric Sandeen Looks ok, will try to figure out what the online repair ramifications are... Reviewed-by: Darrick J. Wong --D > --- > > V2: due credit > V3: clarify the no-offset / no-format cases in a comment > > diff --git a/fs/xfs/libxfs/xfs_inode_buf.c b/fs/xfs/libxfs/xfs_inode_buf.c > index ef68b1d..ee8ed90 100644 > --- a/fs/xfs/libxfs/xfs_inode_buf.c > +++ b/fs/xfs/libxfs/xfs_inode_buf.c > @@ -466,6 +466,8 @@ > return __this_address; > if (di_size > XFS_DFORK_DSIZE(dip, mp)) > return __this_address; > + if (dip->di_nextents) > + return __this_address; > /* fall through */ > case XFS_DINODE_FMT_EXTENTS: > case XFS_DINODE_FMT_BTREE: > @@ -484,12 +486,31 @@ > if (XFS_DFORK_Q(dip)) { > switch (dip->di_aformat) { > case XFS_DINODE_FMT_LOCAL: > + if (dip->di_anextents) > + return __this_address; > + /* fall through */ > case XFS_DINODE_FMT_EXTENTS: > case XFS_DINODE_FMT_BTREE: > break; > default: > return __this_address; > } > + } else { > + /* > + * If there is no fork offset, this may be a freshly-made inode > + * in a new disk cluster, in which case di_aformat is zeroed. > + * Otherwise, such an inode must be in EXTENTS format; this goes > + * for freed inodes as well. > + */ > + switch (dip->di_aformat) { > + case 0: > + case XFS_DINODE_FMT_EXTENTS: > + break; > + default: > + return __this_address; > + } > + if (dip->di_anextents) > + return __this_address; > } > > /* only version 3 or greater inodes are extensively verified here */ > > -- > To unsubscribe from this list: send the line "unsubscribe linux-xfs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html