Bug 159010 - [zfs] zfsv28 serves bad device nodes via nfs on FreeBSD 8.2
Summary: [zfs] zfsv28 serves bad device nodes via nfs on FreeBSD 8.2
Status: Closed FIXED
Alias: None
Product: Base System
Classification: Unclassified
Component: kern (show other bugs)
Version: Unspecified
Hardware: Any Any
: Normal Affects Only Me
Assignee: Xin LI
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2011-07-18 16:20 UTC by Gerrit
Modified: 2011-08-03 19:30 UTC (History)
0 users

See Also:


Attachments
zfs-dev.diff (1.85 KB, patch)
2011-07-19 02:43 UTC, Xin LI
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Gerrit 2011-07-18 16:20:10 UTC
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.
Comment 1 Mark Linimon freebsd_committer freebsd_triage 2011-07-18 22:37:15 UTC
Responsible Changed
From-To: freebsd-bugs->freebsd-fs

Over to maintainer(s).
Comment 2 Xin LI 2011-07-19 02:43:10 UTC
-----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-----
Comment 3 Gerrit Kühn 2011-07-19 15:20:07 UTC
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
Comment 4 Martin Matuska freebsd_committer freebsd_triage 2011-07-20 10:29:34 UTC
-----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-----
Comment 5 Xin LI freebsd_committer freebsd_triage 2011-07-20 17:53:38 UTC
State Changed
From-To: open->patched

A fix have been committed to -HEAD (slightly different from 
the patch in reply).  Pending MFC reminder. 


Comment 6 Xin LI freebsd_committer freebsd_triage 2011-07-20 17:53:38 UTC
Responsible Changed
From-To: freebsd-fs->delphij

Take.
Comment 7 dfilter service freebsd_committer freebsd_triage 2011-07-20 17:53:46 UTC
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"
Comment 8 dfilter service freebsd_committer freebsd_triage 2011-08-03 19:12:09 UTC
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"
Comment 9 Xin LI freebsd_committer freebsd_triage 2011-08-03 19:30:17 UTC
State Changed
From-To: patched->closed

Patch applied against -STABLE.