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 should at least make things a bit safer.)
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..3d88b8b 100644
@@ -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);
+ args->isreadonly = LIBXFS_EXCLUSIVELY;
do_error(_("couldn't initialize XFS library\n"));
Nathaniel W. Turner