From 8280d7e59c5255bdc02e0c28a91334de38798488 Mon Sep 17 00:00:00 2001 From: Steve Dickson Date: Fri, 28 Jul 2006 19:38:07 +0000 Subject: [PATCH] Enabled the creating of mount.nfs and umount.nfs binaries Added mount option fixes suggested by upstream. Fix lazy umounts (bz 169299) Added -o fsc mount option. --- nfs-utils-1.0.9-lazy-umount.patch | 58 ++++ nfs-utils-1.0.9-mount-fsc.patch | 71 ++++ nfs-utils-1.0.9-mount-options-v3.patch | 447 +++++++++++++++++++++++++ nfs-utils.spec | 37 +- 4 files changed, 610 insertions(+), 3 deletions(-) create mode 100644 nfs-utils-1.0.9-lazy-umount.patch create mode 100644 nfs-utils-1.0.9-mount-fsc.patch create mode 100644 nfs-utils-1.0.9-mount-options-v3.patch diff --git a/nfs-utils-1.0.9-lazy-umount.patch b/nfs-utils-1.0.9-lazy-umount.patch new file mode 100644 index 0000000..18577f0 --- /dev/null +++ b/nfs-utils-1.0.9-lazy-umount.patch @@ -0,0 +1,58 @@ +--- nfs-utils-1.0.9/utils/mount/nfsumount.c.orig 2006-07-28 11:12:32.000000000 -0400 ++++ nfs-utils-1.0.9/utils/mount/nfsumount.c 2006-07-28 11:14:41.000000000 -0400 +@@ -100,9 +100,9 @@ int nfs_call_umount(clnt_addr_t *mnt_ser + } + mnt_closeclnt(clnt, msock); + if (res == RPC_SUCCESS) +- return 1; ++ return 0; + out_bad: +- return 0; ++ return 1; + } + + u_int get_mntproto(const char *); +@@ -251,9 +251,6 @@ int add_mtab2(const char *spec, const ch + return 1; + } + +-/* +- * Returns 1 if everything went well, else 0. +- */ + int _nfsumount(const char *spec, const char *opts) + { + char *hostname; +@@ -309,8 +306,8 @@ int _nfsumount(const char *spec, const c + goto out_bad; + return nfs_call_umount(&mnt_server, &dirname); + out_bad: +- fprintf(stderr, "%s: %s: not found or not mounted\n", progname, spec); +- return 0; ++ fprintf(stderr, "%s: %s: not found / mounted or server not reachable\n", progname, spec); ++ return 1; + } + + static struct option umount_longopts[] = +@@ -393,14 +390,18 @@ int nfsumount(int argc, char *argv[]) + } + } + +- ret = _nfsumount(mc->m.mnt_fsname, mc->m.mnt_opts); +- if(ret) ++ ret = 0; ++ if(!force && !lazy) ++ ret = _nfsumount(mc->m.mnt_fsname, mc->m.mnt_opts); ++ if(!ret) + ret = add_mtab2(mc->m.mnt_fsname, mc->m.mnt_dir, + mc->m.mnt_type, mc->m.mnt_opts, mc); + } + else { +- ret = _nfsumount(spec, NULL); +- if(ret) ++ ret = 0; ++ if(!force && !lazy) ++ ret = _nfsumount(spec, NULL); ++ if(!ret) + ret = add_mtab2(spec, spec, spec, spec, NULL); + } + diff --git a/nfs-utils-1.0.9-mount-fsc.patch b/nfs-utils-1.0.9-mount-fsc.patch new file mode 100644 index 0000000..c4c048c --- /dev/null +++ b/nfs-utils-1.0.9-mount-fsc.patch @@ -0,0 +1,71 @@ +--- nfs-utils-1.0.9/utils/mount/nfs4mount.c.orig 2006-07-07 20:04:32.000000000 -0400 ++++ nfs-utils-1.0.9/utils/mount/nfs4mount.c 2006-07-28 13:08:10.000000000 -0400 +@@ -200,7 +200,7 @@ int nfs4mount(const char *spec, const ch + char *s; + int val; + int bg, soft, intr; +- int nocto, noac; ++ int nocto, noac, fscache; + int retry; + int retval; + time_t timeout, t; +@@ -251,6 +251,7 @@ int nfs4mount(const char *spec, const ch + intr = NFS4_MOUNT_INTR; + nocto = 0; + noac = 0; ++ fscache = 0; + retry = 10000; /* 10000 minutes ~ 1 week */ + + /* +@@ -331,6 +332,8 @@ int nfs4mount(const char *spec, const ch + soft = !val; + else if (!strcmp(opt, "intr")) + intr = val; ++ else if (!strcmp(opt, "fsc")) ++ fscache = val; + else if (!strcmp(opt, "cto")) + nocto = !val; + else if (!strcmp(opt, "ac")) +@@ -346,7 +349,8 @@ int nfs4mount(const char *spec, const ch + data.flags = (soft ? NFS4_MOUNT_SOFT : 0) + | (intr ? NFS4_MOUNT_INTR : 0) + | (nocto ? NFS4_MOUNT_NOCTO : 0) +- | (noac ? NFS4_MOUNT_NOAC : 0); ++ | (noac ? NFS4_MOUNT_NOAC : 0) ++ | (fscache ? NFS4_MOUNT_FSCACHE : 0); + + /* + * Give a warning if the rpc.idmapd daemon is not running +--- nfs-utils-1.0.9/utils/mount/nfs_mount.h.orig 2006-07-28 12:52:43.000000000 -0400 ++++ nfs-utils-1.0.9/utils/mount/nfs_mount.h 2006-07-28 12:58:07.000000000 -0400 +@@ -63,6 +63,7 @@ struct nfs_mount_data { + #define NFS_MOUNT_BROKEN_SUID 0x0400 /* 4 */ + #define NFS_MOUNT_NOACL 0x0800 /* 4 */ + #define NFS_MOUNT_SECFLAVOUR 0x2000 /* 5 */ ++#define NFS_MOUNT_FSCACHE 0x4000 /* 6 */ + + /* security pseudoflavors */ + +--- nfs-utils-1.0.9/utils/mount/nfsmount.c.orig 2006-07-28 13:02:55.000000000 -0400 ++++ nfs-utils-1.0.9/utils/mount/nfsmount.c 2006-07-28 13:03:11.000000000 -0400 +@@ -694,6 +694,10 @@ parse_options(char *old_opts, struct nfs + data->flags &= ~NFS_MOUNT_SOFT; + if (val) + data->flags |= NFS_MOUNT_SOFT; ++ } else if (!strcmp(opt, "fsc")) { ++ data->flags &= ~NFS_MOUNT_FSCACHE; ++ if (val) ++ data->flags |= NFS_MOUNT_FSCACHE; + } else if (!strcmp(opt, "hard")) { + data->flags &= ~NFS_MOUNT_SOFT; + if (!val) +--- nfs-utils-1.0.9/utils/mount/nfs4_mount.h.orig 2006-07-07 20:04:32.000000000 -0400 ++++ nfs-utils-1.0.9/utils/mount/nfs4_mount.h 2006-07-28 13:07:27.000000000 -0400 +@@ -65,6 +65,7 @@ struct nfs4_mount_data { + #define NFS4_MOUNT_NOCTO 0x0010 /* 1 */ + #define NFS4_MOUNT_NOAC 0x0020 /* 1 */ + #define NFS4_MOUNT_STRICTLOCK 0x1000 /* 1 */ ++#define NFS4_MOUNT_FSCACHE 0x4000 /* 1 */ + #define NFS4_MOUNT_FLAGMASK 0xFFFF + + /* pseudoflavors: */ diff --git a/nfs-utils-1.0.9-mount-options-v3.patch b/nfs-utils-1.0.9-mount-options-v3.patch new file mode 100644 index 0000000..de80203 --- /dev/null +++ b/nfs-utils-1.0.9-mount-options-v3.patch @@ -0,0 +1,447 @@ +--- nfs-utils-1.0.9/support/include/fstab.h.orig 2006-07-07 20:04:32.000000000 -0400 ++++ nfs-utils-1.0.9/support/include/fstab.h 2006-07-28 11:07:24.000000000 -0400 +@@ -3,6 +3,10 @@ + + #include "nfs_mntent.h" + ++#ifndef _PATH_FSTAB ++#define _PATH_FSTAB "/etc/fstab" ++#endif ++ + int mtab_is_writable(void); + int mtab_does_not_exist(void); + +@@ -16,6 +20,10 @@ struct mntentchn *getmntoptfile (const c + struct mntentchn *getmntdirbackward (const char *dir, struct mntentchn *mc); + struct mntentchn *getmntdevbackward (const char *dev, struct mntentchn *mc); + ++struct mntentchn *fstab_head (void); ++struct mntentchn *getfsfile (const char *file); ++struct mntentchn *getfsspec (const char *spec); ++ + void lock_mtab (void); + void unlock_mtab (void); + void update_mtab (const char *special, nfs_mntent_t *with); +--- nfs-utils-1.0.9/support/include/nfs_mntent.h.orig 2006-07-07 20:04:32.000000000 -0400 ++++ nfs-utils-1.0.9/support/include/nfs_mntent.h 2006-07-28 11:07:24.000000000 -0400 +@@ -7,10 +7,10 @@ + #define _NFS_MNTENT_H + + typedef struct nfs_mntent_s { +- const char *mnt_fsname; +- const char *mnt_dir; +- const char *mnt_type; +- const char *mnt_opts; ++ char *mnt_fsname; ++ char *mnt_dir; ++ char *mnt_type; ++ char *mnt_opts; + int mnt_freq; + int mnt_passno; + } nfs_mntent_t; +--- nfs-utils-1.0.9/support/nfs/fstab.c.orig 2006-07-07 20:04:32.000000000 -0400 ++++ nfs-utils-1.0.9/support/nfs/fstab.c 2006-07-28 11:07:24.000000000 -0400 +@@ -78,10 +78,10 @@ mtab_is_writable() { + + /* Contents of mtab and fstab ---------------------------------*/ + +-struct mntentchn mounttable; +-static int got_mtab = 0; ++struct mntentchn mounttable, fstab; ++static int got_mtab = 0, got_fstab = 0; + +-static void read_mounttable(void); ++static void read_mounttable(void), read_fstab(void); + + struct mntentchn * + mtab_head() { +@@ -96,6 +96,13 @@ my_free(const void *s) { + free((void *) s); + } + ++struct mntentchn * ++fstab_head() { ++ if (!got_fstab) ++ read_fstab(); ++ return &fstab; ++} ++ + static void + discard_mntentchn(struct mntentchn *mc0) { + struct mntentchn *mc, *mc1; +@@ -167,6 +174,26 @@ read_mounttable() { + read_mntentchn(mfp, fnam, mc); + } + ++static void ++read_fstab() { ++ mntFILE *mfp = NULL; ++ const char *fnam; ++ struct mntentchn *mc = &fstab; ++ ++ got_fstab = 1; ++ mc->nxt = mc->prev = NULL; ++ ++ fnam = _PATH_FSTAB; ++ mfp = nfs_setmntent (fnam, "r"); ++ if (mfp == NULL || mfp->mntent_fp == NULL) { ++ int errsv = errno; ++ error(_("warning: can't open %s: %s"), ++ _PATH_FSTAB, strerror (errsv)); ++ return; ++ } ++ read_mntentchn(mfp, fnam, mc); ++} ++ + /* + * Given the directory name NAME, and the place MCPREV we found it last time, + * try to find more occurrences. +@@ -201,6 +228,30 @@ getmntdevbackward (const char *name, str + return NULL; + } + ++/* Find the dir FILE in fstab. */ ++struct mntentchn * ++getfsfile (const char *file) { ++ struct mntentchn *mc, *mc0; ++ ++ mc0 = fstab_head(); ++ for (mc = mc0->nxt; mc && mc != mc0; mc = mc->nxt) ++ if (streq(mc->m.mnt_dir, file)) ++ return mc; ++ return NULL; ++} ++ ++/* Find the device SPEC in fstab. */ ++struct mntentchn * ++getfsspec (const char *spec) { ++ struct mntentchn *mc, *mc0; ++ ++ mc0 = fstab_head(); ++ for (mc = mc0->nxt; mc && mc != mc0; mc = mc->nxt) ++ if (streq(mc->m.mnt_fsname, spec)) ++ return mc; ++ return NULL; ++} ++ + /* Updating mtab ----------------------------------------------*/ + + /* Flag for already existing lock file. */ +--- nfs-utils-1.0.9/utils/mount/Makefile.am.orig 2006-07-07 20:04:32.000000000 -0400 ++++ nfs-utils-1.0.9/utils/mount/Makefile.am 2006-07-28 11:09:31.000000000 -0400 +@@ -14,9 +14,10 @@ MAINTAINERCLEANFILES = Makefile.in + + install-exec-hook: + (cd $(DESTDIR)$(sbindir) && \ +- ln -sf $(sbin_PROGRAMS) mount.nfs4 && \ +- ln -sf $(sbin_PROGRAMS) umount.nfs && \ +- ln -sf $(sbin_PROGRAMS) umount.nfs4) ++ chmod +s $(sbin_PROGRAMS) && \ ++ cp -p $(sbin_PROGRAMS) $(DESTDIR)$(sbindir)/mount.nfs4 && \ ++ cp -p $(sbin_PROGRAMS) $(DESTDIR)$(sbindir)/umount.nfs && \ ++ cp -p $(sbin_PROGRAMS) $(DESTDIR)$(sbindir)/umount.nfs4) + uninstall-hook: + (cd $(DESTDIR)$(sbindir) && \ + rm -f mount.nfs4 umount.nfs umount.nfs4) +--- nfs-utils-1.0.9/utils/mount/mount.c.orig 2006-07-07 20:04:32.000000000 -0400 ++++ nfs-utils-1.0.9/utils/mount/mount.c 2006-07-28 11:07:24.000000000 -0400 +@@ -28,6 +28,7 @@ + #include + #include + #include ++#include + + #include "fstab.h" + #include "xcommon.h" +@@ -74,6 +75,12 @@ struct opt_map { + int mask; /* flag mask value */ + }; + ++/* Custom mount options for our own purposes. */ ++/* Maybe these should now be freed for kernel use again */ ++#define MS_DUMMY 0x00000000 ++#define MS_USERS 0x40000000 ++#define MS_USER 0x20000000 ++ + static const struct opt_map opt_map[] = { + { "defaults", 0, 0, 0 }, /* default options */ + { "ro", 1, 0, MS_RDONLY }, /* read-only */ +@@ -90,6 +97,18 @@ static const struct opt_map opt_map[] = + { "remount", 0, 0, MS_REMOUNT}, /* Alter flags of mounted FS */ + { "bind", 0, 0, MS_BIND }, /* Remount part of tree elsewhere */ + { "rbind", 0, 0, MS_BIND|MS_REC }, /* Idem, plus mounted subtrees */ ++ { "auto", 0, 0, MS_DUMMY }, /* Can be mounted using -a */ ++ { "noauto", 0, 0, MS_DUMMY }, /* Can only be mounted explicitly */ ++ { "users", 0, 0, MS_USERS }, /* Allow ordinary user to mount */ ++ { "nousers", 0, 1, MS_USERS }, /* Forbid ordinary user to mount */ ++ { "user", 0, 0, MS_USER }, /* Allow ordinary user to mount */ ++ { "nouser", 0, 1, MS_USER }, /* Forbid ordinary user to mount */ ++ { "owner", 0, 0, MS_DUMMY }, /* Let the owner of the device mount */ ++ { "noowner", 0, 0, MS_DUMMY }, /* Device owner has no special privs */ ++ { "group", 0, 0, MS_DUMMY }, /* Let the group of the device mount */ ++ { "nogroup", 0, 0, MS_DUMMY }, /* Device group has no special privs */ ++ { "_netdev", 0, 0, MS_DUMMY}, /* Device requires network */ ++ { "comment", 0, 0, MS_DUMMY}, /* fstab comment only (kudzu,_netdev)*/ + + /* add new options here */ + #ifdef MS_NOSUB +@@ -104,6 +123,7 @@ static const struct opt_map opt_map[] = + { "mand", 0, 0, MS_MANDLOCK }, /* Allow mandatory locks on this FS */ + { "nomand", 0, 1, MS_MANDLOCK }, /* Forbid mandatory locks on this FS */ + #endif ++ { "loop", 1, 0, MS_DUMMY }, /* use a loop device */ + #ifdef MS_NOATIME + { "atime", 0, 1, MS_NOATIME }, /* Update access time */ + { "noatime", 0, 0, MS_NOATIME }, /* Do not update access time */ +@@ -121,6 +141,12 @@ static char * fix_opts_string (int flags + char *new_opts; + + new_opts = xstrdup((flags & MS_RDONLY) ? "ro" : "rw"); ++ if (flags & MS_USER) { ++ struct passwd *pw = getpwuid(getuid()); ++ if(pw) ++ new_opts = xstrconcat3(new_opts, ",user=", pw->pw_name); ++ } ++ + for (om = opt_map; om->opt != NULL; om++) { + if (om->skip) + continue; +@@ -132,9 +158,20 @@ static char * fix_opts_string (int flags + if (extra_opts && *extra_opts) { + new_opts = xstrconcat3(new_opts, ",", extra_opts); + } ++ + return new_opts; + } + ++void copy_mntent(struct mntent *ment, nfs_mntent_t *nment) ++{ ++ /* Not sure why nfs_mntent_t should exist */ ++ strcpy(nment->mnt_fsname, ment->mnt_fsname); ++ strcpy(nment->mnt_dir, ment->mnt_dir); ++ strcpy(nment->mnt_type, ment->mnt_type); ++ strcpy(nment->mnt_opts, ment->mnt_opts); ++ nment->mnt_freq = ment->mnt_freq; ++ nment->mnt_passno = ment->mnt_passno; ++} + + int add_mtab(char *fsname, char *mount_point, char *fstype, int flags, char *opts, int freq, int passno) + { +@@ -146,8 +183,16 @@ int add_mtab(char *fsname, char *mount_p + ment.mnt_dir = mount_point; + ment.mnt_type = fstype; + ment.mnt_opts = fix_opts_string(flags, opts); +- ment.mnt_freq = 0; +- ment.mnt_passno= 0; ++ ment.mnt_freq = freq; ++ ment.mnt_passno= passno; ++ ++ if(flags & MS_REMOUNT) { ++ nfs_mntent_t nment; ++ ++ copy_mntent(&ment, &nment); ++ update_mtab(nment.mnt_dir, &nment); ++ return 0; ++ } + + if ((fd = open(MOUNTED"~", O_RDWR|O_CREAT|O_EXCL, 0600)) == -1) { + fprintf(stderr, "Can't get "MOUNTED"~ lock file"); +@@ -242,20 +287,56 @@ static void parse_opts (const char *opti + + } + ++/* ++ * Look for an option in a comma-separated list ++ */ ++int ++contains(const char *list, const char *s) { ++ int n = strlen(s); ++ ++ while (*list) { ++ if (strncmp(list, s, n) == 0 && ++ (list[n] == 0 || list[n] == ',')) ++ return 1; ++ while (*list && *list++ != ',') ; ++ } ++ return 0; ++} ++ ++/* ++ * If list contains "user=peter" and we ask for "user=", return "peter" ++ */ ++char * ++get_value(const char *list, const char *s) { ++ const char *t; ++ int n = strlen(s); ++ ++ while (*list) { ++ if (strncmp(list, s, n) == 0) { ++ s = t = list+n; ++ while (*s && *s != ',') ++ s++; ++ return xstrndup(t, s-t); ++ } ++ while (*list && *list++ != ',') ; ++ } ++ return 0; ++} ++ + static void mount_error(char *node) + { + switch(errno) { + case ENOTDIR: +- printf("%s: mount point %s is not a directory\n", progname, node); ++ fprintf(stderr, "%s: mount point %s is not a directory\n", progname, node); + break; + case EBUSY: +- printf("%s: %s is already mounted or busy\n", progname, node); ++ fprintf(stderr, "%s: %s is already mounted or busy\n", progname, node); + break; + case ENOENT: +- printf("%s: mount point %s does not exist\n", progname, node); ++ fprintf(stderr, "%s: mount point %s does not exist\n", progname, node); + break; + default: +- printf("%s: %s\n", progname, strerror(errno)); ++ fprintf(stderr, "%s: %s\n", progname, strerror(errno)); + } + } + +@@ -264,16 +345,13 @@ int main(int argc, char *argv[]) + int c, flags = 0, nfs_mount_vers = 0, mnt_err = 1, fake = 0; + char *spec, *mount_point, *extra_opts = NULL; + char *mount_opts = NULL, *p; ++ struct mntentchn *mc; ++ uid_t uid = getuid(); + + progname = argv[0]; + if ((p = strrchr(progname, '/')) != NULL) + progname = p+1; + +- if (getuid() != 0) { +- printf("%s: only root can do that.\n", progname); +- exit(1); +- } +- + if(!strncmp(progname, "umount", strlen("umount"))) { + if(argc < 2) { + umount_usage(); +@@ -355,9 +433,33 @@ int main(int argc, char *argv[]) + + spec = argv[1]; + mount_point = canonicalize(argv[2]); +- ++ + parse_opts(mount_opts, &flags, &extra_opts); + ++ if (uid != 0 && !(flags & MS_USERS) && !(flags & MS_USER)) { ++ fprintf(stderr, "%s: permission denied\n", progname); ++ exit(1); ++ } ++ ++ if ((flags & MS_USER || flags & MS_USERS) && uid != 0) { ++ /* check if fstab has entry, and further see if the user or users option is given */ ++ if ((mc = getfsspec(spec)) == NULL && ++ (mc = getfsfile(spec)) == NULL) { ++ fprintf(stderr, "%s: permission denied - invalid option\n", progname); ++ exit(1); ++ } ++ else { ++ if((flags & MS_USER) && !contains(mc->m.mnt_opts, "user")) { ++ fprintf(stderr, "%s: permission denied - invalid option\n", progname); ++ exit(1); ++ } ++ if((flags & MS_USERS) && !contains(mc->m.mnt_opts, "users")) { ++ fprintf(stderr, "%s: permission denied - invalid option\n", progname); ++ exit(1); ++ } ++ } ++ } ++ + if (!strcmp(progname, "mount.nfs4") || nfs_mount_vers == 4) { + nfs_mount_vers = 4; + mnt_err = nfs4mount(spec, mount_point, &flags, &extra_opts, &mount_opts, 0); +@@ -370,16 +472,19 @@ int main(int argc, char *argv[]) + } + + if (!mnt_err && !fake) { +- mnt_err = do_mount_syscall(spec, mount_point, nfs_mount_vers == 4 ? "nfs4" : "nfs", flags, mount_opts); ++ if(!(flags & MS_REMOUNT)) { ++ mnt_err = do_mount_syscall(spec, mount_point, ++ nfs_mount_vers == 4 ? "nfs4" : "nfs", flags, mount_opts); + +- if(mnt_err) { +- mount_error(mount_point); +- exit(-1); ++ if(mnt_err) { ++ mount_error(mount_point); ++ exit(-1); ++ } + } +- +- if(!nomtab) ++ if(!nomtab) { + add_mtab(spec, mount_point, nfs_mount_vers == 4 ? "nfs4" : "nfs", + flags, extra_opts, 0, 0); ++ } + } + + return 0; +--- nfs-utils-1.0.9/utils/mount/nfs_mount.h.orig 2006-07-07 20:04:32.000000000 -0400 ++++ nfs-utils-1.0.9/utils/mount/nfs_mount.h 2006-07-28 11:07:24.000000000 -0400 +@@ -80,5 +80,7 @@ struct nfs_mount_data { + + int nfsmount(const char *, const char *, int *, char **, char **, int *, int); + void mount_errors(char *, int, int); ++int contains(const char *, const char *); ++char *get_value(const char *, const char *); + + #endif /* _NFS_MOUNT_H */ +--- nfs-utils-1.0.9/utils/mount/nfsumount.c.orig 2006-07-07 20:04:32.000000000 -0400 ++++ nfs-utils-1.0.9/utils/mount/nfsumount.c 2006-07-28 11:07:24.000000000 -0400 +@@ -23,12 +23,14 @@ + #include + #include + #include ++#include + + #include "xcommon.h" + #include "fstab.h" + #include "nls.h" + #include "conn.h" + ++#include "nfs_mount.h" + #include "mount_constants.h" + #include "mount.h" + #include "nfsumount.h" +@@ -307,7 +309,7 @@ int _nfsumount(const char *spec, const c + goto out_bad; + return nfs_call_umount(&mnt_server, &dirname); + out_bad: +- printf("%s: %s: not found or not mounted\n", progname, spec); ++ fprintf(stderr, "%s: %s: not found or not mounted\n", progname, spec); + return 0; + } + +@@ -376,6 +378,21 @@ int nfsumount(int argc, char *argv[]) + printf(_("Could not find %s in mtab\n"), spec); + + if(mc) { ++ if(contains(mc->m.mnt_opts, "user") && getuid() != 0) { ++ struct passwd *pw = getpwuid(getuid()); ++ if(!pw || strcmp(pw->pw_name, get_value(mc->m.mnt_opts, "user="))) { ++ fprintf(stderr, "%s: permission denied to unmount %s\n", ++ progname, spec); ++ exit(1); ++ } ++ } else { ++ if(!contains(mc->m.mnt_opts, "users") && getuid() != 0) { ++ fprintf(stderr, "%s: only root can unmount %s from %s\n", ++ progname, mc->m.mnt_fsname, mc->m.mnt_dir); ++ exit(1); ++ } ++ } ++ + ret = _nfsumount(mc->m.mnt_fsname, mc->m.mnt_opts); + if(ret) + ret = add_mtab2(mc->m.mnt_fsname, mc->m.mnt_dir, diff --git a/nfs-utils.spec b/nfs-utils.spec index a6012e9..517df0d 100644 --- a/nfs-utils.spec +++ b/nfs-utils.spec @@ -1,12 +1,16 @@ Summary: NFS utlilities and supporting daemons for the kernel NFS server. Name: nfs-utils Version: 1.0.9 -Release: 1%{?dist} -#Epoch: 1 +Release: 2%{?dist} # group all 32bit related archs %define all_32bit_archs i386 i686 athlon +# Create mount.nfs and umount.nfs binaries that will be +# used by the system mount command to mount (and umount) +# both NFS and NFS4 filesystems. +%define enablemount 1 + Source0: http://www.kernel.org/pub/linux/utils/nfs/nfs-utils-1.0.9.tar.bz2 Source1: ftp://nfs.sourceforge.net/pub/nfs/nfs.doc.tar.gz @@ -21,6 +25,9 @@ Patch51: nfs-utils-1.0.6-mountd.patch Patch52: nfs-utils-1.0.6-idmap.conf.patch Patch53: nfs-utils-1.0.6-gssd_mixed_case.patch Patch54: nfs-utils-1.0.8-privports.patch +Patch55: nfs-utils-1.0.9-mount-options-v3.patch +Patch56: nfs-utils-1.0.9-lazy-umount.patch +Patch57: nfs-utils-1.0.9-mount-fsc.patch Patch100: nfs-utils-1.0.8-compile.patch @@ -65,6 +72,9 @@ clients which are mounted on that host. %patch52 -p1 %patch53 -p1 %patch54 -p1 +%patch55 -p1 +%patch56 -p1 +%patch57 -p1 # Do the magic to get things to compile %patch100 -p1 @@ -73,6 +83,9 @@ clients which are mounted on that host. find . -name "*.orig" | xargs rm -f %build +%if %{enablemount} +ENABLEMOUNT="--enable-mount" +%endif %ifarch s390 s390x PIE="-fPIE" @@ -88,7 +101,8 @@ CFLAGS="`echo $RPM_OPT_FLAGS $ARCH_OPT_FLAGS $PIE`" CFLAGS="$CFLAGS" \ CPPFLAGS="$DEFINES" \ LDFLAGS="-pie" \ - --prefix=$RPM_BUILD_ROOT + --prefix=$RPM_BUILD_ROOT \ + $ENABLEMOUNT make all @@ -113,6 +127,10 @@ mkdir -p $RPM_BUILD_ROOT/var/lib/nfs/rpc_pipefs touch $RPM_BUILD_ROOT/var/lib/nfs/rmtab mv $RPM_BUILD_ROOT/usr/sbin/{rpc.lockd,rpc.statd} $RPM_BUILD_ROOT/sbin +%if %{enablemount} +mv $RPM_BUILD_ROOT/usr/sbin/{mount.*,umount.*} $RPM_BUILD_ROOT/sbin +%endif + mkdir -p $RPM_BUILD_ROOT/var/lib/nfs/statd mkdir -p $RPM_BUILD_ROOT/var/lib/nfs/v4recovery @@ -222,7 +240,20 @@ fi %{_mandir}/*/* %config /etc/rc.d/init.d/nfslock +%if %{enablemount} +%attr(4755,root,root) /sbin/mount.nfs +%attr(4755,root,root) /sbin/mount.nfs4 +%attr(4755,root,root) /sbin/umount.nfs +%attr(4755,root,root) /sbin/umount.nfs4 +%endif + %changelog +* Fri Jul 28 2006 1.0.9-2 +- Enabled the creating of mount.nfs and umount.nfs binaries +- Added mount option fixes suggested by upstream. +- Fix lazy umounts (bz 169299) +- Added -o fsc mount option. + * Mon Jul 24 2006 1.0.9-1 - Updated to 1.0.9 release