All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alex Elder <aelder@sgi.com>
To: Dave Chinner <david@fromorbit.com>
Cc: xfs@oss.sgi.com
Subject: Re: [PATCH] repair: handle repair of image files on large sector size filesystems
Date: Thu, 11 Aug 2011 10:46:42 -0500	[thread overview]
Message-ID: <1313077602.2899.29.camel@doink> (raw)
In-Reply-To: <1312772354-9059-1-git-send-email-david@fromorbit.com>

On Mon, 2011-08-08 at 12:59 +1000, Dave Chinner wrote:
> From: Dave Chinner <dchinner@redhat.com>
> 
> Because repair uses direct IO, it cannot do IO smaller than a sector
> on the underlying device. When repairing a filesystem image, the
> filesystem hosting the image may have a sector size larger than the
> sector size of the image, and so single image sector reads and
> writes will fail.
> 
> To avoid this, when checking a file and there is a sector size
> mismatch like this, turn off direct IO. While there, fix a compile
> bug in the IO_DEBUG option for libxfs which was found during triage.
> 
> Signed-off-by: Dave Chinner <dchinner@redhat.com>

Looks good, but I have a few pretty minor things I think
you should consider fixing before you commit.

Reviewed-by: Alex Elder <aelder@sgi.com>

. . .

> diff --git a/repair/sb.c b/repair/sb.c
> index 0ee2345..c8df076 100644
> --- a/repair/sb.c
> +++ b/repair/sb.c
> @@ -689,7 +689,14 @@ verify_set_primary_sb(xfs_sb_t		*rsb,
>  	 */
>  	num_sbs = MIN(NUM_SBS, rsb->sb_agcount);
>  	skip = howmany(num_sbs, rsb->sb_agcount);
> -	size = NUM_AGH_SECTS * rsb->sb_sectsize;
> +
> +	/*
> +	 * We haven't been able to validate the sector size yet properly
> +	 * (e.g. in the case of repairing an image in a file), so we need to
> +	 * take into account sector mismatches and so use the maximum possible
> +	 * sector size rather than that in @rsb.

How about "rather than the sector size in @rsb".

What you have is OK, but my parser had to backtrack
to be sure I knew what "that" was referring to.

> +	 */
> +	size = NUM_AGH_SECTS * (1 << (XFS_MAX_SECTORSIZE_LOG));
>  	retval = 0;
>  	list = NULL;
>  	num_ok = 0;
> diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c
> index 4707b83..dda9daa 100644
> --- a/repair/xfs_repair.c
> +++ b/repair/xfs_repair.c
> @@ -569,6 +569,36 @@ main(int argc, char **argv)
>  	memset(&xfs_m, 0, sizeof(xfs_mount_t));
>  	libxfs_sb_from_disk(&xfs_m.m_sb, XFS_BUF_TO_SBP(sbp));
>  
> +	/*
> +	 * if the sector size of the filesystem we are trying to repair is
> +	 * smaller than that of the underlying filesystem (i.e. we are repairing
> +	 * an image), the we have to turn off direct IO because we cannot do IO
> +	 * smaller than the host filesystem's sector size.
> +	 */
> +	if (isa_file) {
> +		int     fd = libxfs_device_to_fd(x.ddev);
> +		struct xfs_fsop_geom_v1 geom = {
> +			.sectsize = BBSIZE,

Why do you fill in sectsize here?  I don't know that
you're guaranteed it will still be intact if the ioctl()
below fails.  If that's your reason I'd prefer to see it
filled in after the do_warn() call.

> +		};
> +
> +		if (ioctl(fd, XFS_IOC_FSGEOMETRY_V1, &geom) < 0) {
> +			do_warn(_("Cannot get host fiesystem geometry.\n"
                                                    filesystem
> +		"Repair may fail if there is a sector size mismatch between "
                     Put a newline at the end of this line too...
> +		"the image and the host filesystem.\n"));
                     ...otherwise the combination is a pretty long line.
> +		}
> +
> +		if (xfs_m.m_sb.sb_sectsize < geom.sectsize) {
> +			long	old_flags;
> +
> +			old_flags = fcntl(fd, F_GETFL, 0);

Maybe don't bother turning off direct I/O if it's not
already set in old_flags.

> +			if (fcntl(fd, F_SETFL, old_flags & ~O_DIRECT) < 0) {
> +				do_warn(_(
> +		"Sector size on host filesystem larger than image sector size.\n"
> +		"Cannot turn off direct IO, so exiting.\n"));
> +				exit(1);
> +			}
> +		}
> +	}
>  	mp = libxfs_mount(&xfs_m, &xfs_m.m_sb, x.ddev, x.logdev, x.rtdev, 0);
>  
>  	if (!mp)  {



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

      reply	other threads:[~2011-08-11 15:46 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-08-08  2:59 [PATCH] repair: handle repair of image files on large sector size filesystems Dave Chinner
2011-08-11 15:46 ` Alex Elder [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=1313077602.2899.29.camel@doink \
    --to=aelder@sgi.com \
    --cc=david@fromorbit.com \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.