Junio C Hamano <gitster@xxxxxxxxx> writes: <snipp> > If everything is working correctly, I do not think you will ever have a > situation where you check "A/B" here and get ENOTDIR back. lstat("A/B") > would yield ENOTDIR if "A" is not a directory, but: > > (1) If you did test "A" in the earlier round in the loop, you would have > already found it is not a directory and would have exited the loop > with LSTAT_ERR. You cannot test "A/B" in such a case; > > (2) If you did not test "A" in the loop, that has to be because you had a > cached information for it, and the caching logic would have returned > early if "A" was a non-directory without entering the loop; in other > words, you would test "A/B" here without testing "A" in the loop only > when the cache says "A" was a directory. You cannot get ENOTDIR in > such a case. > > In any case, my main puzzlement still stands. I think ENOTDIR case should > behave differently from ENOENT case. > > And I think it is an indication of a grave error, either this code is > racing with an external process that is actively mucking with the work > tree to make your cached information unusable, or somebody forgot to call > clear_lstat_cache(). > > Hmm? I have looked at this once more, and I have to admit that what you have said is correct. Sorry for being confusing! I will update the patch by removing the 'errno == ENOTDIR' part from the if-test. -- kjetil -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html