From: Linus Torvalds <torvalds@linux-foundation.org>
To: Dmitry Potapov <dpotapov@gmail.com>
Cc: Git Mailing List <git@vger.kernel.org>,
Junio C Hamano <gitster@pobox.com>
Subject: [PATCH 3/3] Avoid doing extra 'lstat()'s for d_type if we have an up-to-date cache entry
Date: Wed, 8 Jul 2009 19:43:50 -0700 (PDT) [thread overview]
Message-ID: <alpine.LFD.2.01.0907081942380.3352@localhost.localdomain> (raw)
In-Reply-To: <alpine.LFD.2.01.0907081940220.3352@localhost.localdomain>
From: Linus Torvalds <torvalds@linux-foundation.org>
Date: Wed, 8 Jul 2009 19:31:49 -0700
Subject: [PATCH 3/3] Avoid doing extra 'lstat()'s for d_type if we have an up-to-date cache entry
On filesystems without d_type, we can look at the cache entry first.
Doing an lstat() can be expensive.
Reported by Dmitry Potapov for Cygwin.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
---
This is the same patch I already sent Dmitry, but now it applies on top of
the cleaned-up read_directory_recursive() code.
dir.c | 14 +++++++++-----
1 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/dir.c b/dir.c
index b0671f5..8a9e7d8 100644
--- a/dir.c
+++ b/dir.c
@@ -16,7 +16,7 @@ struct path_simplify {
static int read_directory_recursive(struct dir_struct *dir, const char *path, int len,
int check_only, const struct path_simplify *simplify);
-static int get_dtype(struct dirent *de, const char *path);
+static int get_dtype(struct dirent *de, const char *path, int len);
static int common_prefix(const char **pathspec)
{
@@ -326,7 +326,7 @@ static int excluded_1(const char *pathname,
if (x->flags & EXC_FLAG_MUSTBEDIR) {
if (*dtype == DT_UNKNOWN)
- *dtype = get_dtype(NULL, pathname);
+ *dtype = get_dtype(NULL, pathname, pathlen);
if (*dtype != DT_DIR)
continue;
}
@@ -566,14 +566,18 @@ static int in_pathspec(const char *path, int len, const struct path_simplify *si
return 0;
}
-static int get_dtype(struct dirent *de, const char *path)
+static int get_dtype(struct dirent *de, const char *path, int len)
{
int dtype = de ? DTYPE(de) : DT_UNKNOWN;
+ struct cache_entry *ce;
struct stat st;
if (dtype != DT_UNKNOWN)
return dtype;
- if (lstat(path, &st))
+ ce = cache_name_exists(path, len, 0);
+ if (ce && ce_uptodate(ce))
+ st.st_mode = ce->ce_mode;
+ else if (lstat(path, &st))
return dtype;
if (S_ISREG(st.st_mode))
return DT_REG;
@@ -633,7 +637,7 @@ static int read_directory_recursive(struct dir_struct *dir, const char *base, in
continue;
if (dtype == DT_UNKNOWN)
- dtype = get_dtype(de, path);
+ dtype = get_dtype(de, path, len);
/*
* Do we want to see just the ignored files?
--
1.6.3.3.412.gf581d
next prev parent reply other threads:[~2009-07-09 2:44 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-07-07 0:05 Too many 'stat' calls by git-status on Windows Dmitry Potapov
2009-07-08 19:49 ` Ramsay Jones
2009-07-09 2:04 ` Linus Torvalds
2009-07-09 2:35 ` Linus Torvalds
2009-07-09 2:40 ` [PATCH 1/3] Add 'fill_directory()' helper function for directory traversal Linus Torvalds
2009-07-09 2:42 ` [PATCH 2/3] Simplify read_directory[_recursive]() arguments Linus Torvalds
2009-07-09 2:43 ` Linus Torvalds [this message]
2009-07-09 8:18 ` [PATCH 3/3] Avoid doing extra 'lstat()'s for d_type if we have an up-to-date cache entry Junio C Hamano
2009-07-09 15:52 ` Linus Torvalds
2009-07-09 16:32 ` Junio C Hamano
2009-07-09 16:59 ` Linus Torvalds
2009-07-09 18:34 ` Junio C Hamano
2009-07-09 17:13 ` Linus Torvalds
2009-07-09 17:18 ` Linus Torvalds
2009-07-09 18:37 ` Junio C Hamano
2009-07-09 18:53 ` Linus Torvalds
2009-07-09 20:44 ` [PATCH 4/3] Avoid using 'lstat()' to figure out directories Linus Torvalds
2009-07-09 20:47 ` [PATCH 5/3] Prepare symlink caching for thread-safety Linus Torvalds
2009-07-09 20:48 ` [PATCH 6/3] Export thread-safe version of 'has_symlink_leading_path()' Linus Torvalds
2009-07-09 20:50 ` [PATCH 7/3] Make index preloading check the whole path to the file Linus Torvalds
2009-07-09 20:56 ` Linus Torvalds
2009-07-10 3:12 ` Junio C Hamano
2009-07-10 3:29 ` Linus Torvalds
2009-07-10 3:40 ` Linus Torvalds
2009-07-11 2:53 ` Junio C Hamano
2009-07-11 3:04 ` Linus Torvalds
2009-07-12 0:09 ` [PATCH 6/3] Export thread-safe version of 'has_symlink_leading_path()' Kjetil Barvik
2009-07-12 21:33 ` Junio C Hamano
2009-07-09 22:36 ` [PATCH 4/3] Avoid using 'lstat()' to figure out directories Paolo Bonzini
2009-07-09 23:26 ` Linus Torvalds
2009-07-09 23:52 ` Linus Torvalds
2009-07-10 0:13 ` Linus Torvalds
2009-07-09 23:37 ` Junio C Hamano
2009-07-09 21:05 ` [PATCH 3/3] Avoid doing extra 'lstat()'s for d_type if we have an up-to-date cache entry Dmitry Potapov
2009-07-09 21:52 ` Eric Blake
2009-07-09 23:30 ` [PATCH 3/3] Avoid doing extra 'lstat()'s for d_type if we have?an " Dmitry Potapov
2009-07-10 13:04 ` Dmitry Potapov
2009-07-09 23:29 ` [PATCH 3/3] Avoid doing extra 'lstat()'s for d_type if we have an " Dmitry Potapov
2009-07-09 13:50 ` Dmitry Potapov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=alpine.LFD.2.01.0907081942380.3352@localhost.localdomain \
--to=torvalds@linux-foundation.org \
--cc=dpotapov@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).