rpms/util-linux-ng/devel util-linux-ng-2.16-mount-conf.patch, NONE, 1.1 util-linux-ng.spec, 1.51, 1.52
kzak
kzak at fedoraproject.org
Mon Jul 27 21:11:14 UTC 2009
Author: kzak
Update of /cvs/pkgs/rpms/util-linux-ng/devel
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv14203
Modified Files:
util-linux-ng.spec
Added Files:
util-linux-ng-2.16-mount-conf.patch
Log Message:
* Mon Jul 27 2009 Karel Zak <kzak at redhat.com> 2.16-2
- fix #214891 - add mount.conf and MTAB_LOCK_DIR= option
util-linux-ng-2.16-mount-conf.patch:
example.files/mount.conf | 20 ++++++
include/pathnames.h | 7 +-
mount/fstab.c | 142 ++++++++++++++++++++++++++++++++++++++---------
mount/fstab.h | 1
mount/mount.c | 7 +-
5 files changed, 147 insertions(+), 30 deletions(-)
--- NEW FILE util-linux-ng-2.16-mount-conf.patch ---
>From 47cd680cc6cbbfc42f0fe4dd5833a36859ca310a Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak at redhat.com>
Date: Mon, 27 Jul 2009 21:15:27 +0200
Subject: [PATCH] mount(8): add mount.conf and MTAB_LOCK_DIR=
The /etc directory is a really bad place for lock files on systems
with read-only root FS.
This patch introduces the /etc/mount.conf file where is possible to
define MTAB_LOCK_DIR=.
Signed-off-by: Karel Zak <kzak at redhat.com>
---
example.files/mount.conf | 20 +++++++
include/pathnames.h | 7 ++-
mount/fstab.c | 142 +++++++++++++++++++++++++++++++++++++---------
mount/fstab.h | 1 +
mount/mount.c | 6 ++-
5 files changed, 147 insertions(+), 29 deletions(-)
create mode 100644 example.files/mount.conf
diff --git a/example.files/mount.conf b/example.files/mount.conf
new file mode 100644
index 0000000..7813eba
--- /dev/null
+++ b/example.files/mount.conf
@@ -0,0 +1,20 @@
+#
+# This is mount(8) config file
+#
+
+# MTAB_LOCK_DIR is a directory where mount(8) stores "mtab~" and "mtab~.<pid>
+# lock files. It's recommended to use the root filesystem for mount(8) lock
+# files.
+#
+# The default is /etc.
+#
+# WARNING: If you want to use a directory on stand-alone filesystem you have to
+# be very careful about your init scripts.
+#
+# For example use stand-alone /var for lock files and run "mount -a
+# -F" (-F means fork()) in init scripts is really bad idea.
+#
+# Solution is to use "mount -n" to mount the filesystem and then "mount -f"
+# to create proper /etc/mtab.
+#
+MTAB_LOCK_DIR=/etc
diff --git a/include/pathnames.h b/include/pathnames.h
index ead448e..e449c9d 100644
--- a/include/pathnames.h
+++ b/include/pathnames.h
@@ -90,7 +90,12 @@
# endif
#endif
-#define _PATH_MOUNTED_LOCK _PATH_MOUNTED "~"
+#define _PATH_MOUNT_CONF "/etc/mount.conf"
+
+#define _PATH_MOUNTED_LOCKDIR "/etc/"
+#define _MOUNTED_LOCK_FILENAME "mtab~"
+#define _PATH_MOUNTED_LOCK _PATH_MOUNTED_LOCKDIR _MOUNTED_LOCK_FILENAME
+
#define _PATH_MOUNTED_TMP _PATH_MOUNTED ".tmp"
#ifndef _PATH_DEV
diff --git a/mount/fstab.c b/mount/fstab.c
index 82e90f3..8b1b244 100644
--- a/mount/fstab.c
+++ b/mount/fstab.c
@@ -12,6 +12,8 @@
#include <sys/time.h>
#include <time.h>
#include <mntent.h>
+#include <dirent.h>
+
#include "mount_mntent.h"
#include "fstab.h"
#include "sundries.h"
@@ -481,6 +483,7 @@ getfs_by_label (const char *label) {
/* Flag for already existing lock file. */
static int we_created_lockfile = 0;
+static DIR *lockdir;
static int lockfile_fd = -1;
/* Flag to indicate that signals have been set up. */
@@ -499,14 +502,85 @@ setlkw_timeout (int sig) {
/* nothing, fcntl will fail anyway */
}
+static char *
+get_next_line(FILE *f, char *buf, size_t bufsz)
+{
+ char *s;
+
+ do {
+ if (!fgets(buf, bufsz, f))
+ goto err;
+ s = strchr(buf, '\n');
+ if (!s) {
+ /* Missing final newline? Otherwise extremely */
+ /* long line - assume file was corrupted */
+ if (feof(f))
+ s = index(buf, '\0');
+ else {
+ if (verbose)
+ printf(_("%s: missing newline at line '%s'.\n"),
+ _PATH_MOUNT_CONF, buf);
+ goto err;
+ }
+ }
+ *s = '\0';
+ if (--s >= buf && *s == '\r')
+ *s = '\0';
+
+ s = buf;
+ while (*s == ' ' || *s == '\t') /* skip space */
+ s++;
+ } while (*s == '\0' || *s == '#');
+
+ return s;
+err:
+ return NULL;
+}
+
+char *
+get_lock_dirname(char *buf, size_t bufsz)
+{
+ FILE *f;
+ char *s;
+
+ f = fopen(_PATH_MOUNT_CONF, "r");
+ if (!f)
+ goto err;
+
+ while((s = get_next_line(f, buf, bufsz))) {
+ if (!strncmp(s, "MTAB_LOCK_DIR=", 14)) {
+ s += 14;
+ break;
+ }
+ }
+ fclose(f);
+ if (s) {
+ size_t sz = strlen(s);
+ char *end = sz > 1 ? s + (sz - 1) : NULL;
+
+ if (end && *end != '/') {
+ *++end = '/';
+ *++end = '\0';
+ }
+ return s;
+ }
+err:
+ /* fallback */
+ strncpy(buf, _PATH_MOUNTED_LOCKDIR, bufsz);
+ buf[bufsz - 1] = '\0';
+ return buf;
+}
+
/* Remove lock file. */
void
unlock_mtab (void) {
if (we_created_lockfile) {
+ int lockdir_fd = dirfd(lockdir);
close(lockfile_fd);
lockfile_fd = -1;
- unlink (_PATH_MOUNTED_LOCK);
+ unlinkat(lockdir_fd, _MOUNTED_LOCK_FILENAME, 0);
we_created_lockfile = 0;
+ closedir(lockdir);
}
}
@@ -527,8 +601,6 @@ unlock_mtab (void) {
/* Where does the link point to? Obvious choices are mtab and mtab~~.
HJLu points out that the latter leads to races. Right now we use
mtab~.<pid> instead. Use 20 as upper bound for the length of %d. */
-#define MOUNTLOCK_LINKTARGET _PATH_MOUNTED_LOCK "%d"
-#define MOUNTLOCK_LINKTARGET_LTH (sizeof(_PATH_MOUNTED_LOCK)+20)
/*
* The original mount locking code has used sleep(1) between attempts and
@@ -556,7 +628,10 @@ lock_mtab (void) {
int i;
struct timespec waittime;
struct timeval maxtime;
- char linktargetfile[MOUNTLOCK_LINKTARGET_LTH];
+ const char *lockdirname;
+ char buf[BUFSIZ];
+ char linktargetfile[PATH_MAX];
+ int lockdir_fd;
if (!signals_have_been_setup) {
int sig = 0;
@@ -577,18 +652,28 @@ lock_mtab (void) {
signals_have_been_setup = 1;
}
- sprintf(linktargetfile, MOUNTLOCK_LINKTARGET, getpid ());
+ lockdirname = get_lock_dirname(buf, sizeof(buf));
+
+ lockdir = opendir(lockdirname);
+ if (!lockdir) {
+ die (EX_FILEIO, _("can't open %s: %s "),
+ lockdirname, strerror(errno));
+ }
+ lockdir_fd = dirfd(lockdir);
+
+ snprintf(linktargetfile, sizeof(linktargetfile), "%s.%d",
+ _MOUNTED_LOCK_FILENAME, getpid ());
- i = open (linktargetfile, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);
+ i = openat(lockdir_fd, linktargetfile, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);
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 "
+ die (EX_FILEIO, _("can't create lock file %s%s: %s "
"(use -n flag to override)"),
- linktargetfile, strerror (errsv));
+ lockdirname, linktargetfile, strerror(errsv));
}
close(i);
@@ -604,20 +689,22 @@ lock_mtab (void) {
struct flock flock;
int errsv, j;
- j = link(linktargetfile, _PATH_MOUNTED_LOCK);
+ j = linkat(lockdir_fd, linktargetfile,
+ lockdir_fd, _MOUNTED_LOCK_FILENAME, 0);
errsv = errno;
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 "
+ unlinkat(lockdir_fd, linktargetfile, 0);
+ die (EX_FILEIO, _("can't link lock file %s%s: %s "
"(use -n flag to override)"),
- _PATH_MOUNTED_LOCK, strerror (errsv));
+ lockdirname, _MOUNTED_LOCK_FILENAME, strerror(errsv));
}
- lockfile_fd = open (_PATH_MOUNTED_LOCK, O_WRONLY);
+ lockfile_fd = openat(lockdir_fd,
+ _MOUNTED_LOCK_FILENAME, O_WRONLY);
if (lockfile_fd < 0) {
/* Strange... Maybe the file was just deleted? */
@@ -627,10 +714,10 @@ lock_mtab (void) {
we_created_lockfile = 0;
continue;
}
- (void) unlink(linktargetfile);
- die (EX_FILEIO, _("can't open lock file %s: %s "
+ unlinkat(lockdir_fd, linktargetfile, 0);
+ die (EX_FILEIO, _("can't open lock file %s%s: %s "
"(use -n flag to override)"),
- _PATH_MOUNTED_LOCK, strerror (errsv));
+ lockdirname, _MOUNTED_LOCK_FILENAME, strerror(errsv));
}
flock.l_type = F_WRLCK;
@@ -643,12 +730,13 @@ lock_mtab (void) {
if (fcntl (lockfile_fd, F_SETLK, &flock) == -1) {
if (verbose) {
int errsv = errno;
- printf(_("Can't lock lock file %s: %s\n"),
- _PATH_MOUNTED_LOCK, strerror (errsv));
+ printf(_("Can't lock lock file %s%s: %s\n"),
+ lockdirname, _MOUNTED_LOCK_FILENAME,
+ strerror(errsv));
}
/* proceed, since it was us who created the lockfile anyway */
}
- (void) unlink(linktargetfile);
+ unlinkat(lockdir_fd, linktargetfile, 0);
} else {
/* Someone else made the link. Wait. */
gettimeofday(&now, NULL);
@@ -656,19 +744,19 @@ lock_mtab (void) {
alarm(maxtime.tv_sec - now.tv_sec);
if (fcntl (lockfile_fd, F_SETLKW, &flock) == -1) {
int errsv = errno;
- (void) unlink(linktargetfile);
- die (EX_FILEIO, _("can't lock lock file %s: %s"),
- _PATH_MOUNTED_LOCK, (errno == EINTR) ?
- _("timed out") : strerror (errsv));
+ unlinkat(lockdir_fd, linktargetfile, 0);
+ die (EX_FILEIO, _("can't lock lock file %s%s: %s"),
+ lockdirname, _MOUNTED_LOCK_FILENAME,
+ (errno == EINTR) ?
+ _("timed out") : strerror(errsv));
}
alarm(0);
-
nanosleep(&waittime, NULL);
} else {
- (void) unlink(linktargetfile);
- die (EX_FILEIO, _("Cannot create link %s\n"
+ unlinkat(lockdir_fd, linktargetfile, 0);
+ die (EX_FILEIO, _("Cannot create link %s%s\n"
"Perhaps there is a stale lock file?\n"),
- _PATH_MOUNTED_LOCK);
+ lockdirname, _MOUNTED_LOCK_FILENAME);
}
close(lockfile_fd);
}
diff --git a/mount/fstab.h b/mount/fstab.h
index 8fc8fd4..b5bb5d9 100644
--- a/mount/fstab.h
+++ b/mount/fstab.h
@@ -26,6 +26,7 @@ struct mntentchn *getfs_by_devdir (const char *dev, const char *dir);
struct mntentchn *getfs_by_uuid (const char *uuid);
struct mntentchn *getfs_by_label (const char *label);
+char *get_lock_dirname(char *buf, size_t bufsz);
void lock_mtab (void);
void unlock_mtab (void);
void update_mtab (const char *special, struct my_mntent *with);
diff --git a/mount/mount.c b/mount/mount.c
index ef478c7..09086a8 100644
--- a/mount/mount.c
+++ b/mount/mount.c
@@ -2178,9 +2178,13 @@ main(int argc, char *argv[]) {
}
if (verbose > 2) {
+ char buf[BUFSIZ];
+
printf("mount: fstab path: \"%s\"\n", _PATH_MNTTAB);
printf("mount: mtab path: \"%s\"\n", _PATH_MOUNTED);
- printf("mount: lock path: \"%s\"\n", _PATH_MOUNTED_LOCK);
+ printf("mount: lock path: \"%s%s\"\n",
+ get_lock_dirname(buf, sizeof(buf)),
+ _MOUNTED_LOCK_FILENAME);
printf("mount: temp path: \"%s\"\n", _PATH_MOUNTED_TMP);
printf("mount: UID: %d\n", getuid());
printf("mount: eUID: %d\n", geteuid());
--
1.6.2.5
Index: util-linux-ng.spec
===================================================================
RCS file: /cvs/pkgs/rpms/util-linux-ng/devel/util-linux-ng.spec,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -p -r1.51 -r1.52
--- util-linux-ng.spec 25 Jul 2009 20:20:55 -0000 1.51
+++ util-linux-ng.spec 27 Jul 2009 21:11:14 -0000 1.52
@@ -2,7 +2,7 @@
Summary: A collection of basic system utilities
Name: util-linux-ng
Version: 2.16
-Release: 1%{?dist}
+Release: 2%{?dist}
License: GPLv2 and GPLv2+ and BSD with advertising and Public Domain
Group: System Environment/Base
URL: ftp://ftp.kernel.org/pub/linux/utils/util-linux-ng
@@ -96,13 +96,15 @@ Patch3: util-linux-ng-2.14-blockdev-rmpa
Patch4: util-linux-ng-2.13-ctrlaltdel-man.patch
# /etc/blkid.tab --> /etc/blkid/blkid.tab
Patch5: util-linux-ng-2.16-blkid-cachefile.patch
+# 214891 - mount: move mtab locks to /var/lock
+Patch6: util-linux-ng-2.16-mount-conf.patch
### Ready for upstream?
###
# 151635 - makeing /var/log/lastlog
-Patch6: util-linux-ng-2.13-login-lastlog.patch
+Patch7: util-linux-ng-2.13-login-lastlog.patch
# 231192 - ipcs is not printing correct values on pLinux
-Patch7: util-linux-ng-2.15-ipcs-32bit.patch
+Patch8: util-linux-ng-2.15-ipcs-32bit.patch
%description
The util-linux-ng package contains a large variety of low-level system
@@ -197,6 +199,7 @@ cp %{SOURCE8} %{SOURCE9} .
%patch5 -p1
%patch6 -p1
%patch7 -p1
+%patch8 -p1
%build
unset LINGUAS || :
@@ -471,7 +474,7 @@ fi
%files -f %{name}.files
%defattr(-,root,root)
-%doc */README.* NEWS AUTHORS licenses/* README*
+%doc */README.* NEWS AUTHORS licenses/* README* example.files/mount.conf
%doc getopt/getopt-*.{bash,tcsh}
%config(noreplace) %{_sysconfdir}/pam.d/chfn
@@ -707,6 +710,9 @@ fi
%changelog
+* Mon Jul 27 2009 Karel Zak <kzak at redhat.com> 2.16-2
+- fix #214891 - add mount.conf and MTAB_LOCK_DIR= option
+
* Sat Jul 25 2009 Karel Zak <kzak at redhat.com> 2.16-1
- upgrade to 2.16
ftp://ftp.kernel.org/pub/linux/utils/util-linux-ng/v2.16/v2.16-ReleaseNotes
More information about the fedora-extras-commits
mailing list