Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 12 Jun 2012 05:40:08 GMT
From:      Bryan Drewery <bryan@shatow.net>
To:        freebsd-fs@FreeBSD.org
Subject:   Re: kern/167905: [zfs] zfs set canmount=on UNMOUNTS dataset
Message-ID:  <201206120540.q5C5e8Bc017067@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/167905; it has been noted by GNATS.

From: Bryan Drewery <bryan@shatow.net>
To: bug-followup@FreeBSD.org, vermaden@interia.pl
Cc: Pawel Jakub Dawidek <pjd@FreeBSD.org>, mm@freebsd.org
Subject: Re: kern/167905: [zfs] zfs set canmount=on UNMOUNTS dataset
Date: Tue, 12 Jun 2012 00:35:58 -0500

 This is a multi-part message in MIME format.
 --------------040108060500020307070404
 Content-Type: text/plain; charset=ISO-8859-1
 Content-Transfer-Encoding: 7bit
 
 Attached is a patch to fix setting 'zfs set canmount=on' to not cause a
 remount if the dataset is *already mounted*. This fixes the issue
 reported here, as well as here
 http://lists.freebsd.org/pipermail/freebsd-fs/2012-May/014241.html
 
 $ cd /usr/src/cddl
 $ patch -p1 < patch-zfs-dataset-canmount-on.txt
 $ make obj depend all install
 
 The change adds to the complex condition as I did not want to refactor
 it too much given the unclear "contrib" status of the code.
 
 Also attached is a test script to see the functionality before and after.
 
 I did some research and neither OpenIndiana/Illumos nor ZfsOnLinux have
 addressed this issue. Not sure the proper way to share or report this
 "upstream" currently.
 
 Regards,
 Bryan Drewery
 
 --------------040108060500020307070404
 Content-Type: text/plain; charset=windows-1252;
  name="patch-zfs-dataset-canmount-on.txt"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment;
  filename="patch-zfs-dataset-canmount-on.txt"
 
 --- cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c.orig	2012-06-12 00:10:11.000000000 -0500
 +++ cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c	2012-06-12 00:17:34.000000000 -0500
 @@ -1467,11 +1467,12 @@
  
  	/*
  	 * If the dataset's canmount property is being set to noauto,
 +	 * or to on and already mounted,
  	 * then we want to prevent unmounting & remounting it.
  	 */
  	do_prefix = !((prop == ZFS_PROP_CANMOUNT) &&
  	    (zprop_string_to_index(prop, propval, &idx,
 -	    ZFS_TYPE_DATASET) == 0) && (idx == ZFS_CANMOUNT_NOAUTO));
 +	    ZFS_TYPE_DATASET) == 0) && (idx == ZFS_CANMOUNT_NOAUTO || (idx == ZFS_CANMOUNT_ON && zfs_is_mounted(zhp, NULL))));
  
  	if (do_prefix && (ret = changelist_prefix(cl)) != 0)
  		goto error;
 
 --------------040108060500020307070404
 Content-Type: text/plain; charset=windows-1252;
  name="test-zsh.sh"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment;
  filename="test-zsh.sh"
 
 #! /bin/sh
 set -e
 
 cleanup() {
 	test -z "${PASS}" && echo "FAILED"
 	cd /
 	zpool destroy zpool
 	mdconfig -d -u 0
 	mdconfig -d -u 1
 }
 
 run() {
 	echo "$@"
 	"$@"
 	return $?
 }
 
 trap cleanup SIGINT SIGTERM SIGKILL EXIT
 
 
 rm -rf /tmp/test
 mdconfig -a -t swap -s 128M -u 0
 mdconfig -a -t swap -s 128M -u 1
 zpool create zpool mirror md0 md1
 zfs create -o mountpoint=/tmp/test -o canmount=on zpool/test 
 cd /tmp/test
 
 # This fails even though the property is not changing and dataset is already mounted
 run zfs set canmount=on zpool/test
 # Currently works
 run zfs set canmount=noauto zpool/test
 # Expect this to try to unmount and fail, may warrant more discussion
 #run zfs set canmount=off zpool/test
 # This fails even though the property is not changing and dataset is already mounted
 run zfs set canmount=on zpool/test
 
 echo "PASS"
 PASS=1
 
 --------------040108060500020307070404--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201206120540.q5C5e8Bc017067>