svn commit: r323723 - in head/sys/ufs: ffs ufs

John Baldwin jhb at FreeBSD.org
Mon Sep 18 23:30:41 UTC 2017


Author: jhb
Date: Mon Sep 18 23:30:39 2017
New Revision: 323723
URL: https://svnweb.freebsd.org/changeset/base/323723

Log:
  Add UFS_LINK_MAX for the UFS-specific limit on link counts.
  
  ino64 expanded nlink_t to 64 bits, but the on-disk format for UFS is still
  limited to 16 bits.  This is a nop currently but will matter if LINK_MAX is
  increased in the future.
  
  Reviewed by:	kib
  Sponsored by:	Chelsio Communications

Modified:
  head/sys/ufs/ffs/ffs_softdep.c
  head/sys/ufs/ufs/dinode.h
  head/sys/ufs/ufs/ufs_vnops.c

Modified: head/sys/ufs/ffs/ffs_softdep.c
==============================================================================
--- head/sys/ufs/ffs/ffs_softdep.c	Mon Sep 18 20:22:42 2017	(r323722)
+++ head/sys/ufs/ffs/ffs_softdep.c	Mon Sep 18 23:30:39 2017	(r323723)
@@ -11532,7 +11532,7 @@ handle_written_inodeblock(inodedep, bp, flags)
 	 */
 	if (inodedep->id_savedsize == -1 || inodedep->id_savedextsize == -1)
 		panic("handle_written_inodeblock: bad size");
-	if (inodedep->id_savednlink > LINK_MAX)
+	if (inodedep->id_savednlink > UFS_LINK_MAX)
 		panic("handle_written_inodeblock: Invalid link count "
 		    "%jd for inodedep %p", (uintmax_t)inodedep->id_savednlink,
 		    inodedep);

Modified: head/sys/ufs/ufs/dinode.h
==============================================================================
--- head/sys/ufs/ufs/dinode.h	Mon Sep 18 20:22:42 2017	(r323722)
+++ head/sys/ufs/ufs/dinode.h	Mon Sep 18 23:30:39 2017	(r323723)
@@ -186,4 +186,6 @@ struct ufs1_dinode {
 	u_int64_t	di_modrev;	/* 120: i_modrev for NFSv4 */
 };
 
+#define	UFS_LINK_MAX	32767
+
 #endif /* _UFS_UFS_DINODE_H_ */

Modified: head/sys/ufs/ufs/ufs_vnops.c
==============================================================================
--- head/sys/ufs/ufs/ufs_vnops.c	Mon Sep 18 20:22:42 2017	(r323722)
+++ head/sys/ufs/ufs/ufs_vnops.c	Mon Sep 18 23:30:39 2017	(r323723)
@@ -981,7 +981,7 @@ ufs_link(ap)
 		goto out;
 	}
 	ip = VTOI(vp);
-	if ((nlink_t)ip->i_nlink >= LINK_MAX) {
+	if (ip->i_nlink >= UFS_LINK_MAX) {
 		error = EMLINK;
 		goto out;
 	}
@@ -1266,7 +1266,7 @@ relock:
 	doingdirectory = 0;
 	newparent = 0;
 	ino = fip->i_number;
-	if (fip->i_nlink >= LINK_MAX) {
+	if (fip->i_nlink >= UFS_LINK_MAX) {
 		error = EMLINK;
 		goto unlockout;
 	}
@@ -1369,7 +1369,7 @@ relock:
 			 * actual link modification is completed when
 			 * .. is rewritten below.
 			 */
-			if ((nlink_t)tdp->i_nlink >= LINK_MAX) {
+			if (tdp->i_nlink >= UFS_LINK_MAX) {
 				error = EMLINK;
 				goto bad;
 			}
@@ -1793,7 +1793,7 @@ ufs_mkdir(ap)
 		panic("ufs_mkdir: no name");
 #endif
 	dp = VTOI(dvp);
-	if ((nlink_t)dp->i_nlink >= LINK_MAX) {
+	if (dp->i_nlink >= UFS_LINK_MAX) {
 		error = EMLINK;
 		goto out;
 	}
@@ -2442,6 +2442,9 @@ ufs_pathconf(ap)
 
 	error = 0;
 	switch (ap->a_name) {
+	case _PC_LINK_MAX:
+		*ap->a_retval = UFS_LINK_MAX;
+		break;
 	case _PC_NAME_MAX:
 		*ap->a_retval = UFS_MAXNAMLEN;
 		break;


More information about the svn-src-head mailing list