Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 14 Mar 2014 02:10:30 +0000 (UTC)
From:      Bryan Drewery <bdrewery@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r263131 - head/sys/fs/tmpfs
Message-ID:  <201403140210.s2E2AUgZ016017@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bdrewery
Date: Fri Mar 14 02:10:30 2014
New Revision: 263131
URL: http://svnweb.freebsd.org/changeset/base/263131

Log:
  Cleanup redundant logic and add some comments to help explain how
  it works in lieu of potentially less clear code.
  
  Sponsored by:	EMC / Isilon Storage Division
  Discussed with:	Russell Cattelan

Modified:
  head/sys/fs/tmpfs/tmpfs_subr.c

Modified: head/sys/fs/tmpfs/tmpfs_subr.c
==============================================================================
--- head/sys/fs/tmpfs/tmpfs_subr.c	Fri Mar 14 01:43:55 2014	(r263130)
+++ head/sys/fs/tmpfs/tmpfs_subr.c	Fri Mar 14 02:10:30 2014	(r263131)
@@ -348,6 +348,9 @@ tmpfs_dirent_hash(const char *name, u_in
 static __inline off_t
 tmpfs_dirent_cookie(struct tmpfs_dirent *de)
 {
+	if (de == NULL)
+		return (TMPFS_DIRCOOKIE_EOF);
+
 	MPASS(de->td_cookie >= TMPFS_DIRCOOKIE_MIN);
 
 	return (de->td_cookie);
@@ -1155,6 +1158,15 @@ tmpfs_dir_getdents(struct tmpfs_node *no
 	TMPFS_VALIDATE_DIR(node);
 
 	off = 0;
+
+	/*
+	 * Lookup the node from the current offset.  The starting offset of
+	 * 0 will lookup both '.' and '..', and then the first real entry,
+	 * or EOF if there are none.  Then find all entries for the dir that
+	 * fit into the buffer.  Once no more entries are found (de == NULL),
+	 * the offset is set to TMPFS_DIRCOOKIE_EOF, which will cause the next
+	 * call to return 0.
+	 */
 	switch (uio->uio_offset) {
 	case TMPFS_DIRCOOKIE_DOT:
 		error = tmpfs_dir_getdotdent(node, uio);
@@ -1168,12 +1180,10 @@ tmpfs_dir_getdents(struct tmpfs_node *no
 		if (error != 0)
 			return (error);
 		de = tmpfs_dir_first(node, &dc);
-		if (de == NULL)
-			uio->uio_offset = TMPFS_DIRCOOKIE_EOF;
-		else
-			uio->uio_offset = tmpfs_dirent_cookie(de);
+		uio->uio_offset = tmpfs_dirent_cookie(de);
 		if (cnt != 0)
 			cookies[(*ncookies)++] = off = uio->uio_offset;
+		/* EOF. */
 		if (de == NULL)
 			return (0);
 		break;
@@ -1252,10 +1262,7 @@ tmpfs_dir_getdents(struct tmpfs_node *no
 		if (error == 0) {
 			de = tmpfs_dir_next(node, &dc);
 			if (cnt != 0) {
-				if (de == NULL)
-					off = TMPFS_DIRCOOKIE_EOF;
-				else
-					off = tmpfs_dirent_cookie(de);
+				off = tmpfs_dirent_cookie(de);
 				MPASS(*ncookies < cnt);
 				cookies[(*ncookies)++] = off;
 			}
@@ -1263,12 +1270,8 @@ tmpfs_dir_getdents(struct tmpfs_node *no
 	} while (error == 0 && uio->uio_resid > 0 && de != NULL);
 
 	/* Update the offset and cache. */
-	if (cnt == 0) {
-		if (de == NULL)
-			off = TMPFS_DIRCOOKIE_EOF;
-		else
-			off = tmpfs_dirent_cookie(de);
-	}
+	if (cnt == 0)
+		off = tmpfs_dirent_cookie(de);
 
 	uio->uio_offset = off;
 	node->tn_dir.tn_readdir_lastn = off;



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