* Bug: segfault during git-prune
@ 2007-06-28 10:34 Andy Parkins
2007-06-28 10:52 ` Andy Parkins
2007-06-28 15:59 ` Linus Torvalds
0 siblings, 2 replies; 11+ messages in thread
From: Andy Parkins @ 2007-06-28 10:34 UTC (permalink / raw)
To: Git Mailing List
Hello,
I ran git-prune on a repository and got this:
$ git-prune
error: Object 228f8065b930120e35fc0c154c237487ab02d64a is a blob, not a commit
Segmentation fault (core dumped)
$ git-cat-file -t 228f8065b930120e35fc0c154c237487ab02d64a
commit
git-show of the object shows it looks okay. git-fsck just shows a load
of dangling objects - which isn't a surprise, that's why I was running
git-prune.
Here's the backtrace:
parse_commit_buffer (item=0x0, buffer=0x81124b8, size=421) at commit.c:292
#1 0x0808ad22 in parse_object_buffer (sha1=0x8111ac5 "\"\217\200e¹0\022\0165ü\f\025L#t\207«\002ÖJ", type=OBJ_COMMIT, size=421, buffer=0x81124b8,
eaten_p=0xafdc6c40) at object.c:152
#2 0x0808adb7 in parse_object (sha1=0x8111ac5 "\"\217\200e¹0\022\0165ü\f\025L#t\207«\002ÖJ") at object.c:187
#3 0x0808d1a2 in add_one_ref (path=0x8111aed "refs/remotes/libswscale-svn", sha1=0x8111ac5 "\"\217\200e¹0\022\0165ü\f\025L#t\207«\002ÖJ", flag=6,
cb_data=0xafdc6d40) at reachable.c:124
#4 0x0809133e in do_one_ref (base=<value optimized out>, fn=0x808d190 <add_one_ref>, trim=0, cb_data=0xafdc6d40, entry=0x8111ac0) at refs.c:478
#5 0x08092be4 in do_for_each_ref (base=0x80c8e76 "refs/", fn=0x808d190 <add_one_ref>, trim=0, cb_data=0xafdc6d40) at refs.c:545
#6 0x0808cff4 in mark_reachable_objects (revs=0xafdc6d40, mark_reflog=1) at reachable.c:188
#7 0x08071c90 in cmd_prune (argc=1, argv=0xafdc7074, prefix=0x0) at builtin-prune.c:93
#8 0x0804aa24 in handle_internal_command (argc=1, argv=0xafdc7074, envp=<value optimized out>) at git.c:348
#9 0x0804b4c9 in main (argc=1, argv=Cannot access memory at address 0xe
So, I think there are two faults: git-prune is deciding that the object is
a blob, when it's actually a commit; and git-prune's error handling is broken
in that case, because it's continuing with the NULL pointer returned by
check_commit() when obj->type != OBJ_COMMIT.
Andy
--
Dr Andy Parkins, M Eng (hons), MIET
andyparkins@gmail.com
^ permalink raw reply [flat|nested] 11+ messages in thread* Re: Bug: segfault during git-prune 2007-06-28 10:34 Bug: segfault during git-prune Andy Parkins @ 2007-06-28 10:52 ` Andy Parkins 2007-06-28 15:59 ` Linus Torvalds 1 sibling, 0 replies; 11+ messages in thread From: Andy Parkins @ 2007-06-28 10:52 UTC (permalink / raw) To: git On Thursday 2007 June 28, Andy Parkins wrote: > So, I think there are two faults: git-prune is deciding that the object is > a blob, when it's actually a commit; and git-prune's error handling is > broken in that case, because it's continuing with the NULL pointer returned > by check_commit() when obj->type != OBJ_COMMIT. I can't figure it out I'm afraid. I've done a bit of back tracing and found the block that's generating the error; object.c:150 } else if (type == OBJ_COMMIT) { struct commit *commit = lookup_commit(sha1); parse_commit_buffer(commit, buffer, size); if (!commit->buffer) { commit->buffer = buffer; eaten = 1; } obj = &commit->object; } Now, lookup_commit() is returning NULL because check_commit() is being called with a struct object whose type field is not OBJ_COMMIT. Which it presumably got from lookup_object(). gdb tells me the object returned by lookup_object() is {parsed = 0, used = 0, type = 3, flags = 0, sha1 = "\"\217\200e¹0\022\0165ü\f\025L#t\207«\002ÖJ"} Which seems to be the right hash, 228f8065b930120e35fc0c154c237487ab02d64a. What should I do next? I don't understand why lookup_object() is returning an object with type blob instead of with type commit, when git-cat-file says that same object is a commit. Andy -- Dr Andy Parkins, M Eng (hons), MIET andyparkins@gmail.com ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Bug: segfault during git-prune 2007-06-28 10:34 Bug: segfault during git-prune Andy Parkins 2007-06-28 10:52 ` Andy Parkins @ 2007-06-28 15:59 ` Linus Torvalds 2007-06-28 16:09 ` Linus Torvalds 2007-06-28 22:21 ` Andy Parkins 1 sibling, 2 replies; 11+ messages in thread From: Linus Torvalds @ 2007-06-28 15:59 UTC (permalink / raw) To: Andy Parkins; +Cc: Git Mailing List On Thu, 28 Jun 2007, Andy Parkins wrote: > > I ran git-prune on a repository and got this: > > $ git-prune > error: Object 228f8065b930120e35fc0c154c237487ab02d64a is a blob, not a commit > Segmentation fault (core dumped) Do you have subprojects in that git repo? What happens is that all git object handling *refuses* (correctly) to touch an object of the wrong type. If it's been marked as a commit at some point, it had better be looked up as a commit the *next* time we see that same object too. And every normal git object traversal will specify in advance what kind of object it expects (except for the initial refs lookups, that don't know, and use a totally different interface for "give me any kind of object, and figure it out"). So the error in this case is that we decided it was a commit once, and a blob once, and git is very unhappy. And the only case I know of that does that is using an old git binary, or a unconverted git code-path program, on a repository with subprojects when the code-path doesn't understand that a tree can contain pointers to commits. So what happens is that something traverses a tree object, looks at each entry, sees that it's not a tree, and tries to look it up as a blob. But subprojects are commits, not blobs, and then when you look at the object more closely, you get the above kind of object type confusion. And I did that very early on, and wanted to make sure that git objects were "strongly typed", and you get a big fat error if you try to use the wrong type. > $ git-cat-file -t 228f8065b930120e35fc0c154c237487ab02d64a > commit > > git-show of the object shows it looks okay. git-fsck just shows a load > of dangling objects - which isn't a surprise, that's why I was running > git-prune. Yeah, git-fsck knows about subprojects. I bet git-prune just doesn't. And indeed.. Here's a patch for it, but the fact is, you really should *not* prune that repository, because you'll prune away all the subproject data, which you seem to have in the same repo! (General rule: never *ever* prune a shared object repository!) Linus --- reachable.c | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-) diff --git a/reachable.c b/reachable.c index ff3dd34..17ff929 100644 --- a/reachable.c +++ b/reachable.c @@ -21,6 +21,15 @@ static void process_blob(struct blob *blob, /* Nothing to do, really .. The blob lookup was the important part */ } +static void process_gitlink(const unsigned char *sha1, + struct object_array *p, + struct name_path *path, + const char *name) +{ + /* I don't think we want to recurse into this, really. */ +} + + static void process_tree(struct tree *tree, struct object_array *p, struct name_path *path, @@ -47,6 +56,8 @@ static void process_tree(struct tree *tree, while (tree_entry(&desc, &entry)) { if (S_ISDIR(entry.mode)) process_tree(lookup_tree(entry.sha1), p, &me, entry.path); + else if (S_ISGITLINK(entry.mode)) + process_gitlink(entry.sha1, p, &me, entry.path); else process_blob(lookup_blob(entry.sha1), p, &me, entry.path); } ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: Bug: segfault during git-prune 2007-06-28 15:59 ` Linus Torvalds @ 2007-06-28 16:09 ` Linus Torvalds 2007-06-28 22:21 ` Andy Parkins 1 sibling, 0 replies; 11+ messages in thread From: Linus Torvalds @ 2007-06-28 16:09 UTC (permalink / raw) To: Andy Parkins; +Cc: Git Mailing List On Thu, 28 Jun 2007, Linus Torvalds wrote: > > Yeah, git-fsck knows about subprojects. I bet git-prune just doesn't. > > And indeed.. Here's a patch for it, but the fact is, you really should > *not* prune that repository, because you'll prune away all the subproject > data, which you seem to have in the same repo! > > (General rule: never *ever* prune a shared object repository!) Btw, we could make the "reachable" code say that *if* you have the commit of a subproject in your current object directory, it will follow that commit recursively, and thus sharing an object store at the superproject level is "ok" as far as "git prune" is concerned. We don't currently even have that kind of function, though. Calling "parse_commit()" will complain very loudly if the commit doesn't exist, but it's actually perfectly fine to not exist if it's in a separate subproject. So if you actually want to use subprojects *and* prune them, *and* you want to keep all the subproject objects in the same big object database, you'd have to add some commit object "parse-if-you-can-find-it" thing, and use that. It shouldn't be fundamentally hard, but it's _not_ what my patch did. My patch just says: "subprojects are separate projects, and we don't do reachability from superproject to subproject". Linus ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Bug: segfault during git-prune 2007-06-28 15:59 ` Linus Torvalds 2007-06-28 16:09 ` Linus Torvalds @ 2007-06-28 22:21 ` Andy Parkins 2007-06-28 22:31 ` Linus Torvalds 1 sibling, 1 reply; 11+ messages in thread From: Andy Parkins @ 2007-06-28 22:21 UTC (permalink / raw) To: git; +Cc: Linus Torvalds On Thursday 2007, June 28, Linus Torvalds wrote: > On Thu, 28 Jun 2007, Andy Parkins wrote: > > I ran git-prune on a repository and got this: > > > > $ git-prune > > error: Object 228f8065b930120e35fc0c154c237487ab02d64a is a blob, not a > > commit Segmentation fault (core dumped) > > Do you have subprojects in that git repo? Yes. I'm also doing something that is possibly very naughty; and I'm sure you're going to say "what on earth do you expect when you've done _that_" The subproject is the same repository... It's a git conversion of the ffmpeg history; ffmpeg uses svn:externals for the libswscale directory; so I set that as an independent branch in the same repository, fetched with git-svn as well. Then I cloned the repository into a subdirectory of itself. $ git clone -n . libswscale Then I went into libswscale/.git/ and ln -s objects, refs, info, and logs. In fact the only thing that isn't shared is HEAD. Then I changed into libswscale and checked out the libswscale branch. Back in the ffmpeg repository I git-add the libswscale directory and everything seems to be working wonderfully. > And the only case I know of that does that is using an old git binary, or > a unconverted git code-path program, on a repository with subprojects > when the code-path doesn't understand that a tree can contain pointers to > commits. Sounds like the last one to me. I tend to be only a few days behind upstream git. > Yeah, git-fsck knows about subprojects. I bet git-prune just doesn't. > > And indeed.. Here's a patch for it, but the fact is, you really should > *not* prune that repository, because you'll prune away all the subproject > data, which you seem to have in the same repo! Correct; you did well figuring that out from the meagre information I gave. I had hoped that git-prune wouldn't be a risk because I have: * -- * -- * -- * -- * (ffmpeg-svn) * -- * -- * -- * (libswscale-svn) Then I forked master from ffmpeg-svn and added the libswscale-svn branch as a submodule as described above. Now, because the submodule always refers to commits that are ancestors of libswscale-svn, they'll never be seen as dangling and pruned? > (General rule: never *ever* prune a shared object repository!) Even when I'm sure that every object of interest is behind a head ref? > --- > reachable.c | 11 +++++++++++ > 1 files changed, 11 insertions(+), 0 deletions(-) The repository in question is on my work computer, so I won't be able to try this patch until Monday. I'll report back then. Andy -- Dr Andy Parkins, M Eng (hons), MIET andyparkins@gmail.com ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Bug: segfault during git-prune 2007-06-28 22:21 ` Andy Parkins @ 2007-06-28 22:31 ` Linus Torvalds 2007-06-29 12:39 ` Andy Parkins 2007-07-02 10:00 ` Andy Parkins 0 siblings, 2 replies; 11+ messages in thread From: Linus Torvalds @ 2007-06-28 22:31 UTC (permalink / raw) To: Andy Parkins; +Cc: git On Thu, 28 Jun 2007, Andy Parkins wrote: > > I had hoped that git-prune wouldn't be a risk because I have: > > * -- * -- * -- * -- * (ffmpeg-svn) > > * -- * -- * -- * (libswscale-svn) Ok. If all subproject branches are also visible in the superproject as refs, then "git prune" should work fine, and you can apply my patch and it should just work very naturally: the reachability analysis will find the subprojects not through the superproject link, but simply through the direct refs to the subproject. > > (General rule: never *ever* prune a shared object repository!) > > Even when I'm sure that every object of interest is behind a head ref? So yes, in that case, you're ok. This is not unlike just having two different repositories sharing the same object directory: as long as the two different repositories both have the appropriate refs, pruning is fine. In other words, you can see them as just independent branches in the same repo. And in fact, subprojects are obviously very much *designed* to work that way: a subproject is basically a "different repository". So the basic rule is that if it would work with totally independent repos, it works with subprojects. [ That's all aside from the kind of bug that you found, where some code that parses the tree structures hadn't been updated for subprojects, of course ] Anyway, if that patch works for you, I'd suggest you just pass it on to Junio (and feel free to add my "Signed-off-by:" on it - but conditional on you having actually tested it). Linus ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Bug: segfault during git-prune 2007-06-28 22:31 ` Linus Torvalds @ 2007-06-29 12:39 ` Andy Parkins 2007-07-02 10:00 ` Andy Parkins 1 sibling, 0 replies; 11+ messages in thread From: Andy Parkins @ 2007-06-29 12:39 UTC (permalink / raw) To: git; +Cc: Linus Torvalds On Thursday 2007, June 28, Linus Torvalds wrote: > On Thu, 28 Jun 2007, Andy Parkins wrote: > > I had hoped that git-prune wouldn't be a risk because I have: > > > > * -- * -- * -- * -- * (ffmpeg-svn) > > > > * -- * -- * -- * (libswscale-svn) > > Ok. If all subproject branches are also visible in the superproject as > refs, then "git prune" should work fine, and you can apply my patch and > it should just work very naturally: the reachability analysis will find > the subprojects not through the superproject link, but simply through the > direct refs to the subproject. Excellent. That's what I'd hoped. I'm actually really impressed that git is robust enough that my symbolic linking of all the .git subdirectories works so well. It's actually turned out to be a really natural way of using a repository for strongly connected submodules. > This is not unlike just having two different repositories sharing the > same object directory: as long as the two different repositories both > have the appropriate refs, pruning is fine. In other words, you can see > them as just independent branches in the same repo. Absolutely. With my poor-mans submodule script that I was using before git had it's own submodule support, I had the script make a refs/superrefs directory, and every time I committed to the supermodule the script would write $subhash to $submodule/.git/refs/heads/superrefs/$subhash. The it was safe to git-prune the submodules as well. > And in fact, subprojects are obviously very much *designed* to work that > way: a subproject is basically a "different repository". So the basic > rule is that if it would work with totally independent repos, it works > with subprojects. I certainly agree, it's an extremely elegant way of working. I can't imagine that any other VCS is capable of this sort of manipulation. > Anyway, if that patch works for you, I'd suggest you just pass it on to > Junio (and feel free to add my "Signed-off-by:" on it - but conditional > on you having actually tested it). Will do. I'll certainly test it, and am happy to forward it on if that test is successful. Andy -- Dr Andy Parkins, M Eng (hons), MIET andyparkins@gmail.com ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Bug: segfault during git-prune 2007-06-28 22:31 ` Linus Torvalds 2007-06-29 12:39 ` Andy Parkins @ 2007-07-02 10:00 ` Andy Parkins 2007-07-02 11:45 ` Linus Torvalds 1 sibling, 1 reply; 11+ messages in thread From: Andy Parkins @ 2007-07-02 10:00 UTC (permalink / raw) To: git; +Cc: Linus Torvalds On Thursday 2007 June 28, Linus Torvalds wrote: > Anyway, if that patch works for you, I'd suggest you just pass it on to > Junio (and feel free to add my "Signed-off-by:" on it - but conditional on > you having actually tested it). Okay; tested with this patch, but no change in behaviour. $ git-prune error: Object 228f8065b930120e35fc0c154c237487ab02d64a is a blob, not a commit Segmentation fault (core dumped) Looking at your patch: is it possible that S_ISDIR() is true for gitlinks as well as S_ISGITLINK()? S_ISDIR() is from unistd.h; and is presumably something like: S_ISDIR() { return mode & S_IFDIR; } Given the GITLINK mode is S_IFLINK | S_IFDIR; then S_ISDIR() will be true and if (S_ISDIR(entry.mode)) process_tree(lookup_tree(entry.sha1), p, &me, entry.path); + else if (S_ISGITLINK(entry.mode)) + process_gitlink(entry.sha1, p, &me, entry.path); else process_blob(lookup_blob(entry.sha1), p, &me, entry.path); will never get to the process_gitlink() call. However; I tried fixing this by swapping the order of the tests and the problem hasn't gone away. I'm not sure that it's even getting as far as process_tree(). (incidentally I think the same fault exists in list-objects.c's process_tree). Given the hints you gave me in your previous reply, I've looked at the backtrace again and understood more what's happening. - mark_reachable_objects() calls add_cache_refs() - which uses lookup_blob() to mark every hash in the index as an OBJ_BLOB type of hash; including the GITLINK entries. - mark_reachable_objects() calls add_one_ref() for_each_ref(), which finds a ref pointing to one of the GITLINK entries, and via parse_object_buffer(), tries to lookup_commit(), which finds the GITLINKed object using lookup_object() only it is not an OBJ_COMMIT, it's an OBJ_BLOB - all hell breaks loose I think the fault is in add_cache_refs() which assumes that every hash in the index is an OBJ_BLOB. I think that add_cache_refs() shouldn't be calling lookup_blob() for S_ISGITLINK() index entries. Therefore I think this patch is the right one; what do you reckon? diff --git a/reachable.c b/reachable.c index ff3dd34..ffc8d0a 100644 --- a/reachable.c +++ b/reachable.c @@ -21,6 +21,15 @@ static void process_blob(struct blob *blob, /* Nothing to do, really .. The blob lookup was the important part */ } +static void process_gitlink(const unsigned char *sha1, + struct object_array *p, + struct name_path *path, + const char *name) +{ + /* I don't think we want to recurse into this, really. */ +} + + static void process_tree(struct tree *tree, struct object_array *p, struct name_path *path, @@ -45,7 +54,9 @@ static void process_tree(struct tree *tree, init_tree_desc(&desc, tree->buffer, tree->size); while (tree_entry(&desc, &entry)) { - if (S_ISDIR(entry.mode)) + if (S_ISGITLINK(entry.mode)) + process_gitlink(entry.sha1, p, &me, entry.path); + else if (S_ISDIR(entry.mode)) process_tree(lookup_tree(entry.sha1), p, &me, entry.path); else process_blob(lookup_blob(entry.sha1), p, &me, entry.path); @@ -159,6 +170,16 @@ static void add_cache_refs(struct rev_info *revs) read_cache(); for (i = 0; i < active_nr; i++) { + /* + * The index can contain blobs and GITLINKs, GITLINKs are hashes + * that don't actually point to objects in the repository, it's + * almost guaranteed that they are NOT blobs, so we don't call + * lookup_blob() on them, to avoid populating the hash table + * with invalid information + */ + if (S_ISGITLINK(ntohl(active_cache[i]->ce_mode))) + continue; + lookup_blob(active_cache[i]->sha1); /* * We could add the blobs to the pending list, but quite If you think I'm on the right lines with this, I'll make better patches for Junio. Andy -- Dr Andy Parkins, M Eng (hons), MIET andyparkins@gmail.com ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: Bug: segfault during git-prune 2007-07-02 10:00 ` Andy Parkins @ 2007-07-02 11:45 ` Linus Torvalds 2007-07-02 13:25 ` Andy Parkins 0 siblings, 1 reply; 11+ messages in thread From: Linus Torvalds @ 2007-07-02 11:45 UTC (permalink / raw) To: Andy Parkins; +Cc: git On Mon, 2 Jul 2007, Andy Parkins wrote: > > Looking at your patch: is it possible that S_ISDIR() is true for gitlinks as > well as S_ISGITLINK()? S_ISDIR() is from unistd.h; and is presumably > something like: > > S_ISDIR() { return mode & S_IFDIR; } No, it's going to be something like "(mode & S_IFMASK) == S_IFDIR", so that part should be ok. BUT: > Given the hints you gave me in your previous reply, I've looked at the > backtrace again and understood more what's happening. > > - mark_reachable_objects() calls add_cache_refs() > - which uses lookup_blob() to mark every hash in the index as an OBJ_BLOB > type of hash; including the GITLINK entries. Yes, this sounds like the real issue (or the remaining issue, at least). > I think the fault is in add_cache_refs() which assumes that every hash in the > index is an OBJ_BLOB. I think that add_cache_refs() shouldn't be calling > lookup_blob() for S_ISGITLINK() index entries. Therefore I think this patch > is the right one; what do you reckon? Looks good to me. > + /* > + * The index can contain blobs and GITLINKs, GITLINKs are hashes > + * that don't actually point to objects in the repository, it's > + * almost guaranteed that they are NOT blobs, so we don't call > + * lookup_blob() on them, to avoid populating the hash table > + * with invalid information > + */ > + if (S_ISGITLINK(ntohl(active_cache[i]->ce_mode))) > + continue; Just for clarity, I'd use "process_gitlink()" here (and it would probably be a good idea to use process_blob() on the blob we look up too), and the proper tab indentation, but yes, I think you're otherwise exactly right. Linus ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Bug: segfault during git-prune 2007-07-02 11:45 ` Linus Torvalds @ 2007-07-02 13:25 ` Andy Parkins 2007-07-02 21:01 ` Linus Torvalds 0 siblings, 1 reply; 11+ messages in thread From: Andy Parkins @ 2007-07-02 13:25 UTC (permalink / raw) To: git; +Cc: Linus Torvalds On Monday 2007 July 02, Linus Torvalds wrote: > Just for clarity, I'd use "process_gitlink()" here (and it would probably > be a good idea to use process_blob() on the blob we look up too), and the > proper tab indentation, but yes, I think you're otherwise exactly right. I've pushed it out as-is as a bug fix patch now; and will happilly make the above change on top. However, I've not understood what all the parameters are for in the process_XXXX() functions: static void process_gitlink(const unsigned char *sha1, struct object_array *p, struct name_path *path, const char *name) the sha1 and name I can read out of the cache_entry structure, but I'm not sure about the object_array and name_path structures in the context of add_cache_refs(). Andy -- Dr Andy Parkins, M Eng (hons), MIET andyparkins@gmail.com ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Bug: segfault during git-prune 2007-07-02 13:25 ` Andy Parkins @ 2007-07-02 21:01 ` Linus Torvalds 0 siblings, 0 replies; 11+ messages in thread From: Linus Torvalds @ 2007-07-02 21:01 UTC (permalink / raw) To: Andy Parkins; +Cc: git On Mon, 2 Jul 2007, Andy Parkins wrote: > > I've pushed it out as-is as a bug fix patch now; and will happilly make the > above change on top. However, I've not understood what all the parameters > are for in the process_XXXX() functions: Yeah, never mind, your patch is fine. The process_xxx() parameters are really only there so that process_tree() can generate the proper path and names, and they are passed to process_blob/gitlink() just to make all the processing look the same. But it's nonsensical to do for the case of the index (although you could pass a NULL path and the name from the index), and we haven't created the object array there, so just ignore my suggestion - your original patch is fine. Linus ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2007-07-02 21:01 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2007-06-28 10:34 Bug: segfault during git-prune Andy Parkins 2007-06-28 10:52 ` Andy Parkins 2007-06-28 15:59 ` Linus Torvalds 2007-06-28 16:09 ` Linus Torvalds 2007-06-28 22:21 ` Andy Parkins 2007-06-28 22:31 ` Linus Torvalds 2007-06-29 12:39 ` Andy Parkins 2007-07-02 10:00 ` Andy Parkins 2007-07-02 11:45 ` Linus Torvalds 2007-07-02 13:25 ` Andy Parkins 2007-07-02 21:01 ` Linus Torvalds
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).