Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 13 Jun 2018 12:44:45 +0000 (UTC)
From:      Bruce Evans <bde@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r335057 - head/sys/compat/linux
Message-ID:  <201806131244.w5DCijH8013783@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bde
Date: Wed Jun 13 12:44:45 2018
New Revision: 335057
URL: https://svnweb.freebsd.org/changeset/base/335057

Log:
  Oops, r335053 had an old version of the comment about 16-bit linux dev_t
  translation.

Modified:
  head/sys/compat/linux/linux_stats.c

Modified: head/sys/compat/linux/linux_stats.c
==============================================================================
--- head/sys/compat/linux/linux_stats.c	Wed Jun 13 12:33:47 2018	(r335056)
+++ head/sys/compat/linux/linux_stats.c	Wed Jun 13 12:44:45 2018	(r335057)
@@ -130,18 +130,20 @@ translate_fd_major_minor(struct thread *td, int fd, st
 
 /*
  * l_dev_t has the same encoding as dev_t in the latter's low 16 bits, so
- * don't bother going through major() and minor().  Keep doing blind
- * truncation, as for other fields.  The previous version didn't even do
- * blind truncation after dev_t was expanded to 64 bits.  It failed to
- * mask out bits 8-15 in minor().  These bits can only be nonzero in th
- * 64-bit version.
+ * truncation of a dev_t to 16 bits gives the same result as unpacking
+ * using major() and minor() and repacking in the l_dev_t format.  This
+ * detail is hidden in dev_to_ldev().  Overflow in conversions of dev_t's
+ * are not checked for, as for other fields.
  *
- * This is only used for st_dev.  st_dev is for the mounted-on device so
- * it can't be a device that needs very special translation.  The translation
- * of blind truncation is done here.  st_rdev is supposed to be specially
- * translated in callers, with the blind truncation done there too and
- * st_rdev in the native struct state abused to hold the linux st_rdev.
- * Callers do the last step using an open-coded Linux makedev().
+ * dev_to_ldev() is only used for translating st_dev.  When we convert
+ * st_rdev for copying it out, it isn't really a dev_t, but has already
+ * been translated to an l_dev_t in a nontrivial way.  Translating it
+ * again would be illogical but would have no effect since the low 16
+ * bits have the same encoding.
+ *
+ * The nontrivial translation for st_rdev renumbers some devices, but not
+ * ones that can be mounted on, so it is consistent with the translation
+ * for st_dev except when the renumbering or truncation causes conflicts.
  */
 #define	dev_to_ldev(d)	((uint16_t)(d))
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201806131244.w5DCijH8013783>