kern/125149: [zfs][nfs] changing into .zfs dir from
nfsclientcauses endless panic loop
Weldon Godfrey
wgodfrey at ena.com
Fri Oct 10 13:20:05 UTC 2008
The following reply was made to PR kern/125149; it has been noted by GNATS.
From: "Weldon Godfrey" <wgodfrey at ena.com>
To: "Jaakko Heinonen" <jh at saunalahti.fi>
Cc: <bug-followup at freebsd.org>
Subject: RE: kern/125149: [zfs][nfs] changing into .zfs dir from nfsclientcauses endless panic loop
Date: Fri, 10 Oct 2008 08:11:17 -0500
That's okay, although I won't be able to help test since I am close to
using the system in production. We can live without needing to go to
.zfs directory from a client. Also, I have set the nordirplus option on
the clients now. =20
Which, btw, could this also be the other issue I was seeing? When we
tested rigoriously from CentOS 3.x clients, after 2-3 hrs of testing,
the system would panic. From the fbsd-fs list, it was noted from the
backtrace that the vnode was becoming invalid. This seemed to be less
of a case with CentOS 5.x clients (by a lot, although I did get 1 panic
recently). I am rerunning the tests over this weekend.
Thank you for helping!
Weldon
-----Original Message-----
From: Jaakko Heinonen [mailto:jh at saunalahti.fi]=20
Sent: Thursday, October 09, 2008 2:45 PM
To: Weldon Godfrey
Cc: bug-followup at freebsd.org
Subject: Re: kern/125149: [zfs][nfs] changing into .zfs dir from
nfsclientcauses endless panic loop
On 2008-10-09, Weldon Godfrey wrote:
> Is this patch based on 8-CURRENT or 7-RELEASE? If 8-CURRENT, I don't
> know if I can test as I would like to stick with 7-RELEASE for now.
Patches are against head. Sorry that I didn't mention that. The nfs
patch applies against RELENG_7 with offset and here's the zfs patch
against RELENG_7. (Disclaimer: compile tested only)
%%%
Index: sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
(revision 183727)
+++ sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c (working
copy)
@@ -759,9 +759,10 @@ zfs_vget(vfs_t *vfsp, ino_t ino, int fla
VN_RELE(ZTOV(zp));
err =3D EINVAL;
}
- if (err !=3D 0)
- *vpp =3D NULL;
- else {
+ if (err !=3D 0) {
+ /* try .zfs control directory */
+ err =3D zfsctl_vget(vfsp, ino, flags, vpp);
+ } else {
*vpp =3D ZTOV(zp);
vn_lock(*vpp, flags, curthread);
}
Index: sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c
(revision 183727)
+++ sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c (working
copy)
@@ -1044,6 +1044,63 @@ zfsctl_lookup_objset(vfs_t *vfsp, uint64
return (error);
}
=20
+int
+zfsctl_vget(vfs_t *vfsp, uint64_t nodeid, int flags, vnode_t **vpp)
+{
+ zfsvfs_t *zfsvfs =3D vfsp->vfs_data;
+ vnode_t *dvp, *vp;
+ zfsctl_snapdir_t *sdp;
+ zfsctl_node_t *zcp;
+ zfs_snapentry_t *sep;
+ int error;
+
+ *vpp =3D NULL;
+
+ ASSERT(zfsvfs->z_ctldir !=3D NULL);
+ error =3D zfsctl_root_lookup(zfsvfs->z_ctldir, "snapshot", &dvp,
+ NULL, 0, NULL, kcred);
+ if (error !=3D 0)
+ return (error);
+
+ if (nodeid =3D=3D ZFSCTL_INO_ROOT || nodeid =3D=3D ZFSCTL_INO_SNAPDIR) =
{
+ if (nodeid =3D=3D ZFSCTL_INO_SNAPDIR)
+ *vpp =3D dvp;
+ else {
+ VN_RELE(dvp);
+ *vpp =3D zfsvfs->z_ctldir;
+ VN_HOLD(*vpp);
+ }
+ /* XXX: LK_RETRY? */
+ vn_lock(*vpp, flags | LK_RETRY, curthread);
+ return (0);
+ }
+ =09
+ sdp =3D dvp->v_data;
+
+ mutex_enter(&sdp->sd_lock);
+ sep =3D avl_first(&sdp->sd_snaps);
+ while (sep !=3D NULL) {
+ vp =3D sep->se_root;
+ zcp =3D vp->v_data;
+ if (zcp->zc_id =3D=3D nodeid)
+ break;
+
+ sep =3D AVL_NEXT(&sdp->sd_snaps, sep);
+ }
+
+ if (sep !=3D NULL) {
+ VN_HOLD(vp);
+ *vpp =3D vp;
+ vn_lock(*vpp, flags, curthread);
+ } else
+ error =3D EINVAL;
+
+ mutex_exit(&sdp->sd_lock);
+
+ VN_RELE(dvp);
+
+ return (error);
+}
/*
* Unmount any snapshots for the given filesystem. This is called from
* zfs_umount() - if we have a ctldir, then go through and unmount all
the
Index: sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_ctldir.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_ctldir.h
(revision 183727)
+++ sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_ctldir.h
(working copy)
@@ -60,6 +60,7 @@ int zfsctl_root_lookup(vnode_t *dvp, cha
int flags, vnode_t *rdir, cred_t *cr);
=20
int zfsctl_lookup_objset(vfs_t *vfsp, uint64_t objsetid, zfsvfs_t
**zfsvfsp);
+int zfsctl_vget(vfs_t *vfsp, uint64_t nodeid, int flags, vnode_t
**vpp);
=20
#define ZFSCTL_INO_ROOT 0x1
#define ZFSCTL_INO_SNAPDIR 0x2
%%%
--=20
Jaakko
More information about the freebsd-fs
mailing list