From patchwork Thu Jul 12 16:44:20 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Karel Zak X-Patchwork-Id: 1190001 Return-Path: X-Original-To: patchwork-linux-nfs@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork1.kernel.org (Postfix) with ESMTP id 74F7A3FDAE for ; Thu, 12 Jul 2012 16:44:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755294Ab2GLQoa (ORCPT ); Thu, 12 Jul 2012 12:44:30 -0400 Received: from mx1.redhat.com ([209.132.183.28]:47575 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755233Ab2GLQo3 (ORCPT ); Thu, 12 Jul 2012 12:44:29 -0400 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q6CGiNg6019519 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 12 Jul 2012 12:44:23 -0400 Received: from x2 (ovpn-113-36.phx2.redhat.com [10.3.113.36]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q6CGiMPf002201; Thu, 12 Jul 2012 12:44:22 -0400 Date: Thu, 12 Jul 2012 18:44:20 +0200 From: Karel Zak To: NeilBrown Cc: Steve Dickson , NFS Subject: Re: [PATCH] umount.nfs: restore correct error status when umount fails. Message-ID: <20120712164420.GA15398@x2.net.home> References: <20120712132757.7f86b86b@notabene.brown> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20120712132757.7f86b86b@notabene.brown> User-Agent: Mutt/1.5.21 (2011-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org > This patch restores the use of EX_FILEIO for errors from umount. Looks good to me. Reviewed-by: Karel Zak > 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 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 Signed-off-by: Karel Zak --- 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 */