All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] umount.nfs: restore correct error status when umount fails.
@ 2012-07-12  3:27 NeilBrown
  2012-07-12 16:44 ` Karel Zak
  2012-07-16 12:57 ` Steve Dickson
  0 siblings, 2 replies; 4+ messages in thread
From: NeilBrown @ 2012-07-12  3:27 UTC (permalink / raw)
  To: Steve Dickson; +Cc: NFS

[-- Attachment #1: Type: text/plain, Size: 2179 bytes --]



If nfs-utils is built without --enable-libmount-mount, then
an unmount that failed due to the filesystem being busy will
exit with '16' - EX_FILEIO.
Autofs apparently relies on this.

When built with --enable-libmount-mount, the same case will
exit with '32' - EX_FAIL.  Normally this is reserved for
internal errors.

This patch restores the use of EX_FILEIO for errors from umount.

Signed-off-by: NeilBrown <neilb@suse.de>
--

I confess that I haven't done a complete case analysis to see that we are
always using the correct error code, but this looks OK and handles the case
I care about.

There is a case that I know it doesn't handle.  If you ask umount.nfs to
unmount a filesystem that is not nfs or nfs4, then the old code will
refuse
  umount.nfs: /dev/sda7 on /mnt2 is not an NFS filesystem

and exit with status '1'.
The new libmount code will just think that it couldn't find anything in
fstab and will try to do an nfs23 unmount.  This is clearly different behaviour,
I'm not sure that anyone would care though.

NeilBrown


diff --git a/utils/mount/mount_libmount.c b/utils/mount/mount_libmount.c
index e8f17a9..5c1116a 100644
--- a/utils/mount/mount_libmount.c
+++ b/utils/mount/mount_libmount.c
@@ -173,6 +173,7 @@ static int umount_main(struct libmnt_context *cxt, int argc, char **argv)
 {
 	int rc, c;
 	char *spec = NULL, *opts = NULL;
+	int ret = EX_FAIL;
 
 	static const struct option longopts[] = {
 		{ "force", 0, 0, 'f' },
@@ -243,7 +244,7 @@ static int umount_main(struct libmnt_context *cxt, int argc, char **argv)
 			/* strange, no entry in mtab or /proc not mounted */
 			nfs_umount23(spec, "tcp,v3");
 	}
-
+	ret = EX_FILEIO;
 	rc = mnt_context_do_umount(cxt);	/* call umount(2) syscall */
 	mnt_context_finalize_mount(cxt);	/* mtab update */
 
@@ -252,12 +253,10 @@ static int umount_main(struct libmnt_context *cxt, int argc, char **argv)
 		umount_error(rc, spec);
 		goto err;
 	}
-
-	free(opts);
-	return EX_SUCCESS;
+	ret = EX_SUCCESS;
 err:
 	free(opts);
-	return EX_FAIL;
+	return ret;
 }
 
 static int mount_main(struct libmnt_context *cxt, int argc, char **argv)

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 828 bytes --]

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] umount.nfs: restore correct error status when umount fails.
  2012-07-12  3:27 [PATCH] umount.nfs: restore correct error status when umount fails NeilBrown
