From owner-freebsd-bugs@FreeBSD.ORG Mon Apr 30 07:50:19 2012 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id E666E1065674 for ; Mon, 30 Apr 2012 07:50:19 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id BEC3D8FC0C for ; Mon, 30 Apr 2012 07:50:19 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.5/8.14.5) with ESMTP id q3U7oJCp065293 for ; Mon, 30 Apr 2012 07:50:19 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.5/8.14.5/Submit) id q3U7oJri065292; Mon, 30 Apr 2012 07:50:19 GMT (envelope-from gnats) Resent-Date: Mon, 30 Apr 2012 07:50:19 GMT Resent-Message-Id: <201204300750.q3U7oJri065292@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Marcelo Araujo Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 9A4C0106566B for ; Mon, 30 Apr 2012 07:49:07 +0000 (UTC) (envelope-from nobody@FreeBSD.org) Received: from red.freebsd.org (red.freebsd.org [IPv6:2001:4f8:fff6::22]) by mx1.freebsd.org (Postfix) with ESMTP id 7B3EF8FC0C for ; Mon, 30 Apr 2012 07:49:07 +0000 (UTC) Received: from red.freebsd.org (localhost [127.0.0.1]) by red.freebsd.org (8.14.4/8.14.4) with ESMTP id q3U7n7Yh090240 for ; Mon, 30 Apr 2012 07:49:07 GMT (envelope-from nobody@red.freebsd.org) Received: (from nobody@localhost) by red.freebsd.org (8.14.4/8.14.4/Submit) id q3U7n7gq090239; Mon, 30 Apr 2012 07:49:07 GMT (envelope-from nobody) Message-Id: <201204300749.q3U7n7gq090239@red.freebsd.org> Date: Mon, 30 Apr 2012 07:49:07 GMT From: Marcelo Araujo To: freebsd-gnats-submit@FreeBSD.org X-Send-Pr-Version: www-3.1 Cc: Subject: kern/167447: zfs rename with forced options to unmount. X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 30 Apr 2012 07:50:20 -0000 >Number: 167447 >Category: kern >Synopsis: zfs rename with forced options to unmount. >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Mon Apr 30 07:50:19 UTC 2012 >Closed-Date: >Last-Modified: >Originator: Marcelo Araujo >Release: 10.0-CURRENT >Organization: FreeBSD >Environment: FreeBSD hosta 10.0-CURRENT FreeBSD 10.0-CURRENT #2 r233530M: Mon Apr 23 11:51:58 UTC 2012 araujo@hosta:/usr/obj/usr/src/sys/HOSTA i386 >Description: Now is possible to use zfs rename -f to perform a force unmount. Based on Illumos-gate commit: a0cbef703c12 by Matt Ahrens. >How-To-Repeat: hosta# zfs rename -fp tank/oi tank/araujo hosta# zfs list NAME USED AVAIL REFER MOUNTPOINT tank 20.4M 39.1G 1.69M /tank tank/araujo 31K 39.1G 31K /tank/araujo tank/jail 31K 39.1G 31K /tank/jail tank/tank1 9.73M 39.1G 1.68M /tank/tank1 >Fix: Patch attached with submission follows: diff -r cfd524f8839b cddl/contrib/opensolaris/cmd/zfs/zfs.8 --- a/cddl/contrib/opensolaris/cmd/zfs/zfs.8 Sat Apr 28 23:13:09 2012 +0000 +++ b/cddl/contrib/opensolaris/cmd/zfs/zfs.8 Mon Apr 30 04:42:55 2012 +0000 @@ -18,9 +18,10 @@ .\" information: Portions Copyright [yyyy] [name of copyright owner] .\" .\" Copyright (c) 2010, Sun Microsystems, Inc. All Rights Reserved. -.\" Copyright (c) 2011 by Delphix. All rights reserved. +.\" Copyright (c) 2012 by Delphix. All rights reserved. .\" Copyright (c) 2012 Nexenta Systems, Inc. All Rights Reserved. .\" Copyright (c) 2011, Pawel Jakub Dawidek +.\" Copyright (c) 2012, Marcelo Araujo .\" .\" $FreeBSD$ .\" @@ -81,7 +82,7 @@ .Ar filesystem Ns | Ns Ar volume Ns | Ns Ar snapshot .Nm .Cm rename -.Fl p +.Fl fp .Ar filesystem Ns | Ns Ar volume .Ar filesystem Ns | Ns Ar volume .Nm @@ -1646,6 +1647,7 @@ .It Xo .Nm .Cm rename +.Fl fp .Ar filesystem Ns | Ns Ar volume Ns | Ns Ar snapshot .Ar filesystem Ns | Ns Ar volume Ns | Ns Ar snapshot .Xc @@ -1677,6 +1679,10 @@ are automatically mounted according to the .Sy mountpoint property inherited from their parent. +.It Fl f +Force +.Sy unmount +any filesystems that need to be unmounted in the process. .It Fl u Do not remount file systems during rename. If a file system's .Sy mountpoint diff -r cfd524f8839b cddl/contrib/opensolaris/cmd/zfs/zfs_main.c --- a/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c Sat Apr 28 23:13:09 2012 +0000 +++ b/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c Mon Apr 30 04:42:55 2012 +0000 @@ -22,10 +22,11 @@ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright 2012 Nexenta Systems, Inc. All rights reserved. - * Copyright (c) 2011 by Delphix. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. * Copyright (c) 2011-2012 Pawel Jakub Dawidek . * All rights reserved. * Copyright (c) 2011 Martin Matuska . All rights reserved. + * Copyright (c) 2012 Marcelo Araujo . All rights reserved. */ #include @@ -256,9 +257,9 @@ "snapshot>\n" "\treceive [-vnFu] [-d | -e] \n")); case HELP_RENAME: - return (gettext("\trename " + return (gettext("\trename [-f] " "\n" - "\trename -p \n" + "\trename [-f] -p \n" "\trename -r \n" "\trename -u [-p] ")); case HELP_ROLLBACK: @@ -3091,8 +3092,8 @@ } /* - * zfs rename - * zfs rename -p + * zfs rename [-f] + * zfs rename [-f] -p * zfs rename -r * zfs rename -u [-p] * @@ -3110,9 +3111,10 @@ int ret = 0; int types; boolean_t parents = B_FALSE; + boolean_t force_unmount = B_FALSE; /* check options */ - while ((c = getopt(argc, argv, "pru")) != -1) { + while ((c = getopt(argc, argv, "pruf")) != -1) { switch (c) { case 'p': parents = B_TRUE; @@ -3123,6 +3125,9 @@ case 'u': flags.nounmount = B_TRUE; break; + case 'f': + force_unmount = B_TRUE; + break; case '?': default: (void) fprintf(stderr, gettext("invalid option '%c'\n"), @@ -3185,7 +3190,7 @@ return (1); } - ret = (zfs_rename(zhp, argv[1], flags) != 0); + ret = (zfs_rename(zhp, argv[1], flags, force_unmount) != 0); zfs_close(zhp); return (ret); diff -r cfd524f8839b cddl/contrib/opensolaris/lib/libzfs/common/libzfs.h --- a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs.h Sat Apr 28 23:13:09 2012 +0000 +++ b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs.h Mon Apr 30 04:42:55 2012 +0000 @@ -543,7 +543,7 @@ int nounmount : 1; } renameflags_t; -extern int zfs_rename(zfs_handle_t *, const char *, renameflags_t flags); +extern int zfs_rename(zfs_handle_t *, const char *, renameflags_t flags, boolean_t); typedef struct sendflags { /* print informational messages (ie, -v was specified) */ diff -r cfd524f8839b cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c --- a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c Sat Apr 28 23:13:09 2012 +0000 +++ b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c Mon Apr 30 04:42:55 2012 +0000 @@ -3594,7 +3594,8 @@ * Renames the given dataset. */ int -zfs_rename(zfs_handle_t *zhp, const char *target, renameflags_t flags) +zfs_rename(zfs_handle_t *zhp, const char *target, renameflags_t flags, + boolean_t force_unmount) { int ret; zfs_cmd_t zc = { 0 }; @@ -3721,7 +3722,8 @@ } else { if ((cl = changelist_gather(zhp, ZFS_PROP_NAME, - flags.nounmount ? CL_GATHER_DONT_UNMOUNT : 0, 0)) == NULL) { + flags.nounmount ? CL_GATHER_DONT_UNMOUNT : 0 || + (int)force_unmount ? MS_FORCE : 0, 0)) == NULL) { return (-1); } >Release-Note: >Audit-Trail: >Unformatted: