public inbox for linux-xfs@vger.kernel.org
 help / color / mirror / Atom feed
From: Anand Tiwari <tiwarikanand@gmail.com>
To: Dave Chinner <david@fromorbit.com>
Cc: Eric Sandeen <sandeen@sandeen.net>,
	Anand Tiwari <tiwarikanand@gmail.com>,
	xfs@oss.sgi.com
Subject: Re: xfs_repair deleting realtime files.
Date: Tue, 2 Oct 2012 10:47:18 -0600 (MDT)	[thread overview]
Message-ID: <alpine.DEB.2.02.1210021039330.21488@artemis> (raw)
In-Reply-To: <20121002005906.GL23520@dastard>



On Tue, 2 Oct 2012, Dave Chinner wrote:

> On Sat, Sep 29, 2012 at 04:49:03PM -0600, Anand Tiwari wrote:
> > Subject: [PATCH] xfs_repair: detect realtime extent shared by multiple
> >  records in extent map
> >
> > XFS currently can have records in extent map, which starts from unaligned start block w.r.t rextsize.
> > xfs_repair considers this as a bug (multiple claims for a real-time extent) and deletes the file.
> > This patch addresses the issue, by comparing current and previous records and make sure they are
> > contiguous and not overlapped.
> >
> > Signed-off-by: Anand Tiwari <anand.tiwari@linux.com>
> > ---
> >  repair/dinode.c |   37 ++++++++++++++++++++++++++++++++++---
> >  1 file changed, 34 insertions(+), 3 deletions(-)
> >
> > diff --git a/repair/dinode.c b/repair/dinode.c
> > index 5a2da39..5537f1c 100644
> > --- a/repair/dinode.c
> > +++ b/repair/dinode.c
> > @@ -406,6 +406,7 @@ verify_agbno(xfs_mount_t	*mp,
> >  static int
> >  process_rt_rec(
> >  	xfs_mount_t		*mp,
> > +	xfs_bmbt_irec_t 	*prev,
> >  	xfs_bmbt_irec_t 	*irec,
> >  	xfs_ino_t		ino,
> >  	xfs_drfsbno_t		*tot,
> > @@ -413,8 +414,11 @@ process_rt_rec(
> >  {
> >  	xfs_dfsbno_t		b;
> >  	xfs_drtbno_t		ext;
> > +	xfs_drtbno_t		start_block;
> > +	xfs_filblks_t		block_count;
> >  	int			state;
> >  	int			pwe;		/* partially-written extent */
> > +	int 			rtext_remainder;	/* start block is not aligned w.r.t rextsize */
> >
> >  	/*
> >  	 * check numeric validity of the extent
> > @@ -461,12 +465,32 @@ _("malformed rt inode extent [%" PRIu64 " %" PRIu64 "] (fs rtext size = %u)\n"),
> >  		return 1;
> >  	}
> >
> > +	/* If we have start of record unaligned w.r.t to rextsize, see
> > +	 * if we are sharing this realtime extent with previous record. sharing is only
> > +	 * allowed with previous extent. fail otherwise.
> > +	 * Also, we above condition is true, align start block and block count
> > +	 */
>
> Comment format is:
>
> /*
>  * this is a
>  * multiline comment
>  */
>
> > +	rtext_remainder = irec->br_startblock % mp->m_sb.sb_rextsize;
> > +	if (rtext_remainder) {
> > +		do_warn(
> > +_("data fork in rt ino %" PRIu64 " has unalinged start block %"PRIu64 "\n"),
>                                           unaligned
>
> > +		ino,
> > +		irec->br_startblock);
>
> indent these a bit so the fact they are part of the do_warn function
> call is obvious. i.e.
>
> 		do_warn(
> 				<format string>
> 			ino, irec->br_startblock);
>
> > +		if ((prev->br_startoff + prev->br_blockcount == irec->br_startoff) &&
> > +		    (prev->br_startblock + prev->br_blockcount == irec->br_startblock)) {
> > +			start_block = irec->br_startblock + (mp->m_sb.sb_rextsize - rtext_remainder);
> > +			block_count = irec->br_blockcount - (mp->m_sb.sb_rextsize - rtext_remainder);
> > +		}
> > +	} else {
> > +		start_block = irec->br_startblock;
> > +		block_count = irec->br_blockcount;
> > +	}
>
> So this just changes the loop below not to check the first part of
> the new extent and therefore avoid the duplicate extent usage
> detection?
>
> Any plans to correct the bmapbt extents so that repeated repair runs
> don't keep warning about the same problem?
>

I was planning on fixing kernel code first and tackle this later. Let me
know if you guys think otherwise.

> > +
> >  	/*
> >  	 * set the appropriate number of extents
> >  	 * this iterates block by block, this can be optimised using extents
> >  	 */
> > -	for (b = irec->br_startblock; b < irec->br_startblock +
> > -			irec->br_blockcount; b += mp->m_sb.sb_rextsize)  {
> > +	for (b = start_block; b < start_block + block_count; b += mp->m_sb.sb_rextsize)  {
> >  		ext = (xfs_drtbno_t) b / mp->m_sb.sb_rextsize;
> >  		pwe = xfs_sb_version_hasextflgbit(&mp->m_sb) &&
> >  				irec->br_state == XFS_EXT_UNWRITTEN &&
> > @@ -548,6 +572,7 @@ process_bmbt_reclist_int(
> >  	int			check_dups,
> >  	int			whichfork)
> >  {
> > +	xfs_bmbt_irec_t		prev;
> >  	xfs_bmbt_irec_t		irec;
> >  	xfs_dfilblks_t		cp = 0;		/* prev count */
> >  	xfs_dfsbno_t		sp = 0;		/* prev start */
> > @@ -574,6 +599,11 @@ process_bmbt_reclist_int(
> >  	else
> >  		ftype = _("regular");
> >
> > +	prev.br_startoff = 0;
> > +	prev.br_blockcount = 0;
> > +	prev.br_startblock = 0;
> > +	prev.br_state = 0;
>
> 	memset(&prev, 0, sizeof(prev));
>

which one is more preferred in XFS land,
a) 	xfs_bmbt_irec_t		prev = {0};
b)	memset(&prev, 0, sizeof(prev));

my vote is "a". I already addressed other suggestions.

> Cheers,
>
> Dave.
> --
> Dave Chinner
> david@fromorbit.com
>

thanks a bunch,
anand

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

      reply	other threads:[~2012-10-02 18:35 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-21  0:40 xfs_repair deleting realtime files Anand Tiwari
2012-09-21  5:00 ` Eric Sandeen
2012-09-21 15:51   ` Anand Tiwari
2012-09-21 16:07     ` Eric Sandeen
2012-09-21 16:40       ` Anand Tiwari
2012-09-24  7:55   ` Dave Chinner
2012-09-24 12:51     ` Anand Tiwari
2012-09-26  1:26       ` Anand Tiwari
2012-09-26  2:44         ` Dave Chinner
2012-09-26  3:45           ` Anand Tiwari
2012-09-26  6:17             ` Dave Chinner
2012-09-28  1:27               ` Anand Tiwari
2012-09-28  6:47                 ` Dave Chinner
2012-09-29 22:49                   ` Anand Tiwari
2012-10-02  0:59                     ` Dave Chinner
2012-10-02 16:47                       ` Anand Tiwari [this message]

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=alpine.DEB.2.02.1210021039330.21488@artemis \
    --to=tiwarikanand@gmail.com \
    --cc=david@fromorbit.com \
    --cc=sandeen@sandeen.net \
    --cc=xfs@oss.sgi.com \
    /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