Mailinglist Archive: opensuse-commit (1426 mails)

< Previous Next >
commit util-linux
  • From: root@xxxxxxxxxxxxxxx (h_root)
  • Date: Sun, 11 Mar 2007 00:11:30 +0100
  • Message-id: <20070310231130.D2AA6678188@xxxxxxxxxxxxxxx>

Hello community,

here is the log from the commit of package util-linux
checked in at Sun Mar 11 00:11:30 CET 2007.

--------
--- util-linux/util-linux.changes 2007-03-08 17:29:27.000000000 +0100
+++ /mounts/work_src_done/STABLE/util-linux/util-linux.changes 2007-03-09 11:11:37.000000000 +0100
@@ -1,0 +2,5 @@
+Thu Mar 9 11:00:11 CET 2007 - mkoenig@xxxxxxx
+
+- mount: fix mtablock patch to avoid mtab corruption [#226783]
+
+-------------------------------------------------------------------

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ util-linux.spec ++++++
--- /var/tmp/diff_new_pack.A11923/_old 2007-03-11 00:11:03.000000000 +0100
+++ /var/tmp/diff_new_pack.A11923/_new 2007-03-11 00:11:03.000000000 +0100
@@ -20,7 +20,7 @@
Group: System/Base
Autoreqprov: on
Version: 2.12r
-Release: 78
+Release: 80
Summary: A collection of basic system utilities
Source: ftp://ftp.kernel.org/pub/linux/utils/util-linux/%name-%version.tar.bz2
Source2: nologin.c
@@ -622,6 +622,8 @@
%endif

%changelog
+* Fri Mar 09 2007 - mkoenig@xxxxxxx
+- mount: fix mtablock patch to avoid mtab corruption [#226783]
* Thu Mar 08 2007 - mkoenig@xxxxxxx
- partx: fix warning for too long literal
* Wed Mar 07 2007 - rguenther@xxxxxxx

















++++++ util-linux-2.12h-mtablock.diff ++++++
--- /var/tmp/diff_new_pack.A11923/_old 2007-03-11 00:11:04.000000000 +0100
+++ /var/tmp/diff_new_pack.A11923/_new 2007-03-11 00:11:04.000000000 +0100
@@ -1,86 +1,152 @@
---- util-linux-2.12q/mount/fstab.c
-+++ util-linux-2.12q/mount/fstab.c
-@@ -395,6 +395,7 @@
+Index: util-linux-2.12r/mount/fstab.c
+===================================================================
+--- util-linux-2.12r.orig/mount/fstab.c
++++ util-linux-2.12r/mount/fstab.c
+@@ -395,6 +395,7 @@ getfsvolspec (const char *label) {

/* Flag for already existing lock file. */
static int we_created_lockfile = 0;
-+static int lock_file_desc = -1;
++static int lockfile_fd = -1;

/* Flag to indicate that signals have been set up. */
static int signals_have_been_setup = 0;
-@@ -417,6 +418,8 @@
+@@ -416,6 +417,8 @@ setlkw_timeout (int sig) {
+ void
unlock_mtab (void) {
if (we_created_lockfile) {
++ close(lockfile_fd);
++ lockfile_fd = -1;
unlink (MOUNTED_LOCK);
-+ close(lock_file_desc);
-+ lock_file_desc = -1;
we_created_lockfile = 0;
}
- }
-@@ -443,6 +446,7 @@
+@@ -443,7 +446,7 @@ unlock_mtab (void) {

void
lock_mtab (void) {
-+ sigset_t sigmask;
- int tries = 3;
+- int tries = 3;
++ int tries = 100000, i;
char linktargetfile[MOUNTLOCK_LINKTARGET_LTH];

-@@ -467,6 +471,10 @@
- signals_have_been_setup = 1;
- }
+ at_die = unlock_mtab;
+@@ -469,45 +472,48 @@ lock_mtab (void) {

-+ /* Allow all signals while trying to lock mtab */
-+ sigemptyset(&sigmask);
-+ sigprocmask(SIG_SETMASK, &sigmask, &sigmask);
-+
sprintf(linktargetfile, MOUNTLOCK_LINKTARGET, getpid ());

++ i = open (linktargetfile, O_WRONLY|O_CREAT, 0);
++ if (i < 0) {
++ int errsv = errno;
++ /* linktargetfile does not exist (as a file)
++ and we cannot create it. Read-only filesystem?
++ Too many files open in the system?
++ Filesystem full? */
++ die (EX_FILEIO, _("can't create lock file %s: %s "
++ "(use -n flag to override)"),
++ linktargetfile, strerror (errsv));
++ }
++ close(i);
++
/* Repeat until it was us who made the link */
-@@ -521,12 +529,21 @@
+ while (!we_created_lockfile) {
+ struct flock flock;
+- int errsv, fd, i, j;
+-
+- i = open (linktargetfile, O_WRONLY|O_CREAT, 0);
+- if (i < 0) {
+- int errsv = errno;
+- /* linktargetfile does not exist (as a file)
+- and we cannot create it. Read-only filesystem?
+- Too many files open in the system?
+- Filesystem full? */
+- die (EX_FILEIO, _("can't create lock file %s: %s "
+- "(use -n flag to override)"),
+- linktargetfile, strerror (errsv));
+- }
+- close(i);
++ int errsv, j;
+
+ j = link(linktargetfile, MOUNTED_LOCK);
+ errsv = errno;
+
+- (void) unlink(linktargetfile);
+-
+ if (j == 0)
+ we_created_lockfile = 1;
+
+ if (j < 0 && errsv != EEXIST) {
++ (void) unlink(linktargetfile);
+ die (EX_FILEIO, _("can't link lock file %s: %s "
+ "(use -n flag to override)"),
+ MOUNTED_LOCK, strerror (errsv));
+ }
+
+- fd = open (MOUNTED_LOCK, O_WRONLY);
++ lockfile_fd = open (MOUNTED_LOCK, O_WRONLY);
+
+- if (fd < 0) {
++ if (lockfile_fd < 0) {
+ int errsv = errno;
+ /* Strange... Maybe the file was just deleted? */
+- if (errno == ENOENT && tries-- > 0)
++ if (errno == ENOENT && tries-- > 0) {
++ if (tries % 200 == 0)
++ usleep(30);
+ continue;
++ }
++ (void) unlink(linktargetfile);
+ die (EX_FILEIO, _("can't open lock file %s: %s "
+ "(use -n flag to override)"),
+ MOUNTED_LOCK, strerror (errsv));
+@@ -520,7 +526,7 @@ lock_mtab (void) {
+
if (j == 0) {
/* We made the link. Now claim the lock. */
- if (fcntl (fd, F_SETLK, &flock) == -1) {
-+ int errsv = errno;
-+ if (!tries--)
-+ die(EX_FILEIO,
-+ _("Can't lock lock file %s: %s\n"),
-+ MOUNTED_LOCK, strerror (errsv));
+- if (fcntl (fd, F_SETLK, &flock) == -1) {
++ if (fcntl (lockfile_fd, F_SETLK, &flock) == -1) {
if (verbose) {
-- int errsv = errno;
+ int errsv = errno;
printf(_("Can't lock lock file %s: %s\n"),
- MOUNTED_LOCK, strerror (errsv));
+@@ -528,13 +534,15 @@ lock_mtab (void) {
}
-- /* proceed anyway */
-+ /* bummer - someone raced us to the file
-+ * lock. Start all over again. */
-+ unlink(MOUNTED_LOCK);
-+ } else {
-+ we_created_lockfile = 1;
-+ lock_file_desc = fd;
+ /* proceed anyway */
}
++ (void) unlink(linktargetfile);
} else {
static int tries = 0;
-@@ -551,8 +568,14 @@
- }
- }

+ /* Someone else made the link. Wait. */
+ alarm(LOCK_TIMEOUT);
+- if (fcntl (fd, F_SETLKW, &flock) == -1) {
++ if (fcntl (lockfile_fd, F_SETLKW, &flock) == -1) {
+ int errsv = errno;
++ (void) unlink(linktargetfile);
+ die (EX_FILEIO, _("can't lock lock file %s: %s"),
+ MOUNTED_LOCK, (errno == EINTR) ?
+ _("timed out") : strerror (errsv));
+@@ -542,16 +550,18 @@ lock_mtab (void) {
+ alarm(0);
+ /* Limit the number of iterations - maybe there
+ still is some old /etc/mtab~ */
+- if (tries++ > 3) {
+- if (tries > 5)
+- die (EX_FILEIO, _("Cannot create link %s\n"
+- "Perhaps there is a stale lock file?\n"),
+- MOUNTED_LOCK);
+- sleep(1);
+- }
++ ++tries;
++ if (tries % 200 == 0)
++ usleep(30);
++ if (tries > 100000) {
++ (void) unlink(linktargetfile);
++ close(lockfile_fd);
++ die (EX_FILEIO, _("Cannot create link %s\n"
++ "Perhaps there is a stale lock file?\n"),
++ MOUNTED_LOCK);
++ }
++ close(lockfile_fd);
+ }
+-
- close(fd);
-+ /* If we created the lock file, keep the fd else
-+ * our POSIX lock will go away immediately */
-+ if (!we_created_lockfile)
-+ close(fd);
}
-+
-+ /* Restore original signal mask */
-+ sigprocmask(SIG_SETMASK, &sigmask, NULL);
}

- /*
---- util-linux-2.12q/mount/paths.h
-+++ util-linux-2.12q/mount/paths.h
-@@ -7,4 +7,4 @@
- #define MOUNTED_LOCK "/etc/mtab~"
- #define MOUNTED_TEMP "/etc/mtab.tmp"
- #endif
--#define LOCK_TIMEOUT 10
-+#define LOCK_TIMEOUT 30


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



Remember to have fun...

---------------------------------------------------------------------
To unsubscribe, e-mail: opensuse-commit+unsubscribe@xxxxxxxxxxxx
For additional commands, e-mail: opensuse-commit+help@xxxxxxxxxxxx

< Previous Next >