Date: Wed, 18 Apr 2012 09:23:50 GMT From: Marcelo Araujo <araujo@FreeBSD.org> To: freebsd-gnats-submit@FreeBSD.org Subject: kern/167048: RELEASE-9 crash when using ZFS+NULLFS+NFS Message-ID: <201204180923.q3I9NogK070902@red.freebsd.org> Resent-Message-ID: <201204180930.q3I9U6xk018550@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 167048 >Category: kern >Synopsis: RELEASE-9 crash when using ZFS+NULLFS+NFS >Confidential: no >Severity: critical >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Wed Apr 18 09:30:05 UTC 2012 >Closed-Date: >Last-Modified: >Originator: Marcelo Araujo >Release: RELEASE-9 crash when using ZFS+NULLFS+NFS >Organization: FreeBSD >Environment: System: FreeBSD vibration.freebsd.org 9.0-RELEASE FreeBSD 9.0-RELEASE #13: Wed Apr 18 04:38:26 BRT 2012 araujo@vibration.freebsd.org:/usr/obj/usr/src/sys/NFS i386 >Description: If we create a pool with ZFS, mount it using nullfs in another path and export it using NFS, when the user mount the NFS in another machine and try to perform a ls -a inside /mnt/.zfs we have the crash. More information about it could be found at: http://people.freebsd.org/~araujo/dump_nfs/ >How-To-Repeat: root# zpool create tank raidz /dev/ada1 /dev/ada2 root# mount nullfs /tank /mnt root# echo "/mnt -alldirs" >>/etc/exports root# /etc/rc.d/mountd restart 1) Mount the NFS share in another machine. 2) cd /mnt/.zfs/ 3) ls -la >Fix: On FreeBSD-HEAD the problem doesn’t happens anymore, but investigate it, the patch attached that was obtained from HEAD, solved this issue. Patch attached with submission follows: --- /home/araujo/nfsd/freebsd9_src/sys/fs/nfsserver/nfs_nfsdport.c 2012-04-16 04:02:30.000000000 -0300 +++ nfs_nfsdport.c 2012-04-18 03:38:16.000000000 -0300 @@ -2624,7 +2624,7 @@ if (VFS_NEEDSGIANT(mp)) error = ESTALE; else - error = VFS_FHTOVP(mp, &fhp->fh_fid, LK_EXCLUSIVE, vpp); + error = VFS_FHTOVP(mp, &fhp->fh_fid, lktype, vpp); if (error != 0) /* Make sure the server replies ESTALE to the client. */ error = ESTALE; @@ -2645,13 +2645,6 @@ exp->nes_secflavors[i] = secflavors[i]; } } - if (error == 0 && lktype == LK_SHARED) - /* - * It would be much better to pass lktype to VFS_FHTOVP(), - * but this will have to do until VFS_FHTOVP() has a lock - * type argument like VFS_VGET(). - */ - NFSVOPLOCK(*vpp, LK_DOWNGRADE | LK_RETRY); NFSEXITCODE(error); return (error); >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201204180923.q3I9NogK070902>