diff --git a/cifs-utils.spec b/cifs-utils.spec index 376b33e..fedb5f2 100644 --- a/cifs-utils.spec +++ b/cifs-utils.spec @@ -3,7 +3,7 @@ Name: cifs-utils Version: 4.8.1 -Release: 1%{pre_release}%{?dist} +Release: 2%{pre_release}%{?dist} Summary: Utilities for mounting and managing CIFS mounts Group: System Environment/Daemons @@ -16,6 +16,8 @@ Source0: ftp://ftp.samba.org/pub/linux-cifs/cifs-utils/%{name}-%{version} BuildRequires: libcap-ng-devel libtalloc-devel krb5-devel keyutils-libs-devel autoconf automake Requires: keyutils +Patch0: mount.cifs-don-t-try-to-alter-mtab-if-it-s-a-symlink.patch + %description The SMB/CIFS protocol is a standard file sharing protocol widely deployed on Microsoft Windows machines. This package contains tools for mounting @@ -26,6 +28,7 @@ file system. %prep %setup -q -n %{name}-%{version}%{pre_release} +%patch0 -p1 %build %configure --prefix=/usr @@ -47,6 +50,9 @@ rm -rf %{buildroot} %{_mandir}/man8/mount.cifs.8.gz %changelog +* Tue Feb 01 2011 Jeff Layton 4.8.1-2 +- mount.cifs: don't update mtab if it's a symlink (bz# 674101) + * Fri Jan 21 2011 Jeff Layton 4.8.1-1 - update to 4.8.1 diff --git a/mount.cifs-don-t-try-to-alter-mtab-if-it-s-a-symlink.patch b/mount.cifs-don-t-try-to-alter-mtab-if-it-s-a-symlink.patch new file mode 100644 index 0000000..9732c4b --- /dev/null +++ b/mount.cifs-don-t-try-to-alter-mtab-if-it-s-a-symlink.patch @@ -0,0 +1,73 @@ +From fba28cfe2f13dd8bdae3cec76178f42b001a40ca Mon Sep 17 00:00:00 2001 +From: Jeff Layton +Date: Mon, 31 Jan 2011 15:04:35 -0500 +Subject: [PATCH] mount.cifs: don't try to alter mtab if it's a symlink + +Some distros replace /etc/mtab with a symlink to /proc/mounts. In that +situation, mount.cifs will hang for a while trying to lock the mtab. +/bin/mount checks to see if the mtab is a symlink. If it is or if a +stat() call on it fails, it doesn't try to to update the mtab. Have +mount.cifs do the same. + +Signed-off-by: Jeff Layton +--- + mount.cifs.c | 2 +- + mount.h | 1 + + mtab.c | 16 ++++++++++++++++ + 3 files changed, 18 insertions(+), 1 deletions(-) + +diff --git a/mount.cifs.c b/mount.cifs.c +index f537a07..5f29761 100644 +--- a/mount.cifs.c ++++ b/mount.cifs.c +@@ -1934,7 +1934,7 @@ mount_retry: + goto mount_exit; + } + +- if (!parsed_info->nomtab) ++ if (!parsed_info->nomtab && !mtab_unusable()) + rc = add_mtab(orig_dev, mountpoint, parsed_info->flags, fstype); + + mount_exit: +diff --git a/mount.h b/mount.h +index 23ea4f0..d49c2ea 100644 +--- a/mount.h ++++ b/mount.h +@@ -32,6 +32,7 @@ + #define _PATH_MOUNTED_LOCK _PATH_MOUNTED "~" + #define _PATH_MOUNTED_TMP _PATH_MOUNTED ".tmp" + ++extern int mtab_unusable(void); + extern int lock_mtab(void); + extern void unlock_mtab(void); + +diff --git a/mtab.c b/mtab.c +index 64e7250..9cd50d8 100644 +--- a/mtab.c ++++ b/mtab.c +@@ -77,6 +77,22 @@ mono_time(void) { + return ret; + } + ++/* ++ * See if mtab is present and whether it's a symlink. Returns errno from stat() ++ * call or EMLINK if it's a symlink. ++ */ ++int ++mtab_unusable(void) ++{ ++ struct stat mstat; ++ ++ if(lstat(_PATH_MOUNTED, &mstat)) ++ return errno; ++ else if (S_ISLNK(mstat.st_mode)) ++ return EMLINK; ++ return 0; ++} ++ + /* Remove lock file. */ + void + unlock_mtab (void) { +-- +1.7.3.4 +