From 94c59c97f9bed27ac820c5501c1e3a531ea918f0 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Wed, 1 Oct 2008 12:21:58 +0200 Subject: remove.c: combine two helper functions, to avoid sign-extension * src/remove.c (fs_handles_readdir_ordered_dirents_efficiently): Remove function, so as not to have to worry about the type of statfs.f_type and sign extension. (dirent_inode_sort_may_be_useful): Adjust comment. Perform the switch directly on the struct.member here, instead. Andreas Schwab spotted the potential for a sign-extension bug, that happens not to bite for the S_* f_type values currently used. --- src/remove.c | 43 ++++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/remove.c b/src/remove.c index 6c1eaea5c..30931b0f7 100644 --- a/src/remove.c +++ b/src/remove.c @@ -1280,24 +1280,11 @@ dirent_count (struct stat const *st) #if defined HAVE_SYS_VFS_H && HAVE_FSTATFS && HAVE_STRUCT_STATFS_F_TYPE # include # include "fs.h" -/* FIXME: what about when f_type is not an integral type? - deal with that if/when it's encountered. */ -static bool -fs_handles_readdir_ordered_dirents_efficiently (uintmax_t fs_type) -{ - switch (fs_type) - { - case S_MAGIC_TMPFS: - case S_MAGIC_NFS: - return true; - default: - return false; - } -} -/* Return true if it is easy to determine the file system type of the - directory on which DIR_FD is open, and sorting dirents on inode numbers - is known to improve traversal performance with that type of file system. */ +/* Return false if it is easy to determine the file system type of + the directory on which DIR_FD is open, and sorting dirents on + inode numbers is known not to improve traversal performance with + that type of file system. Otherwise, return true. */ static bool dirent_inode_sort_may_be_useful (int dir_fd) { @@ -1307,10 +1294,24 @@ dirent_inode_sort_may_be_useful (int dir_fd) while the cost of *not* performing it can be O(N^2) with a very large constant. */ struct statfs fs_buf; - bool skip = (fstatfs (dir_fd, &fs_buf) == 0 - && fs_handles_readdir_ordered_dirents_efficiently - (fs_buf.f_type)); - return !skip; + + /* If fstatfs fails, assume sorting would be useful. */ + if (fstatfs (dir_fd, &fs_buf) != 0) + return true; + + /* FIXME: what about when f_type is not an integral type? + deal with that if/when it's encountered. */ + switch (fs_buf.f_type) + { + case S_MAGIC_TMPFS: + case S_MAGIC_NFS: + /* On a file system of any of these types, sorting + is unnecessary, and hence wasteful. */ + return false; + + default: + return true; + } } #else static bool dirent_inode_sort_may_be_useful (int dir_fd) { return true; } -- cgit v1.2.3-54-g00ecf