@ 2012-07-12 16:44 ` Karel Zak
  2012-07-12 20:16   ` NeilBrown
  2012-07-16 12:57 ` Steve Dickson
  1 sibling, 1 reply; 4+ messages in thread
From: Karel Zak @ 2012-07-12 16:44 UTC (permalink / raw)
  To: NeilBrown; +Cc: Steve Dickson, NFS

> This patch restores the use of EX_FILEIO for errors from umount.

 Looks good to me.

 Reviewed-by: Karel Zak <kzak@redhat.com>

> There is a case that I know it doesn't handle.  If you ask umount.nfs to
> unmount a filesystem that is not nfs or nfs4, then the old code will
> refuse
>   umount.nfs: /dev/sda7 on /mnt2 is not an NFS filesystem
> 
> and exit with status '1'.
> The new libmount code will just think that it couldn't find anything in
> fstab and will try to do an nfs23 unmount.  This is clearly different behaviour,
> I'm not sure that anyone would care though.

 I care, it's stupid bug to use umount.nfs for non-NFS filesytems. The
 patch below fixes this issue.

    Karel


>From 6071375b67ece8cb1a8321a55eb491d36f2fbf75 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 12 Jul 2012 18:33:43 +0200
Subject: [PATCH] umount.nfs: ignore non-nfs filesystems

 # umount.nfs /boot; echo $?
 umount.nfs: /boot: device is busy
 32

expected and fixed behavior:

 # umount.nfs /boot; echo $?
 # umount.nfs: /boot: is not an NFS filesystem
 1

Note that the function mnt_context_set_fstype_pattern() has never
been used for mtab/fstab evaluation. It's usable only for "umount -a"
and for "mount -t" operations.

Reported-by: NeilBrown <neilb@suse.de>
Signed-off-by: Karel Zak <kzak@redhat.com>
---
 utils/mount/mount_libmount.c |   11 +++++++++--
 1 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/utils/mount/mount_libmount.c b/utils/mount/mount_libmount.c
index 5c1116a..ddf61b2 100644
--- a/utils/mount/mount_libmount.c
+++ b/utils/mount/mount_libmount.c
@@ -210,8 +210,6 @@ static int umount_main(struct libmnt_context *cxt, int argc, char **argv)
 
 	if (mnt_context_set_target(cxt, spec))
 		goto err;
-	if (mnt_context_set_fstype_pattern(cxt, "nfs,nfs4"))	/* restrict filesystems */
-		goto err;
 
 	/* read mtab/fstab, evaluate permissions, etc. */
 	rc = mnt_context_prepare_umount(cxt);
@@ -221,6 +219,14 @@ static int umount_main(struct libmnt_context *cxt, int argc, char **argv)
 		goto err;
 	}
 
+	if (mnt_context_get_fstype(cxt) &&
+	    !mnt_match_fstype(mnt_context_get_fstype(cxt), "nfs,nfs4")) {
+
+		nfs_error(_("%s: %s: is not an NFS filesystem"), progname, spec);
+		ret = EX_USAGE;
+		goto err;
+	}
+
 	opts = retrieve_mount_options(mnt_context_get_fs(cxt));
 
 	if (!mnt_context_is_lazy(cxt)) {
@@ -244,6 +250,7 @@ static int umount_main(struct libmnt_context *cxt, int argc, char **argv)
 			/* strange, no entry in mtab or /proc not mounted */
 			nfs_umount23(spec, "tcp,v3");
 	}
+
 	ret = EX_FILEIO;
 	rc = mnt_context_do_umount(cxt);	/* call umount(2) syscall */
 	mnt_context_finalize_mount(cxt);	/* mtab update */
-- 
1.7.7.6


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] umount.nfs: restore correct error status when umount fails.
  2012-07-12 16:44 ` Karel Zak
@ 2012-07-12 20:16   ` NeilBrown
  0 siblings, 0 replies; 4+ messages in thread
From: NeilBrown @ 2012-07-12 20:16 UTC (permalink / raw)
  To: Karel Zak; +Cc: Steve Dickson, NFS

[-- Attachment #1: Type: text/plain, Size: 852 bytes --]

On Thu, 12 Jul 2012 18:44:20 +0200 Karel Zak <kzak@redhat.com> wrote:

> > This patch restores the use of EX_FILEIO for errors from umount.
> 
>  Looks good to me.
> 
>  Reviewed-by: Karel Zak <kzak@redhat.com>
> 
> > There is a case that I know it doesn't handle.  If you ask umount.nfs to
> > unmount a filesystem that is not nfs or nfs4, then the old code will
> > refuse
> >   umount.nfs: /dev/sda7 on /mnt2 is not an NFS filesystem
> > 
> > and exit with status '1'.
> > The new libmount code will just think that it couldn't find anything in
> > fstab and will try to do an nfs23 unmount.  This is clearly different behaviour,
> > I'm not sure that anyone would care though.
> 
>  I care, it's stupid bug to use umount.nfs for non-NFS filesytems. The
>  patch below fixes this issue.
> 
Cool - thanks for that!

NeilBrown

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 828 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] umount.nfs: restore correct error status when umount fails.
  2012-07-12  3:27 [PATCH] umount.nfs: restore correct error status when umount fails NeilBrown
  2012-07-12 16:44 ` Karel Zak
