1
0
forked from pool/util-linux
Petr Uzel 2011-05-03 12:17:05 +00:00 committed by Git OBS Bridge
parent 71b5113d8b
commit bcb2ee8c13
5 changed files with 13 additions and 174 deletions

View File

@ -1,166 +0,0 @@
From f4612577c942a3683b97632ad0b49671897c2070 Mon Sep 17 00:00:00 2001
From: Petr Uzel <petr.uzel@suse.cz>
Date: Thu, 17 Feb 2011 12:52:43 +0100
Subject: [PATCH] umount: allow unmounting loopdev specified by associated file
Make it possible to unmount a filesystem on a loop device if it is
specified by associated backing file. It does not attempt to unmount
anything if there are more than one loop device associated with the
given file.
Umount looks for associated loopdevice(s) only if umount is called
with the regular file as an argument.
Before:
mount -o loop -t ext2 img mnt
umount -v img
> Could not find /home/puzel/upstream/util-linux/img in mtab
> umount: img: not mounted
After:
mount -o loop -t ext2 img mnt
umount -v img
> img is associated with /dev/loop0, trying to unmount it
> /dev/loop0 has been unmounted
[kzak@redhat.com: - fix memory leak in lomount.c]
Addresses: https://bugzilla.novell.com/show_bug.cgi?id=666161
Signed-off-by: Petr Uzel <petr.uzel@suse.cz>
Signed-off-by: Karel Zak <kzak@redhat.com>
---
mount/lomount.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
mount/lomount.h | 1 +
mount/umount.c | 22 ++++++++++++++++++++++
3 files changed, 76 insertions(+), 0 deletions(-)
Index: util-linux-2.19/mount/lomount.c
===================================================================
--- util-linux-2.19.orig/mount/lomount.c
+++ util-linux-2.19/mount/lomount.c
@@ -409,6 +409,51 @@ done:
return -1;
}
+/* Find loop device associated with given @filename. Used for unmounting loop
+ * device specified by associated backing file.
+ *
+ * returns: 1 no such device/error
+ * 2 more than one loop device associated with @filename
+ * 0 exactly one loop device associated with @filename
+ * (@loopdev points to string containing full device name)
+ */
+int
+find_loopdev_by_backing_file(const char *filename, char **loopdev)
+{
+ struct looplist ll;
+ struct stat filestat;
+ int fd;
+ int devs_n = 0; /* number of loop devices found */
+ char* devname = NULL;
+
+ if (stat(filename, &filestat) == -1) {
+ perror(filename);
+ return 1;
+ }
+
+ if (looplist_open(&ll, LLFLG_USEDONLY) == -1) {
+ error(_("%s: /dev directory does not exist."), progname);
+ return 1;
+ }
+
+ while((devs_n < 2) && (fd = looplist_next(&ll)) != -1) {
+ if (is_associated(fd, &filestat, 0, 0) == 1) {
+ if (!devname)
+ devname = xstrdup(ll.name);
+ devs_n++;
+ }
+ close(fd);
+ }
+ looplist_close(&ll);
+
+ if (devs_n == 1) {
+ *loopdev = devname;
+ return 0; /* exactly one loopdev */
+ }
+ free(devname);
+ return devs_n ? 2 : 1; /* more loopdevs or error */
+}
+
#ifdef MAIN
static int
@@ -581,6 +626,7 @@ show_associated_loop_devices(char *filen
return 0;
}
+
#endif /* MAIN */
/* check if the loopfile is already associated with the same given
@@ -1054,6 +1100,13 @@ find_unused_loop_device (void) {
return 0;
}
+int
+find_loopdev_by_backing_file(const char *filename, char **loopdev)
+{
+ mutter();
+ return 1;
+}
+
#endif /* !LOOP_SET_FD */
#ifdef MAIN
Index: util-linux-2.19/mount/lomount.h
===================================================================
--- util-linux-2.19.orig/mount/lomount.h
+++ util-linux-2.19/mount/lomount.h
@@ -11,6 +11,7 @@ extern char * find_unused_loop_device(vo
extern int loopfile_used_with(char *devname, const char *filename, unsigned long long offset);
extern char *loopfile_used (const char *filename, unsigned long long offset);
extern char *loopdev_get_loopfile(const char *device);
+extern int find_loopdev_by_backing_file(const char *filename, char **loopdev);
#define SETLOOP_RDONLY (1<<0) /* Open loop read-only */
Index: util-linux-2.19/mount/umount.c
===================================================================
--- util-linux-2.19.orig/mount/umount.c
+++ util-linux-2.19/mount/umount.c
@@ -502,6 +502,7 @@ umount_file (char *arg) {
const char *file, *options;
int fstab_has_user, fstab_has_users, fstab_has_owner, fstab_has_group;
int ok;
+ struct stat statbuf;
if (!*arg) { /* "" would be expanded to `pwd` */
die(2, _("Cannot unmount \"\"\n"));
@@ -509,6 +510,27 @@ umount_file (char *arg) {
}
file = canonicalize(arg); /* mtab paths are canonicalized */
+
+ /* if file is a regular file, check if it is associated
+ * with some loop device
+ */
+ if (!stat(file, &statbuf) && S_ISREG(statbuf.st_mode)) {
+ char *loopdev = NULL;
+ switch (find_loopdev_by_backing_file(file, &loopdev)) {
+ case 0:
+ if (verbose)
+ printf(_("%s is associated with %s, trying to unmount it\n"),
+ arg, loopdev);
+ file = loopdev;
+ break;
+ case 2:
+ if (verbose)
+ printf(_("%s is associated with more than one loop device: not unmounting\n"),
+ arg);
+ break;
+ }
+ }
+
if (verbose > 1)
printf(_("Trying to unmount %s\n"), file);

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d3eac4afcc687b3ae1ffedcab2dc12df84c7ba7045cce31386d2b7040a011c7d
size 4396543

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d8189ba6dfb508d5c36f50103a7b84943d893e51e6d7a314155a82f68efb33b6
size 4376791

View File

@ -1,3 +1,12 @@
-------------------------------------------------------------------
Tue May 3 09:39:37 UTC 2011 - puzel@novell.com
- update to util-linux-2.19.1
- numerous bugfixes, including (bnc#690486 and bnc#690488)
- drop umount-by-imgname.patch (merged upstream)
- cleanup: do not register ipc.info.gz (not provided by
this package)
------------------------------------------------------------------- -------------------------------------------------------------------
Thu Apr 14 16:27:27 UTC 2011 - puzel@novell.com Thu Apr 14 16:27:27 UTC 2011 - puzel@novell.com

View File

@ -30,7 +30,7 @@ BuildRequires: pam-devel
BuildRequires: pkg-config BuildRequires: pkg-config
BuildRequires: readline-devel BuildRequires: readline-devel
BuildRequires: zlib-devel BuildRequires: zlib-devel
Version: 2.19 Version: 2.19.1
Release: 5 Release: 5
Url: http://kernel.org/~kzak/util-linux/ Url: http://kernel.org/~kzak/util-linux/
Supplements: filesystem(minix) Supplements: filesystem(minix)
@ -80,7 +80,6 @@ Source51: blkid.conf
Patch1: util-linux-2.12r-fdisk_remove_bogus_warnings.patch Patch1: util-linux-2.12r-fdisk_remove_bogus_warnings.patch
# crypto patch # crypto patch
Patch3: util-linux-2.17.1-mount_losetup_crypto.patch Patch3: util-linux-2.17.1-mount_losetup_crypto.patch
Patch5: umount-by-imgname.patch
## ##
## adjtimex ## adjtimex
## ##
@ -181,7 +180,6 @@ Files to develop applications using the libmount library.
%setup -q -a 9 -b 11 -b 12 -b 13 -n %{name}-%{version} %setup -q -a 9 -b 11 -b 12 -b 13 -n %{name}-%{version}
%patch1 -p1 %patch1 -p1
%patch3 -p1 %patch3 -p1
%patch5 -p1
# #
cd adjtimex-* cd adjtimex-*
@ -192,7 +190,6 @@ cp %{S:22} %{S:23} .
# nologin # nologin
cp %{S:2} %{S:3} %{S:26} %{S:30} . cp %{S:2} %{S:3} %{S:26} %{S:30} .
cd ../klogconsole cd ../klogconsole
#%#patch55 -p1 -b .quiet
%patch55 -p1 %patch55 -p1
%patch56 -p1 %patch56 -p1
cd ../time-* cd ../time-*
@ -376,7 +373,6 @@ rm -rf %{buildroot}
%post %post
%{fillup_and_insserv raw} %{fillup_and_insserv raw}
%install_info --info-dir=%{_infodir} %{_infodir}/ipc.info.gz
%install_info --entry="* time: (time). summarizing used system resources" --info-dir=%{_infodir} %{_infodir}/time.info.gz %install_info --entry="* time: (time). summarizing used system resources" --info-dir=%{_infodir} %{_infodir}/time.info.gz
%install_info --info-dir=%{_infodir} %{_infodir}/which.info.gz %install_info --info-dir=%{_infodir} %{_infodir}/which.info.gz
%if 0%{?suse_version} <= 1130 %if 0%{?suse_version} <= 1130