Copied from my email on freebsd-stable: I guess I found the root of all evil now: device nodes on zfs! This is how a linux /dev/console looked on the 8.0-FreeBSD server on zfsv15: crw------- 1 root wheel 5, 1 Oct 28 2010 /tank/diskless/gco-fe2/dev/console Now, after updating to FreeBSD-8.2 and zfsv28 it looks like this on the server: crw-r--r-- 1 root wheel 255, 0xffff00ff Jul 18 16:33 /tank/diskless/pt-fe2/dev/console Strange enough, the Linux client still displays the correct values when using "ls -la", but it refuses to work properly. I tried creating new device nodes from the client side with mknod and I tried getting correct ones from a backup, but they always end up being broken. Even moving the directories over to a ufs volume leaves them unusable: crw-r--r-- 1 root wheel 0, 0 Jul 18 16:33 /tmp/console Luckily, I am back into business now with my machines, because moving the stuff from zfs to ufs and dropping in a correct version of /dev on the ufs side works just fine. However, it would be great if this could be fixed, because I do not have many ufs partitions left these days... How-To-Repeat: Upgrade filesystems containing device nodes (Linux diskless client in this case) to zfsv28 on FreeBSD 8.2-stable.
Responsible Changed From-To: freebsd-bugs->freebsd-fs Over to maintainer(s).
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 Hi, Would you please try if the attached patch fixes the problem? Cheers, - -- Xin LI <delphij@delphij.net> https://www.delphij.net/ FreeBSD - The Power to Serve! Live free or die -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.17 (FreeBSD) iQEcBAEBCAAGBQJOJOEuAAoJEATO+BI/yjfB1jwH/3qM8a6z7mAcV4kDOT9Y02zb Z7ETklaUY47HeLaYYd/Rf9xfqHufJ3Uh8XZRKYN2VFDHxSEoDDfKWqLm3RNzXISn UHZFcZwuW2Cxj7s3PVAYx6a/3jcTuT+0gxyLh+u3bSCnH5Y/6gqrNY7czRXDb7Nq 4oatwM8cE1wvMgTFVfKgloA3yFld9B2ppCLBez3kMtf8moR61eBgTb5mdXQj4Gc+ 221MPTMMI0DmbWID8e5dJbMALlZa5Y6UnkBJFAZVkSMnQ6subzHXLHelJIecyJUP U4otUuzItXIA1mBRTjqQ6Rh5YXOKalQvkUb4Cn+S+w6QFOY3zsvm+Cp+FqgPh/o= =0RK6 -----END PGP SIGNATURE-----
Hi, The patch was rejected by patch(1) (was it against -stable or -current?), but I changed the relevant files by hand and recompiled the zfs kernel module. Good news: everything appears to be back to normal now. The dev nodes look ok on the filesystem now, and I can boot the diskless linux clients from zfs volumes over nfs again. If I have a voice, this patch should go into -stable and -current asap. :-) Thank you very much for your quick and professional support! cu Gerrit
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 I agree to Xin's patch and confirm it working. DÅa 19.07.2011 03:43, Xin LI wrote / napÃsal(a): > Hi, > > Would you please try if the attached patch fixes the problem? > > Cheers, - -- Martin Matuska FreeBSD committer http://blog.vx.sk -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iEYEARECAAYFAk4mn/gACgkQp2uLA0JhsNEIhgCgiHPUphuzKUm6yysbvoH9z9au jMYAniPlHGloF+ubr05eGGdpYOUeEsJ/ =SVT7 -----END PGP SIGNATURE-----
State Changed From-To: open->patched A fix have been committed to -HEAD (slightly different from the patch in reply). Pending MFC reminder.
Responsible Changed From-To: freebsd-fs->delphij Take.
Author: delphij Date: Wed Jul 20 16:53:32 2011 New Revision: 224231 URL: http://svn.freebsd.org/changeset/base/224231 Log: Add a new field to in-core znode, z_rdev, to represent device nodes. PR: kern/159010 Reviewed by: mm@ Approved by: re (kib) MFC after: 2 weeks Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h ============================================================================== --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h Wed Jul 20 16:52:51 2011 (r224230) +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h Wed Jul 20 16:53:32 2011 (r224231) @@ -209,6 +209,7 @@ typedef struct znode { boolean_t z_is_sa; /* are we native sa? */ /* FreeBSD-specific field. */ struct task z_task; + dev_t z_rdev; } znode_t; Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c ============================================================================== --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c Wed Jul 20 16:52:51 2011 (r224230) +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c Wed Jul 20 16:53:32 2011 (r224231) @@ -2694,7 +2694,7 @@ zfs_getattr(vnode_t *vp, vattr_t *vap, i vap->va_nlink = MIN(links, UINT32_MAX); /* nlink_t limit! */ vap->va_size = zp->z_size; vap->va_fsid = vp->v_mount->mnt_stat.f_fsid.val[0]; -// vap->va_rdev = zfs_cmpldev(pzp->zp_rdev); + vap->va_rdev = zp->z_rdev; vap->va_seq = zp->z_seq; vap->va_flags = 0; /* FreeBSD: Reset chflags(2) flags. */ Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c ============================================================================== --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c Wed Jul 20 16:52:51 2011 (r224230) +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c Wed Jul 20 16:53:32 2011 (r224231) @@ -700,6 +700,16 @@ zfs_znode_alloc(zfsvfs_t *zfsvfs, dmu_bu case VDIR: zp->z_zn_prefetch = B_TRUE; /* z_prefetch default is enabled */ break; + case VBLK: + case VCHR: + { + uint64_t rdev; + VERIFY(sa_lookup(zp->z_sa_hdl, SA_ZPL_RDEV(zfsvfs), + &rdev, sizeof (rdev)) == 0); + + zp->z_rdev = zfs_cmpldev(rdev); + } + break; case VFIFO: vp->v_op = &zfs_fifoops; break; _______________________________________________ svn-src-all@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
Author: delphij Date: Wed Aug 3 18:11:53 2011 New Revision: 224636 URL: http://svn.freebsd.org/changeset/base/224636 Log: MFC r224231,224251-224252: Make ZFS work better with respect to device nodes. PR: kern/159010 Modified: stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c ============================================================================== --- stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c Wed Aug 3 14:29:20 2011 (r224635) +++ stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c Wed Aug 3 18:11:53 2011 (r224636) @@ -2648,11 +2648,11 @@ zfs_getattr(vnode_t *vp, vattr_t *vap, i uint32_t blksize; u_longlong_t nblocks; uint64_t links; - uint64_t mtime[2], ctime[2], crtime[2]; + uint64_t mtime[2], ctime[2], crtime[2], rdev; xvattr_t *xvap = (xvattr_t *)vap; /* vap may be an xvattr_t * */ xoptattr_t *xoap = NULL; boolean_t skipaclchk = (flags & ATTR_NOACLCHECK) ? B_TRUE : B_FALSE; - sa_bulk_attr_t bulk[3]; + sa_bulk_attr_t bulk[4]; int count = 0; ZFS_ENTER(zfsvfs); @@ -2663,6 +2663,9 @@ zfs_getattr(vnode_t *vp, vattr_t *vap, i SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MTIME(zfsvfs), NULL, &mtime, 16); SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zfsvfs), NULL, &ctime, 16); SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zfsvfs), NULL, &crtime, 16); + if (vp->v_type == VBLK || vp->v_type == VCHR) + SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_RDEV(zfsvfs), NULL, + &rdev, 8); if ((error = sa_bulk_lookup(zp->z_sa_hdl, bulk, count)) != 0) { ZFS_EXIT(zfsvfs); @@ -2691,7 +2694,11 @@ zfs_getattr(vnode_t *vp, vattr_t *vap, i mutex_enter(&zp->z_lock); vap->va_type = IFTOVT(zp->z_mode); vap->va_mode = zp->z_mode & ~S_IFMT; -// vap->va_fsid = zp->z_zfsvfs->z_vfs->vfs_dev; +#ifdef sun + vap->va_fsid = zp->z_zfsvfs->z_vfs->vfs_dev; +#else + vap->va_fsid = vp->v_mount->mnt_stat.f_fsid.val[0]; +#endif vap->va_nodeid = zp->z_id; if ((vp->v_flag & VROOT) && zfs_show_ctldir(zp)) links = zp->z_links + 1; @@ -2699,8 +2706,12 @@ zfs_getattr(vnode_t *vp, vattr_t *vap, i links = zp->z_links; vap->va_nlink = MIN(links, UINT32_MAX); /* nlink_t limit! */ vap->va_size = zp->z_size; - vap->va_fsid = vp->v_mount->mnt_stat.f_fsid.val[0]; -// vap->va_rdev = zfs_cmpldev(pzp->zp_rdev); +#ifdef sun + vap->va_rdev = vp->v_rdev; +#else + if (vp->v_type == VBLK || vp->v_type == VCHR) + vap->va_rdev = zfs_cmpldev(rdev); +#endif vap->va_seq = zp->z_seq; vap->va_flags = 0; /* FreeBSD: Reset chflags(2) flags. */ Modified: stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c ============================================================================== --- stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c Wed Aug 3 14:29:20 2011 (r224635) +++ stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c Wed Aug 3 18:11:53 2011 (r224636) @@ -700,7 +700,23 @@ zfs_znode_alloc(zfsvfs_t *zfsvfs, dmu_bu case VDIR: zp->z_zn_prefetch = B_TRUE; /* z_prefetch default is enabled */ break; +#ifdef sun + case VBLK: + case VCHR: + { + uint64_t rdev; + VERIFY(sa_lookup(zp->z_sa_hdl, SA_ZPL_RDEV(zfsvfs), + &rdev, sizeof (rdev)) == 0); + + vp->v_rdev = zfs_cmpldev(rdev); + } + break; +#endif /* sun */ case VFIFO: +#ifdef sun + case VSOCK: + case VDOOR: +#endif /* sun */ vp->v_op = &zfs_fifoops; break; case VREG: @@ -709,6 +725,14 @@ zfs_znode_alloc(zfsvfs_t *zfsvfs, dmu_bu vp->v_op = &zfs_shareops; } break; +#ifdef sun + case VLNK: + vn_setops(vp, zfs_symvnodeops); + break; + default: + vn_setops(vp, zfs_evnodeops); + break; +#endif /* sun */ } if (vp->v_type != VFIFO) VN_LOCK_ASHARE(vp); _______________________________________________ svn-src-all@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
State Changed From-To: patched->closed Patch applied against -STABLE.