@ 2012-07-16 12:57 ` Steve Dickson
  1 sibling, 0 replies; 4+ messages in thread
From: Steve Dickson @ 2012-07-16 12:57 UTC (permalink / raw)
  To: NeilBrown; +Cc: NFS



On 07/11/2012 11:27 PM, NeilBrown wrote:
> 
> 
> If nfs-utils is built without --enable-libmount-mount, then
> an unmount that failed due to the filesystem being busy will
> exit with '16' - EX_FILEIO.
> Autofs apparently relies on this.
> 
> When built with --enable-libmount-mount, the same case will
> exit with '32' - EX_FAIL.  Normally this is reserved for
> internal errors.
> 
> This patch restores the use of EX_FILEIO for errors from umount.
> 
> Signed-off-by: NeilBrown <neilb@suse.de>
Committed....

steved.

> --
> 
> I confess that I haven't done a complete case analysis to see that we are
> always using the correct error code, but this looks OK and handles the case
> I care about.
> 
> There is a case that I know it doesn't handle.  If you ask umount.nfs to
> unmount a filesystem that is not nfs or nfs4, then the old code will
> refuse
>   umount.nfs: /dev/sda7 on /mnt2 is not an NFS filesystem
> 
> and exit with status '1'.
> The new libmount code will just think that it couldn't find anything in
> fstab and will try to do an nfs23 unmount.  This is clearly different behaviour,
> I'm not sure that anyone would care though.
> 
> NeilBrown
> 
> 
> diff --git a/utils/mount/mount_libmount.c b/utils/mount/mount_libmount.c
> index e8f17a9..5c1116a 100644
> --- a/utils/mount/mount_libmount.c
> +++ b/utils/mount/mount_libmount.c
> @@ -173,6 +173,7 @@ static int umount_main(struct libmnt_context *cxt, int argc, char **argv)
>  {
>  	int rc, c;
>  	char *spec = NULL, *opts = NULL;
> +	int ret = EX_FAIL;
>  
>  	static const struct option longopts[] = {
>  		{ "force", 0, 0, 'f' },
> @@ -243,7 +244,7 @@ static int umount_main(struct libmnt_context *cxt, int argc, char **argv)
>  			/* strange, no entry in mtab or /proc not mounted */
>  			nfs_umount23(spec, "tcp,v3");
>  	}
> -
> +	ret = EX_FILEIO;
>  	rc = mnt_context_do_umount(cxt);	/* call umount(2) syscall */
>  	mnt_context_finalize_mount(cxt);	/* mtab update */
>  
> @@ -252,12 +253,10 @@ static int umount_main(struct libmnt_context *cxt, int argc, char **argv)
>  		umount_error(rc, spec);
>  		goto err;
>  	}
> -
> -	free(opts);
> -	return EX_SUCCESS;
> +	ret = EX_SUCCESS;
>  err:
>  	free(opts);
> -	return EX_FAIL;
> +	return ret;
>  }
>  
>  static int mount_main(struct libmnt_context *cxt, int argc, char **argv)

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2012-07-16 12:57 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-07-12  3:27 [PATCH] umount.nfs: restore correct error status when umount fails NeilBrown
2012-07-12 16:44 ` Karel Zak
2012-07-12 20:16   ` NeilBrown
2012-07-16 12:57 ` Steve Dickson

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.