From: "Darrick J. Wong" <djwong@kernel.org>
To: Christoph Hellwig <hch@infradead.org>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH 3/7] xfs: repair inode records
Date: Tue, 28 Nov 2023 15:08:48 -0800 [thread overview]
Message-ID: <20231128230848.GD4167244@frogsfrogsfrogs> (raw)
In-Reply-To: <ZWYek3C/x7pLqRFj@infradead.org>
On Tue, Nov 28, 2023 at 09:08:35AM -0800, Christoph Hellwig wrote:
> > @@ -1012,7 +1012,8 @@ enum xfs_dinode_fmt {
> > #define XFS_DFORK_APTR(dip) \
> > (XFS_DFORK_DPTR(dip) + XFS_DFORK_BOFF(dip))
> > #define XFS_DFORK_PTR(dip,w) \
> > - ((w) == XFS_DATA_FORK ? XFS_DFORK_DPTR(dip) : XFS_DFORK_APTR(dip))
> > + ((void *)((w) == XFS_DATA_FORK ? XFS_DFORK_DPTR(dip) : \
> > + XFS_DFORK_APTR(dip)))
>
> Not requiring a cast when using XFS_DFORK_PTR is a good thing, but I
> think this is the wrong way to do it. Instead of adding another cast
> here we can just change the char * cast in XFS_DFORK_DPTR to a void *
> one and rely on the widely used void pointer arithmetics extension in
> gcc (and clang).
Ok.
> That'll also need a fixup to use a void instead of
> char * cast in xchk_dinode.
I'll change the conditional to:
if (XFS_DFORK_BOFF(dip) >= mp->m_sb.sb_inodesize)
> And in the long run many of these helpers relly should become inline
> functions..
>
> > + /* no large extent counts without the filesystem feature */
> > + if ((flags2 & XFS_DIFLAG2_NREXT64) && !xfs_has_large_extent_counts(mp))
> > + goto bad;
>
> This is just a missing check and not really related to repair, is it?
Yep. I guess I'll pull that out into a separate patch.
> > + /*
> > + * The only information that needs to be passed between inode scrub and
> > + * repair is the location of the ondisk metadata if iget fails. The
> > + * rest of struct xrep_inode is context data that we need to massage
> > + * the ondisk inode to the point that iget will work, which means that
> > + * we don't allocate anything at all if the incore inode is loaded.
> > + */
> > + if (!imap)
> > + return 0;
>
> I don't really understand why this comment is here, and how it relates
> to the imap NULL check. But as the only caller passes the address of an
> on-stack imap I also don't understand why the check is here to start
> with.
Hmm. I think I've been through too many iterations of this code -- at
one point I remember the null check was actually useful for something.
But now it's not, so it can go.
>
> > + for (i = 0; i < ni; i++) {
> > + ioff = i << mp->m_sb.sb_inodelog;
> > + dip = xfs_buf_offset(bp, ioff);
> > + agino = be32_to_cpu(dip->di_next_unlinked);
> > +
> > + unlinked_ok = magic_ok = crc_ok = false;
>
> I'd split the body of this loop into a separate helper and keep a lot of
> the variables local to it.
Ok.
> > +/* Reinitialize things that never change in an inode. */
> > +STATIC void
> > +xrep_dinode_header(
> > + struct xfs_scrub *sc,
> > + struct xfs_dinode *dip)
> > +{
> > + trace_xrep_dinode_header(sc, dip);
> > +
> > + dip->di_magic = cpu_to_be16(XFS_DINODE_MAGIC);
> > + if (!xfs_dinode_good_version(sc->mp, dip->di_version))
> > + dip->di_version = 3;
>
> Can we ever end up here for v4 file systems? Because in that case
> the sane default inode version would be 2.
No. xchk_validate_inputs will reject IFLAG_REPAIR on a V4 fs. Those
are deprecated, there's no point in going back.
> > +
> > +/* Turn di_mode into /something/ recognizable. */
> > +STATIC void
> > +xrep_dinode_mode(
> > + struct xfs_scrub *sc,
> > + struct xfs_dinode *dip)
> > +{
> > + uint16_t mode;
> > +
> > + trace_xrep_dinode_mode(sc, dip);
> > +
> > + mode = be16_to_cpu(dip->di_mode);
> > + if (mode == 0 || xfs_mode_to_ftype(mode) != XFS_DIR3_FT_UNKNOWN)
>
> This is a somewhat odd way to check for a valid mode, but it works, so..
:)
> > + if (xfs_has_reflink(mp) && S_ISREG(mode))
> > + flags2 |= XFS_DIFLAG2_REFLINK;
>
> We set the reflink flag by default, because a later stage will clear
> it if there aren't any shared blocks, right? Maybe add a comment to
> avoid any future confusion.
/*
* For regular files on a reflink filesystem, set the REFLINK flag to
* protect shared extents. A later stage will actually check those
* extents and clear the flag if possible.
*/
>
> > +STATIC void
> > +xrep_dinode_zap_symlink(
> > + struct xfs_scrub *sc,
> > + struct xfs_dinode *dip)
> > +{
> > + char *p;
> > +
> > + trace_xrep_dinode_zap_symlink(sc, dip);
> > +
> > + dip->di_format = XFS_DINODE_FMT_LOCAL;
> > + dip->di_size = cpu_to_be64(1);
> > + p = XFS_DFORK_PTR(dip, XFS_DATA_FORK);
> > + *p = '.';
>
> Hmm, changing a symlink to actually point somewhere seems very
> surprising, but making it point to the current directory almost begs
> for userspace code to run in loops.
How about '🤷'? That's only four bytes.
Or maybe a question mark.
> > +}
> > +
> > +/*
> > + * Blow out dir, make it point to the root. In the future repair will
> > + * reconstruct this directory for us. Note that there's no in-core directory
> > + * inode because the sf verifier tripped, so we don't have to worry about the
> > + * dentry cache.
> > + */
>
> "make it point to root" isn't what I read in the code below. I parents
> it in root I think.
Yes. Changed to "Blow out dir, make the parent point to the root."
> > +/* Make sure we don't have a garbage file size. */
> > +STATIC void
> > +xrep_dinode_size(
> > + struct xfs_scrub *sc,
> > + struct xfs_dinode *dip)
> > +{
> > + uint64_t size;
> > + uint16_t mode;
> > +
> > + trace_xrep_dinode_size(sc, dip);
> > +
> > + mode = be16_to_cpu(dip->di_mode);
> > + size = be64_to_cpu(dip->di_size);
>
> Any reason to not simplify initialize the variables at declaration
> time? (Same for a while bunch of other functions / variables)
No, not really. Will fix.
> > + if (xfs_has_reflink(sc->mp)) {
> > + ; /* data fork blockcount can exceed physical storage */
>
> ... because we would be reflinking the same blocks into the same inode
> at different offsets over and over again ... ?
Yes. That's not a terribly functional file, but users can do such
things if they want to pay for the cpu/metadata.
> Still, shouldn't we limit the condition to xfs_is_reflink_inode?
Yep.
> > +/* Check for invalid uid/gid/prid. */
> > +STATIC void
> > +xrep_inode_ids(
> > + struct xfs_scrub *sc)
> > +{
> > + bool dirty = false;
> > +
> > + trace_xrep_inode_ids(sc);
> > +
> > + if (i_uid_read(VFS_I(sc->ip)) == -1U) {
>
> What is invalid about all-F uid/gid/projid?
I thought those were invalid, though apparently they're not now?
uidgid.h says:
static inline bool uid_valid(kuid_t uid)
{
return __kuid_val(uid) != (uid_t) -1;
}
Which is why I thought that it's not possible to have a uid of -1 on a
file. Trying to set that uid on a file causes the kernel to reject the
value, but OTOH I can apparently create inodes with a -1 UID via
idmapping shenanigans.
<shrug>
> > + tstamp = inode_get_atime(inode);
> > + xrep_clamp_timestamp(ip, &tstamp);
> > + inode_set_atime_to_ts(inode, tstamp);
>
> Meh, I hate these new VFS timestamp access helper..
They're very clunky.
> > + /* Find the last block before 32G; this is the dir size. */
> > + error = xfs_iread_extents(sc->tp, sc->ip, XFS_DATA_FORK);
>
> I think that comments needs to go down to the off asignment and
> xfs_iext_lookup_extent_before call.
Done.
> > +/*
> > + * Fix any irregularities in an inode's size now that we can iterate extent
> > + * maps and access other regular inode data.
> > + */
> > +STATIC void
> > +xrep_inode_size(
> > + struct xfs_scrub *sc)
> > +{
> > + trace_xrep_inode_size(sc);
> > +
> > + /*
> > + * Currently we only support fixing size on extents or btree format
> > + * directories. Files can be any size and sizes for the other inode
> > + * special types are fixed by xrep_dinode_size.
> > + */
> > + if (!S_ISDIR(VFS_I(sc->ip)->i_mode))
> > + return;
>
> I think moving this check to the caller and renaming the function would
> be a bit nicer, especially if we grow more file type specific checks
> in the future.
That's the only one, so I'll rename it to xrep_inode_dir_size and hoist
this check to the caller.
> Otherwise this looks reasonable to me.
Woo, thanks for reading through all this. :)
--D
next prev parent reply other threads:[~2023-11-28 23:08 UTC|newest]
Thread overview: 152+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-24 23:39 [MEGAPATCHSET v28] xfs: online repair, second part of part 1 Darrick J. Wong
2023-11-24 23:44 ` [PATCHSET v28.0 0/1] xfs: prevent livelocks in xchk_iget Darrick J. Wong
2023-11-24 23:46 ` [PATCH 1/1] xfs: make xchk_iget safer in the presence of corrupt inode btrees Darrick J. Wong
2023-11-25 4:57 ` Christoph Hellwig
2023-11-27 21:55 ` Darrick J. Wong
2023-11-24 23:45 ` [PATCHSET v28.0 0/7] xfs: reserve disk space for online repairs Darrick J. Wong
2023-11-24 23:47 ` [PATCH 1/7] xfs: don't append work items to logged xfs_defer_pending objects Darrick J. Wong
2023-11-25 5:04 ` Christoph Hellwig
2023-11-24 23:47 ` [PATCH 2/7] xfs: allow pausing of pending deferred work items Darrick J. Wong
2023-11-25 5:05 ` Christoph Hellwig
2023-11-24 23:47 ` [PATCH 3/7] xfs: remove __xfs_free_extent_later Darrick J. Wong
2023-11-25 5:05 ` Christoph Hellwig
2023-11-24 23:47 ` [PATCH 4/7] xfs: automatic freeing of freshly allocated unwritten space Darrick J. Wong
2023-11-25 5:06 ` Christoph Hellwig
2023-11-24 23:48 ` [PATCH 5/7] xfs: implement block reservation accounting for btrees we're staging Darrick J. Wong
2023-11-26 13:14 ` Christoph Hellwig
2023-11-27 22:34 ` Darrick J. Wong
2023-11-28 5:41 ` Christoph Hellwig
2023-11-28 17:02 ` Darrick J. Wong
2023-11-24 23:48 ` [PATCH 6/7] xfs: log EFIs for all btree blocks being used to stage a btree Darrick J. Wong
2023-11-26 13:15 ` Christoph Hellwig
2023-11-24 23:48 ` [PATCH 7/7] xfs: force small EFIs for reaping btree extents Darrick J. Wong
2023-11-25 5:13 ` Christoph Hellwig
2023-11-27 22:46 ` Darrick J. Wong
2023-11-24 23:45 ` [PATCHSET v28.0 0/4] xfs: prepare repair for bulk loading Darrick J. Wong
2023-11-24 23:48 ` [PATCH 1/4] xfs: force all buffers to be written during btree bulk load Darrick J. Wong
2023-11-25 5:49 ` Christoph Hellwig
2023-11-28 1:50 ` Darrick J. Wong
2023-11-28 7:13 ` Christoph Hellwig
2023-11-28 15:18 ` Christoph Hellwig
2023-11-28 17:07 ` Darrick J. Wong
2023-11-30 4:33 ` Christoph Hellwig
2023-11-24 23:49 ` [PATCH 2/4] xfs: add debug knobs to control btree bulk load slack factors Darrick J. Wong
2023-11-25 5:50 ` Christoph Hellwig
2023-11-28 1:44 ` Darrick J. Wong
2023-11-28 5:42 ` Christoph Hellwig
2023-11-28 17:07 ` Darrick J. Wong
2023-11-24 23:49 ` [PATCH 3/4] xfs: move btree bulkload record initialization to ->get_record implementations Darrick J. Wong
2023-11-25 5:51 ` Christoph Hellwig
2023-11-24 23:49 ` [PATCH 4/4] xfs: constrain dirty buffers while formatting a staged btree Darrick J. Wong
2023-11-25 5:53 ` Christoph Hellwig
2023-11-27 22:56 ` Darrick J. Wong
2023-11-28 20:11 ` Darrick J. Wong
2023-11-29 5:50 ` Christoph Hellwig
2023-11-29 5:57 ` Darrick J. Wong
2023-11-24 23:45 ` [PATCHSET v28.0 0/5] xfs: online repair of AG btrees Darrick J. Wong
2023-11-24 23:50 ` [PATCH 1/5] xfs: create separate structures and code for u32 bitmaps Darrick J. Wong
2023-11-25 5:57 ` Christoph Hellwig
2023-11-28 1:34 ` Darrick J. Wong
2023-11-28 5:43 ` Christoph Hellwig
2023-11-24 23:50 ` [PATCH 2/5] xfs: roll the scrub transaction after completing a repair Darrick J. Wong
2023-11-25 6:05 ` Christoph Hellwig
2023-11-28 1:29 ` Darrick J. Wong
2023-11-24 23:50 ` [PATCH 3/5] xfs: repair free space btrees Darrick J. Wong
2023-11-25 6:11 ` Christoph Hellwig
2023-11-28 1:05 ` Darrick J. Wong
2023-11-28 15:10 ` Christoph Hellwig
2023-11-28 21:13 ` Darrick J. Wong
2023-11-29 5:56 ` Christoph Hellwig
2023-11-29 6:18 ` Darrick J. Wong
2023-11-29 6:24 ` Christoph Hellwig
2023-11-29 6:26 ` Darrick J. Wong
2023-11-24 23:50 ` [PATCH 4/5] xfs: repair inode btrees Darrick J. Wong
2023-11-25 6:12 ` Christoph Hellwig
2023-11-28 1:09 ` Darrick J. Wong
2023-11-28 15:57 ` Christoph Hellwig
2023-11-28 21:37 ` Darrick J. Wong
2023-11-24 23:51 ` [PATCH 5/5] xfs: repair refcount btrees Darrick J. Wong
2023-11-28 16:07 ` Christoph Hellwig
2023-11-24 23:45 ` [PATCHSET v28.0 0/7] xfs: online repair of inodes and forks Darrick J. Wong
2023-11-24 23:51 ` [PATCH 1/7] xfs: disable online repair quota helpers when quota not enabled Darrick J. Wong
2023-11-25 6:13 ` Christoph Hellwig
2023-11-24 23:51 ` [PATCH 2/7] xfs: try to attach dquots to files before repairing them Darrick J. Wong
2023-11-25 6:14 ` Christoph Hellwig
2023-11-24 23:51 ` [PATCH 3/7] xfs: repair inode records Darrick J. Wong
2023-11-28 17:08 ` Christoph Hellwig
2023-11-28 23:08 ` Darrick J. Wong [this message]
2023-11-29 6:02 ` Christoph Hellwig
2023-12-05 23:08 ` Darrick J. Wong
2023-12-06 5:16 ` Christoph Hellwig
2023-11-24 23:52 ` [PATCH 4/7] xfs: zap broken inode forks Darrick J. Wong
2023-11-30 4:44 ` Christoph Hellwig
2023-11-30 21:08 ` Darrick J. Wong
2023-12-04 4:39 ` Christoph Hellwig
2023-12-04 20:43 ` Darrick J. Wong
2023-12-05 4:28 ` Christoph Hellwig
2023-11-24 23:52 ` [PATCH 5/7] xfs: abort directory parent scrub scans if we encounter a zapped directory Darrick J. Wong
2023-11-30 4:47 ` Christoph Hellwig
2023-11-30 21:37 ` Darrick J. Wong
2023-12-04 4:41 ` Christoph Hellwig
2023-12-04 20:44 ` Darrick J. Wong
2023-11-24 23:52 ` [PATCH 6/7] xfs: skip the rmapbt search on an empty attr fork unless we know it was zapped Darrick J. Wong
2023-11-24 23:52 ` [PATCH 7/7] xfs: repair obviously broken inode modes Darrick J. Wong
2023-11-30 4:49 ` Christoph Hellwig
2023-11-30 21:18 ` Darrick J. Wong
2023-12-04 4:42 ` Christoph Hellwig
2023-11-24 23:46 ` [PATCHSET v28.0 0/5] xfs: online repair of file fork mappings Darrick J. Wong
2023-11-24 23:53 ` [PATCH 1/5] xfs: reintroduce reaping of file metadata blocks to xrep_reap_extents Darrick J. Wong
2023-11-30 4:53 ` Christoph Hellwig
2023-11-30 21:48 ` Darrick J. Wong
2023-12-04 4:42 ` Christoph Hellwig
2023-11-24 23:53 ` [PATCH 2/5] xfs: repair inode fork block mapping data structures Darrick J. Wong
2023-11-30 5:07 ` Christoph Hellwig
2023-12-01 1:38 ` Darrick J. Wong
2023-11-24 23:53 ` [PATCH 3/5] xfs: refactor repair forcing tests into a repair.c helper Darrick J. Wong
2023-11-28 14:20 ` Christoph Hellwig
2023-11-29 5:42 ` Darrick J. Wong
2023-11-29 6:03 ` Christoph Hellwig
2023-11-24 23:53 ` [PATCH 4/5] xfs: create a ranged query function for refcount btrees Darrick J. Wong
2023-11-28 13:59 ` Christoph Hellwig
2023-11-24 23:54 ` [PATCH 5/5] xfs: repair problems in CoW forks Darrick J. Wong
2023-11-30 5:10 ` Christoph Hellwig
2023-11-24 23:46 ` [PATCHSET v28.0 0/6] xfs: online repair of rt bitmap file Darrick J. Wong
2023-11-24 23:54 ` [PATCH 1/6] xfs: check rt bitmap file geometry more thoroughly Darrick J. Wong
2023-11-28 14:04 ` Christoph Hellwig
2023-11-28 23:27 ` Darrick J. Wong
2023-11-29 6:05 ` Christoph Hellwig
2023-11-29 6:20 ` Darrick J. Wong
2023-11-24 23:54 ` [PATCH 2/6] xfs: check rt summary " Darrick J. Wong
2023-11-28 14:05 ` Christoph Hellwig
2023-11-28 23:30 ` Darrick J. Wong
2023-11-29 1:23 ` Darrick J. Wong
2023-11-29 6:05 ` Christoph Hellwig
2023-11-29 6:21 ` Darrick J. Wong
2023-11-29 6:23 ` Christoph Hellwig
2023-11-30 0:10 ` Darrick J. Wong
2023-11-24 23:54 ` [PATCH 3/6] xfs: always check the rtbitmap and rtsummary files Darrick J. Wong
2023-11-28 14:06 ` Christoph Hellwig
2023-11-24 23:55 ` [PATCH 4/6] xfs: repair the inode core and forks of a metadata inode Darrick J. Wong
2023-11-30 5:12 ` Christoph Hellwig
2023-11-24 23:55 ` [PATCH 5/6] xfs: create a new inode fork block unmap helper Darrick J. Wong
2023-11-25 6:17 ` Christoph Hellwig
2023-11-24 23:55 ` [PATCH 6/6] xfs: online repair of realtime bitmaps Darrick J. Wong
2023-11-30 5:16 ` Christoph Hellwig
2023-11-24 23:46 ` [PATCHSET v28.0 0/5] xfs: online repair of quota and rt metadata files Darrick J. Wong
2023-11-24 23:56 ` [PATCH 1/5] xfs: check the ondisk space mapping behind a dquot Darrick J. Wong
2023-11-30 5:17 ` Christoph Hellwig
2023-11-24 23:56 ` [PATCH 2/5] xfs: check dquot resource timers Darrick J. Wong
2023-11-30 5:17 ` Christoph Hellwig
2023-11-24 23:56 ` [PATCH 3/5] xfs: pull xfs_qm_dqiterate back into scrub Darrick J. Wong
2023-11-30 5:22 ` Christoph Hellwig
2023-11-24 23:56 ` [PATCH 4/5] xfs: improve dquot iteration for scrub Darrick J. Wong
2023-11-30 5:25 ` Christoph Hellwig
2023-11-24 23:57 ` [PATCH 5/5] xfs: repair quotas Darrick J. Wong
2023-11-30 5:33 ` Christoph Hellwig
2023-11-30 22:10 ` Darrick J. Wong
2023-12-04 4:48 ` Christoph Hellwig
2023-12-04 20:52 ` Darrick J. Wong
2023-12-05 4:27 ` Christoph Hellwig
2023-12-05 5:20 ` Darrick J. Wong
2023-12-04 4:49 ` Christoph Hellwig
-- strict thread matches above, loose matches on Subject: below --
2023-09-26 23:30 [PATCHSET v27.0 0/7] xfs: online repair of inodes and forks Darrick J. Wong
2023-09-26 23:35 ` [PATCH 3/7] xfs: repair inode records Darrick J. Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231128230848.GD4167244@frogsfrogsfrogs \
--to=djwong@kernel.org \
--cc=hch@infradead.org \
--cc=linux-xfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).