Use correct UMNT version to do umount
Subsystems (2)
PATCH 1/4 Use correct UMNT version to do umount
This patch let umount to use correct UMNT version to do umount. In latest kernel, the version format is "vers=3" etc., and in old kernel the version format is "v3","v4" etc.
mount/nfsumount.c renamed from mount/nfsumount.c.orig +6 -1
@@ -257,6 +257,7 @@char *hostname;char *dirname;clnt_addr_t mnt_server = { &hostname, }; +struct mntent mnt = {.mnt_opts = opts};struct pmap *pmap = &mnt_server.pmap;char *p;
@@ -296,7 +297,11 @@ pmap->pm_prog =atoi (p+10 );if (opts && (p =strstr (opts,"mountport=" )) &&isdigit (*(p+10 ))) pmap->pm_port =atoi (p+10 ); -if (opts && (p =strstr (opts,"nfsvers=" )) &&isdigit (*(p+8 ))) +if (opts &&hasmntopt (&mnt,"v3" )) + pmap->pm_vers =MOUNTVERS_NFSV3 ; +if (opts &&hasmntopt (&mnt,"v4" )) + pmap->pm_vers =4 ; +if (opts && (p =strstr (opts,"vers=" )) &&isdigit (*(p+8 ))) pmap->pm_vers =nfsvers_to_mnt (atoi (p+8 ));if (opts && (p =strstr (opts,"mountvers=" )) &&isdigit (*(p+10 ))) pmap->pm_vers =atoi (p+10 );
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs
Sorry to send old patch. This is the new patch.
Quoted 4 lines
This patch let umount to use correct UMNT version to do umount. In latest kernel, the version format is "vers=3" etc., and in old kernel the version format is "v3","v4" etc.
mount/nfsumount.c renamed from mount/nfsumount.c.orig.rel +10 -3
@@ -257,6 +257,7 @@char *hostname;char *dirname;clnt_addr_t mnt_server = { &hostname, }; +struct mntent mnt = { .mnt_opts = opts };struct pmap *pmap = &mnt_server.pmap;char *p;
@@ -290,14 +291,20 @@ } pmap->pm_prog =MOUNTPROG ; - pmap->pm_vers =MOUNTVERS ; + pmap->pm_vers =MOUNTVERS_NFSV3 ; pmap->pm_prot =get_mntproto (spec);if (opts && (p =strstr (opts,"mountprog=" )) &&isdigit (*(p+10 ))) pmap->pm_prog =atoi (p+10 );if (opts && (p =strstr (opts,"mountport=" )) &&isdigit (*(p+10 ))) pmap->pm_port =atoi (p+10 ); -if (opts && (p =strstr (opts,"nfsvers=" )) &&isdigit (*(p+8 ))) - pmap->pm_vers =nfsvers_to_mnt (atoi (p+8 )); +if (opts &&hasmntopt (&mnt,"v2" )) + pmap->pm_vers =nfsvers_to_mnt (2 ); +if (opts &&hasmntopt (&mnt,"v3" )) + pmap->pm_vers =nfsvers_to_mnt (3 ); +if (opts &&hasmntopt (&mnt,"v4" )) + pmap->pm_vers =nfsvers_to_mnt (4 ); +if (opts && (p =strstr (opts,"vers=" )) &&isdigit (*(p+5 ))) + pmap->pm_vers =nfsvers_to_mnt (atoi (p+5 ));if (opts && (p =strstr (opts,"mountvers=" )) &&isdigit (*(p+10 ))) pmap->pm_vers =atoi (p+10 );
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs
Thanks for these patches. I have applied them.
I subsequently realised that reading from /proc/mounts first is not such a good idea as some options such as mount_vers do not appear in /proc/mounts, only in /etc/mtab. So I removed that part of the patch. I made some other changes as you can see at
or below.
Thanks,
NeilBrown
From: Neil Brown <[email protected]>
Date: Fri, 16 Mar 2007 02:56:25 +0000 (+1100)
Subject: Further tidyup of nfs_umount.
X-Git-Url: http://linux-nfs.org/cgi-bin/gitweb.cgi?p=nfs-utils;a=commitdiff;h=1e42be20a3283994d0ffd6c5f80c36fab5a887a8
Further tidyup of nfs_umount.
- remove non-used arguments from del_mtab.
- Don't try to pass a "host:/path" string to umount.
It used to be possible to umount("/dev/whatever"). It has never been possible to umount("host:/path").
- Don't try to read /proc/mounts first. Some mount options (mount_vers) are only stored in /etc/mtab, not in /proc/mounts. So we have to prefer /etc/mtab as getmntXbackwards do.
- Only every call one of getmnt{dir,dev}backwards, depending on whether 'spec' looks like a path name or a host:/path.
- Don't call _nfsumount unless we have a host:/path, or del_mtab unless we have a path name.
---
utils/mount/nfsumount.c +16 -65
@@ -91,30 +91,6 @@ int nfs_call_umount(clnt_addr_t *mnt_serreturn res; } -struct mntentchn * -getmntentchn (const char *dir) -{ -mntFILE *mfp; -nfs_mntent_t *mnt; -struct mntentchn *mc =NULL ; - - mfp =nfs_setmntent ("/proc/mounts" ,"r" ); -if (mfp ==NULL || mfp->mntent_fp ==NULL ) -return NULL ; - -while ((mnt =nfs_getmntent (mfp)) !=NULL ) { -if (strcmp (mnt->mnt_fsname, dir) &&strcmp (mnt->mnt_dir, dir)) -continue ; - -if (!mc) - mc = (struct mntentchn *)xmalloc (sizeof (*mc)); - mc->m = *mnt; - } - -nfs_endmntent (mfp); -return mc; -} -/* complain about a failed umount */ static void complain (int err,const char *dev) {switch (err) {
@@ -139,12 +115,11 @@ static void complain(int err, const char } } -int del_mtab (const char *spec,const char *node,const char *type, -const char *opts,struct mntentchn *mc) +int del_mtab (const char *spec,const char *node) { -int umnt_err, umnt_err2, res; +int umnt_err, res; - umnt_err = umnt_err2 =0 ; + umnt_err =0 ;if (lazy) { res =umount2 (node,MNT_DETACH );if (res <0 )
@@ -167,27 +142,7 @@ int del_mtab(const char *spec, const cha }else res =umount (node); -if (res <0 ) { - umnt_err = errno; -/* A device might have been mounted on a node that has since -been deleted or renamed, so if node fails, also try spec. */ -/* Note that this is incorrect in case spec was mounted -several times. */ -/* if (umnt_err == ENOENT || umnt_err == EINVAL) */ -if (umnt_err !=EBUSY &&strcmp (node, spec)) { -if (verbose) -printf (_ ("could not umount %s - trying %s instead\n" ), - node, spec); - res =umount (spec); -if (res <0 ) - umnt_err2 = errno; -/* Do not complain about remote NFS mount points */ -if (errno ==ENOENT &&index (spec,':' )) - umnt_err2 =0 ; - } - } - -if (res <0 && remount && (umnt_err ==EBUSY || umnt_err2 ==EBUSY )) { +if (res <0 && remount && errno ==EBUSY && spec) {/* Umount failed - let us try a remount */ res =mount (spec, node,NULL ,MS_MGC_VAL |MS_REMOUNT |MS_RDONLY ,NULL );
@@ -213,21 +168,19 @@ int del_mtab(const char *spec, const chaif (res >=0 ) {/* Umount succeeded */ if (verbose) -printf (_ ("%s umounted\n" ), spec); +printf (_ ("%s umounted\n" ), spec ? spec : node); } writemtab:if (!nomtab && (umnt_err ==0 || umnt_err ==EINVAL || umnt_err ==ENOENT )) { -update_mtab (node,NULL ); +update_mtab (node,NULL ); }if (res >=0 )return 0 ; -if (umnt_err2) -complain (umnt_err2, spec); -if (umnt_err && umnt_err != umnt_err2) +if (umnt_err)complain (umnt_err, node);return 1 ; }
@@ -364,24 +317,22 @@ int nfsumount(int argc, char *argv[])return 0 ; } - mc =getmntentchn (spec); -if (!mc) +if (*spec =='/' ) mc =getmntdirbackward (spec,NULL ); -if (!mc) +else mc =getmntdevbackward (spec,NULL );if (!mc && verbose)printf (_ ("Could not find %s in mtab\n" ), spec); -if (mc) { +if (mc) { ret =_nfsumount (mc->m.mnt_fsname, mc->m.mnt_opts);if (ret) - ret =del_mtab (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 =del_mtab (spec, spec, spec, spec,NULL ); + ret =del_mtab (mc->m.mnt_fsname, mc->m.mnt_dir); + }else { +if (*spec !='/' ) + ret =_nfsumount (spec,"tcp,v3" ); +else + ret =del_mtab (NULL , spec); }return (ret);
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs