Date: Thu, 9 Aug 2007 19:44:10 +0200 From: Pawel Jakub Dawidek <pjd@FreeBSD.org> To: Scot Hetzel <swhetzel@gmail.com> Cc: FreeBSD-CURRENT@freebsd.org Subject: Re: mount gets into a state where it won't set/unset ZFS properties (atime, exec, setuid) Message-ID: <20070809174410.GA9454@garage.freebsd.pl> In-Reply-To: <790a9fff0708091007h48cb5133t16638a24076795f8@mail.gmail.com> References: <790a9fff0708091007h48cb5133t16638a24076795f8@mail.gmail.com>
index | next in thread | previous in thread | raw e-mail
[-- Attachment #1 --] On Thu, Aug 09, 2007 at 12:07:08PM -0500, Scot Hetzel wrote: > While checking out a problem with mount unsetting noatime on a UFS > system, I tested mount with both a UFS and ZFS filesystems. The ZFS > filesystem had several problems: > > hp010# uname -a > FreeBSD hp010.hetzel.org 7.0-CURRENT FreeBSD 7.0-CURRENT #0: Wed Aug > 8 10:38:34 CDT 2007 > root@hp010.hetzel.org:/usr/src/7x/sys/amd64/compile/GENERIC.debug > amd64 > > hp010# umount /usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime on default > rootpool/usr/ports/distfiles exec on default > rootpool/usr/ports/distfiles setuid on default > > hp010# zfs mount -a > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime on default > rootpool/usr/ports/distfiles exec on default > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local) > > hp010# mount -u -o noexec,nosuid /usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime on default > rootpool/usr/ports/distfiles exec off temporary > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, > noexec, nosuid) > > Why doesn't the setuid property change to 'temporary' for > rootpool/usr/ports/distfiles? > > hp010# mount -u -o exec,suid /usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime on default > rootpool/usr/ports/distfiles exec off temporary > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, > noexec, nosuid) > > mount can't get rid of these options. > > hp010# mount -u -o noatime /usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime off temporary > rootpool/usr/ports/distfiles exec off temporary > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, > noatime, noexec, nosuid) > > hp010# mount -u -o atime /usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime off temporary > rootpool/usr/ports/distfiles exec off temporary > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, > noatime, noexec, nosuid) > > Same problem with getting rid of noatime. I would have expected mount > to be able to be able to change the zfs properties of atime, exec back > to on. > > hp010# zfs inherit -r atime rootpool/usr/ports/distfiles > hp010# zfs inherit -r exec rootpool/usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime on default > rootpool/usr/ports/distfiles exec on default > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, nosuid) > > > hp010# zfs set setuid=off rootpool/usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime on default > rootpool/usr/ports/distfiles exec on default > rootpool/usr/ports/distfiles setuid off local > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, nosuid) > > hp010# zfs inherit -r setuid rootpool/usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime on default > rootpool/usr/ports/distfiles exec on default > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local) > > We have now set everything back to the default mount options using 'zfs inherit' > > hp010# mount -u -o noatime,noexec,nosuid /usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime on default > rootpool/usr/ports/distfiles exec on default > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, nosuid) > > Now mount can't set noatime or noexec. > > hp010# zfs inherit -r setuid rootpool/usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime on default > rootpool/usr/ports/distfiles exec on default > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local) > > Back to the defaults again. > > This last part gets a bit strange, without umounting > /usr/ports/distfiles, I tried the following: > > hp010# mount -u -o nosuid /usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime on default > rootpool/usr/ports/distfiles exec on default > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, nosuid) > hp010# zfs set setuid=off rootpool/usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime on default > rootpool/usr/ports/distfiles exec on default > rootpool/usr/ports/distfiles setuid off local > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, nosuid) > hp010# zfs inherit -r setuid rootpool/usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime on default > rootpool/usr/ports/distfiles exec on default > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local) > hp010# mount -u -o noatime,noexec,nosuid /usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime on default > rootpool/usr/ports/distfiles exec off temporary > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, > noexec, nosuid) > hp010# zfs inherit -r setuid rootpool/usr/ports/distfiles > hp010# zfs inherit -r exec rootpool/usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime on default > rootpool/usr/ports/distfiles exec on default > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local) > hp010# mount -u -o noatime,noexec,nosuid /usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime on default > rootpool/usr/ports/distfiles exec off temporary > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, > noexec, nosuid) > > It won't set noatime when noexec and nosuid are specified. > > hp010# mount -u -o noatime /usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime on default > rootpool/usr/ports/distfiles exec on default > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, nosuid) > > Now it removed noexec, and didn't set noatime. > > hp010# zfs inherit -r setuid rootpool/usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime on default > rootpool/usr/ports/distfiles exec on default > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local) > > Lets try setting noatime again: > > hp010# mount -u -o noatime /usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime on default > rootpool/usr/ports/distfiles exec on default > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, nosuid) > > mount shows nosuid. Lets unset if with zfs inherit: > > hp010# zfs inherit -r setuid rootpool/usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime on default > rootpool/usr/ports/distfiles exec on default > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local) > > nosuid is gone, lets see if we can now set noatime: > > hp010# mount -u -o noatime /usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime on default > rootpool/usr/ports/distfiles exec on default > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, nosuid) > > Again mount is showing nosuid: > > hp010# mount -u -o nonoatime /usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime on default > rootpool/usr/ports/distfiles exec on default > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, nosuid) > hp010# mount -u -o nonosuid /usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime on default > rootpool/usr/ports/distfiles exec on default > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, nosuid) > > Try nonoatime and nonosuid, but mount still showing nosuid. Using zfs > inherit gets rid of nosuid: > > hp010# zfs inherit -r setuid rootpool/usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime on default > rootpool/usr/ports/distfiles exec on default > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local) > > Give up, and umount the filesystem: > > hp010# umount /usr/ports/distfiles > hp010# zfs mount -a > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime on default > rootpool/usr/ports/distfiles exec on default > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local) > hp010# mount -u -o noatime /usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime off temporary > rootpool/usr/ports/distfiles exec on default > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, noatime) > > We can now set noatime, try nonoatime to unset it: > > hp010# mount -u -o nonoatime /usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime off temporary > rootpool/usr/ports/distfiles exec on default > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, noatime) > > That didn't work, does atime work: > > hp010# mount -u -o atime /usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime off temporary > rootpool/usr/ports/distfiles exec on default > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, noatime) > > Reset atime to defaults with zfs inherit: > > hp010# zfs inherit -r atime rootpool/usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime on default > rootpool/usr/ports/distfiles exec on default > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local) > > Does nonoatime have any side efects now: > > hp010# mount -u -o nonoatime /usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime on default > rootpool/usr/ports/distfiles exec on default > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local) > > No side effect, lets try setting noatime: > > hp010# mount -u -o noatime /usr/ports/distfiles > hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount > | grep distfiles > NAME PROPERTY VALUE SOURCE > rootpool/usr/ports/distfiles atime on default > rootpool/usr/ports/distfiles exec on default > rootpool/usr/ports/distfiles setuid on default > rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local) > hp010# > > Now mount can't set noatime. Could you file a PR for this? The code responsible for mount options handling changed recently in ZFS, but I don't think I'll be able to integrate it before 7.0-RELEASE. -- Pawel Jakub Dawidek http://www.wheel.pl pjd@FreeBSD.org http://www.FreeBSD.org FreeBSD committer Am I Evil? Yes, I Am! [-- Attachment #2 --] -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.4 (FreeBSD) iD8DBQFGu1JqForvXbEpPzQRAiefAKDEOsUjfKTp2A08x4HzK8jiJlrGOgCfajNk vL1V4Ly1vzllwUgkfOm/Wiw= =rsjA -----END PGP SIGNATURE-----help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20070809174410.GA9454>
