From: Junio C Hamano <gitster@pobox.com>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Chris Mason <chris.mason@oracle.com>,
btrfs-devel@oss.oracle.com,
Paul Collins <paul@burly.ondioline.org>,
git@vger.kernel.org
Subject: Re: [Btrfs-devel] btrfs and git-reflog
Date: Fri, 25 Jan 2008 23:52:16 -0800 [thread overview]
Message-ID: <7v7ihx2fdb.fsf@gitster.siamese.dyndns.org> (raw)
In-Reply-To: <7vmyqt657t.fsf@gitster.siamese.dyndns.org> (Junio C. Hamano's message of "Fri, 25 Jan 2008 12:05:42 -0800")
Junio C Hamano <gitster@pobox.com> writes:
> I agree that this is a broken assumption on git's part. When we
> have this loop:
>
> while (ent = readdir()) {
> ... do something in that directory ...
> }
>
> we should expect readdir() may return new entries and cope with
> it, as "If a file is removed from or added to the directory
> after the most recent call to opendir() or rewinddir(), whether
> a subsequent call to readdir() returns an entry for that file is
> unspecified." [*1*]
Here is a result of a mini-audit.
* builtin-prune-packed.c::prune_dir() loops and unlinks (some
of) returned paths while in the loop. This should not
interfere with readdir(3). I am presuming that we can declare
readdir(3) implementation buggy if this happens:
* opendir();
* readdir() gives $P;
* unlink($P);
* readdir() later gives $P again.
Otherwise we need to lose check for return value from
unlink().
* builtin-prune.c::prune_dir() has a similar construct and the
same (non-)issue.
* dir.c::remove_dir_recursively() -- likewise.
* entry.c::remove_subtree() -- likewise. We might want to unify
this with the previous one.
A patch to "reflog-expire --all" will follow in a separate
message.
next prev parent reply other threads:[~2008-01-26 7:53 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-01-25 8:15 btrfs and git-reflog Paul Collins
2008-01-25 9:50 ` Paul Collins
2008-01-25 15:01 ` [Btrfs-devel] " Chris Mason
2008-01-25 15:50 ` Chris Mason
2008-01-25 17:09 ` Linus Torvalds
2008-01-25 20:05 ` Junio C Hamano
2008-01-26 7:52 ` Junio C Hamano [this message]
2008-01-27 7:22 ` Linus Torvalds
2008-01-27 8:08 ` Junio C Hamano
2008-01-26 7:53 ` reflog-expire: Avoid creating new files in a directory inside readdir(3) loop Junio C Hamano
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=7v7ihx2fdb.fsf@gitster.siamese.dyndns.org \
--to=gitster@pobox.com \
--cc=btrfs-devel@oss.oracle.com \
--cc=chris.mason@oracle.com \
--cc=git@vger.kernel.org \
--cc=paul@burly.ondioline.org \
--cc=torvalds@linux-foundation.org \
/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).