[Top] [All Lists]

Re: [PATCH] xfs_repair: open filesystem device exclusively

To: xfs@xxxxxxxxxxx
Subject: Re: [PATCH] xfs_repair: open filesystem device exclusively
From: "Nathaniel W. Turner" <nate@xxxxxxxxxxxxxxx>
Date: Sun, 08 Mar 2009 23:50:02 -0400
In-reply-to: <49B48B8E.3030602@xxxxxxxxxxxxxxx>
References: <49B48B8E.3030602@xxxxxxxxxxxxxxx>
User-agent: Thunderbird (X11/20090105)
I forgot to mention that this is against xfsprogs 3.0.0.  Also, the
indentation was a bit messed up on that last post, so here's the patch
again (all 2 lines of it):


I'm sure there is a better way to fix this, but without this patch, two
xfs_repair processes will happily operate on the same filesystem device
at the same time.  It is also possible to mount a filesystem that is in
the process of being repaired.

This seems like it's probably not ideal, so this patch just modifies
xfs_repair to open the filesystem device with O_EXCL unless it was
invoked in "no modify" or "dangerous" mode.

The net effect is that a 2nd xfs_repair will now safely fail with
"xfs_repair: cannot open /dev/foo: Device or resource busy", and a mount
command will fail with (the slightly cryptic) "mount: /dev/foo already
mounted or /mountpoint busy".

Note that this has no effect if the filesystem is stored in a regular
file instead of on a block device.

(Error messages could probably be improved to be more user-friendly in
this new failure case, and it probably wouldn't hurt to add a BLKROGET
ioctl to check for read-only block devices with read-write permissions,
but this does the job for me.)

Signed-off-by: Nathaniel W. Turner <nate@xxxxxxxxxxxxxxx>
 repair/init.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/repair/init.c b/repair/init.c
index 8e508c4..7e5052c 100644
--- a/repair/init.c
+++ b/repair/init.c
@@ -142,6 +142,8 @@ xfs_init(libxfs_init_t *args)
         args->isreadonly = (LIBXFS_ISREADONLY | LIBXFS_ISINACTIVE);
     else if (dangerously)
         args->isreadonly = (LIBXFS_ISINACTIVE | LIBXFS_DANGEROUSLY);
+    else
+        args->isreadonly = LIBXFS_EXCLUSIVELY;
     if (!libxfs_init(args))
         do_error(_("couldn't initialize XFS library\n"));

Nathaniel W. Turner

<Prev in Thread] Current Thread [Next in Thread>