Git development
 help / color / mirror / Atom feed
* tree corrupted on disk quota full
@ 2007-01-11 12:57 Michael S. Tsirkin
  2007-01-11 13:40 ` Andreas Ericsson
  2007-01-11 18:31 ` Linus Torvalds
  0 siblings, 2 replies; 24+ messages in thread
From: Michael S. Tsirkin @ 2007-01-11 12:57 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

I hit a quota limit on a disk my tree was on, but did not notice.
Doing git pull on a tree seems to have corrupted it.
Now I have:

$ git-fsck-objects
error: 4d4d30be967d3284cbf59afd4fba6ab536e295f5: object not found
error: c03590b581d51d5fa43adbef9415e935d0229412: object not found
missing tree 10147d79b2418168d9433067b6439971bd4f1261
broken link from  commit 322a6c93ad86d2a151dd97a4c6b0e014a4893437
              to    tree 10147d79b2418168d9433067b6439971bd4f1261
dangling commit 322a6c93ad86d2a151dd97a4c6b0e014a4893437

The tree can not be pulled into, or from.

-- 
MST

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: tree corrupted on disk quota full
  2007-01-11 12:57 tree corrupted on disk quota full Michael S. Tsirkin
@ 2007-01-11 13:40 ` Andreas Ericsson
  2007-01-11 13:43   ` Andy Whitcroft
  2007-01-11 13:59   ` Michael S. Tsirkin
  2007-01-11 18:31 ` Linus Torvalds
  1 sibling, 2 replies; 24+ messages in thread
From: Andreas Ericsson @ 2007-01-11 13:40 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: Junio C Hamano, git

Michael S. Tsirkin wrote:
> I hit a quota limit on a disk my tree was on, but did not notice.
> Doing git pull on a tree seems to have corrupted it.
> Now I have:
> 
> $ git-fsck-objects
> error: 4d4d30be967d3284cbf59afd4fba6ab536e295f5: object not found
> error: c03590b581d51d5fa43adbef9415e935d0229412: object not found
> missing tree 10147d79b2418168d9433067b6439971bd4f1261
> broken link from  commit 322a6c93ad86d2a151dd97a4c6b0e014a4893437
>               to    tree 10147d79b2418168d9433067b6439971bd4f1261
> dangling commit 322a6c93ad86d2a151dd97a4c6b0e014a4893437
> 
> The tree can not be pulled into, or from.
> 

Can you do a "git rev-list" on the commit pointing to this tree? If so, 
you should be able to do "git reset HEAD~1" and re-do the fetch.

Otoh, this is curious. Aren't tree- and blob-objects written to disk 
before the commit object pointing to them? If not, how can we claim to 
support atomic commits? I imagined things were written in this order

	blob -> tree -> commit

seeing as the dependency chain goes the other way.

"git repair" could easily be cooked up by finding the first complete 
commit and resetting current HEAD and all branches pointing to it to 
that first complete commit. Issuing a fresh "fetch" after that should 
automagically fix everything for you.

-- 
Andreas Ericsson                   andreas.ericsson@op5.se
OP5 AB                             www.op5.se
Tel: +46 8-230225                  Fax: +46 8-230231

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: tree corrupted on disk quota full
  2007-01-11 13:40 ` Andreas Ericsson
@ 2007-01-11 13:43   ` Andy Whitcroft
  2007-01-11 13:59   ` Michael S. Tsirkin
  1 sibling, 0 replies; 24+ messages in thread
From: Andy Whitcroft @ 2007-01-11 13:43 UTC (permalink / raw)
  To: Andreas Ericsson; +Cc: Michael S. Tsirkin, Junio C Hamano, git

Andreas Ericsson wrote:
> Michael S. Tsirkin wrote:
>> I hit a quota limit on a disk my tree was on, but did not notice.
>> Doing git pull on a tree seems to have corrupted it.
>> Now I have:
>>
>> $ git-fsck-objects
>> error: 4d4d30be967d3284cbf59afd4fba6ab536e295f5: object not found
>> error: c03590b581d51d5fa43adbef9415e935d0229412: object not found
>> missing tree 10147d79b2418168d9433067b6439971bd4f1261
>> broken link from  commit 322a6c93ad86d2a151dd97a4c6b0e014a4893437
>>               to    tree 10147d79b2418168d9433067b6439971bd4f1261
>> dangling commit 322a6c93ad86d2a151dd97a4c6b0e014a4893437
>>
>> The tree can not be pulled into, or from.
>>
> 
> Can you do a "git rev-list" on the commit pointing to this tree? If so,
> you should be able to do "git reset HEAD~1" and re-do the fetch.
> 
> Otoh, this is curious. Aren't tree- and blob-objects written to disk
> before the commit object pointing to them? If not, how can we claim to
> support atomic commits? I imagined things were written in this order
> 
>     blob -> tree -> commit
> 
> seeing as the dependency chain goes the other way.
> 
> "git repair" could easily be cooked up by finding the first complete
> commit and resetting current HEAD and all branches pointing to it to
> that first complete commit. Issuing a fresh "fetch" after that should
> automagically fix everything for you.

Well we do have some dubious code which can fail in the face of short
writes when the disk is full.  Those I believe are now plugged following
my short i/o series which is in master as far as I know.

I wonder if we can cook up a test with a loop back mount on a tiny ramfs
that will fail in this way.

-apw

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: tree corrupted on disk quota full
  2007-01-11 13:40 ` Andreas Ericsson
  2007-01-11 13:43   ` Andy Whitcroft
@ 2007-01-11 13:59   ` Michael S. Tsirkin
  2007-01-11 14:28     ` Andreas Ericsson
  1 sibling, 1 reply; 24+ messages in thread
From: Michael S. Tsirkin @ 2007-01-11 13:59 UTC (permalink / raw)
  To: Andreas Ericsson; +Cc: Junio C Hamano, git

> > I hit a quota limit on a disk my tree was on, but did not notice.
> > Doing git pull on a tree seems to have corrupted it.
> > Now I have:
> > 
> > $ git-fsck-objects
> > error: 4d4d30be967d3284cbf59afd4fba6ab536e295f5: object not found
> > error: c03590b581d51d5fa43adbef9415e935d0229412: object not found
> > missing tree 10147d79b2418168d9433067b6439971bd4f1261
> > broken link from  commit 322a6c93ad86d2a151dd97a4c6b0e014a4893437
> >               to    tree 10147d79b2418168d9433067b6439971bd4f1261
> > dangling commit 322a6c93ad86d2a151dd97a4c6b0e014a4893437
> > 
> > The tree can not be pulled into, or from.
> > 
> 
> Can you do a "git rev-list" on the commit pointing to this tree?

On which commit?

> If so, you should be able to do "git reset HEAD~1" and re-do the fetch.

$ git reset --hard HEAD~1
HEAD is now at 2d41bf8... Remove svn keywords
$ git-fsck-objects
error: 4d4d30be967d3284cbf59afd4fba6ab536e295f5: object not found
error: c03590b581d51d5fa43adbef9415e935d0229412: object not found
missing tree 10147d79b2418168d9433067b6439971bd4f1261
broken link from  commit 322a6c93ad86d2a151dd97a4c6b0e014a4893437
              to    tree 10147d79b2418168d9433067b6439971bd4f1261
dangling commit 322a6c93ad86d2a151dd97a4c6b0e014a4893437

-- 
MST

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: tree corrupted on disk quota full
  2007-01-11 13:59   ` Michael S. Tsirkin
@ 2007-01-11 14:28     ` Andreas Ericsson
  0 siblings, 0 replies; 24+ messages in thread
From: Andreas Ericsson @ 2007-01-11 14:28 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: Junio C Hamano, git

Michael S. Tsirkin wrote:
>>> I hit a quota limit on a disk my tree was on, but did not notice.
>>> Doing git pull on a tree seems to have corrupted it.
>>> Now I have:
>>>
>>> $ git-fsck-objects
>>> error: 4d4d30be967d3284cbf59afd4fba6ab536e295f5: object not found
>>> error: c03590b581d51d5fa43adbef9415e935d0229412: object not found
>>> missing tree 10147d79b2418168d9433067b6439971bd4f1261
>>> broken link from  commit 322a6c93ad86d2a151dd97a4c6b0e014a4893437
>>>               to    tree 10147d79b2418168d9433067b6439971bd4f1261
>>> dangling commit 322a6c93ad86d2a151dd97a4c6b0e014a4893437
>>>
>>> The tree can not be pulled into, or from.
>>>
>> Can you do a "git rev-list" on the commit pointing to this tree?
> 
> On which commit?
> 

322a6c93ad86d2a151dd97a4c6b0e014a4893437

>> If so, you should be able to do "git reset HEAD~1" and re-do the fetch.
> 
> $ git reset --hard HEAD~1
> HEAD is now at 2d41bf8... Remove svn keywords
> $ git-fsck-objects
> error: 4d4d30be967d3284cbf59afd4fba6ab536e295f5: object not found
> error: c03590b581d51d5fa43adbef9415e935d0229412: object not found
> missing tree 10147d79b2418168d9433067b6439971bd4f1261
> broken link from  commit 322a6c93ad86d2a151dd97a4c6b0e014a4893437
>               to    tree 10147d79b2418168d9433067b6439971bd4f1261
> dangling commit 322a6c93ad86d2a151dd97a4c6b0e014a4893437
> 

Humm... Seems there are other problems here.

Try

$ git reset --hard 322a6c93ad86d2a151dd97a4c6b0e014a4893437~1
$ git fsck-objects HEAD

If this tells you your repo is clean, you should be able to redo 
whatever fetches you did on top of that to get a working repository 
again. If you have objects that got half-written due to end-of-disk 
errors, you'd have to do "git prune" after resetting.

-- 
Andreas Ericsson                   andreas.ericsson@op5.se
OP5 AB                             www.op5.se
Tel: +46 8-230225                  Fax: +46 8-230231

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: tree corrupted on disk quota full
  2007-01-11 12:57 tree corrupted on disk quota full Michael S. Tsirkin
  2007-01-11 13:40 ` Andreas Ericsson
@ 2007-01-11 18:31 ` Linus Torvalds
  2007-01-11 19:19   ` Linus Torvalds
  2007-01-11 21:11   ` Michael S. Tsirkin
  1 sibling, 2 replies; 24+ messages in thread
From: Linus Torvalds @ 2007-01-11 18:31 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: Junio C Hamano, git



On Thu, 11 Jan 2007, Michael S. Tsirkin wrote:
>
> I hit a quota limit on a disk my tree was on, but did not notice.
> Doing git pull on a tree seems to have corrupted it.
> Now I have:
> 
> $ git-fsck-objects
> error: 4d4d30be967d3284cbf59afd4fba6ab536e295f5: object not found
> error: c03590b581d51d5fa43adbef9415e935d0229412: object not found
> missing tree 10147d79b2418168d9433067b6439971bd4f1261
> broken link from  commit 322a6c93ad86d2a151dd97a4c6b0e014a4893437
>               to    tree 10147d79b2418168d9433067b6439971bd4f1261
> dangling commit 322a6c93ad86d2a151dd97a4c6b0e014a4893437
> 
> The tree can not be pulled into, or from.

That's nasty, but something as simple a "git reset --hard ORIG_HEAD" 
should fix it (of course, if the disk-full happened earlier, or you've 
done some other reset or something else that over-write your ORIG_HEAD, 
you'd need to find the most recent commit that wasn't broken).

The good news is that there's no way your old data got corrupted. You just 
need to _find_ it (and normally ORIG_HEAD points to it, so it's trivial to 
find).

The suggestion to use "HEAD~1" is *not* a good one, simply because the 
pull (if it was a fast-forward) will not have HEAD~1 as your previous 
head: it will depend on how many commits you pulled. If you had reflog 
enabled, a "HEAD@{1}" might have worked (or "HEAD@{2}" as you already did 
the "git reset").

That said, clearly something didn't check the error return of a write() 
call. Some of that got fixed up recently, so it might even be fixed in 
current git already.

The most likely case (for a pull) is "git-unpack-objects", I guess.

		Linus

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: tree corrupted on disk quota full
  2007-01-11 18:31 ` Linus Torvalds
@ 2007-01-11 19:19   ` Linus Torvalds
  2007-01-11 20:03     ` Linus Torvalds
                       ` (2 more replies)
  2007-01-11 21:11   ` Michael S. Tsirkin
  1 sibling, 3 replies; 24+ messages in thread
From: Linus Torvalds @ 2007-01-11 19:19 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: Junio C Hamano, git



On Thu, 11 Jan 2007, Linus Torvalds wrote:
> 
> That said, clearly something didn't check the error return of a write() 
> call. Some of that got fixed up recently, so it might even be fixed in 
> current git already.

I'm not convinced.

The "write_in_full()" logic is supposed to help people avoid problems, but 
it *still* returns a success for a partial write.

Example of extreme breakage:

	static int write_buffer(int fd, const void *buf, size_t len)
	{
	        ssize_t size;
	
	        size = write_in_full(fd, buf, len);
	        if (!size)
	                return error("file write: disk full");
	        if (size < 0)
	                return error("file write error (%s)", strerror(errno));
	        return 0;
	}

which is TOTAL GARBAGE, because the disk-full event might have happened in 
the middle of the write, so "write_in_full()" might have returned 4096, 
for example, even though the buffer length was much bigger.

I personally think write_in_full() is totally mis-designed. If you are 
ready to handle partial writes, you should use "xwrite()". If you're not 
ready to handle partial writes, you should either use "write_or_die()", 
_or_ you should expect a partial write to at least return an error code 
(which is how "write_buffer()" works).

But that's not how write_in_full() actually works. Write-in-full does not 
return an error for a partial write, it returns the partial size.

Which is idiotic. It makes the function pointless. Just use xwrite() for 
that.

I would suggest perhaps a patch like this..  And then you _really_ can 
just do

	if (write_in_full(fd, buf, len) < 0)
		die("Not going to work: %s", strerror(errno));

and be happy.

		Linus

---
diff --git a/write_or_die.c b/write_or_die.c
index a119e1d..f95299a 100644
--- a/write_or_die.c
+++ b/write_or_die.c
@@ -37,15 +37,14 @@ int write_in_full(int fd, const void *buf, size_t count)
 {
 	const char *p = buf;
 	ssize_t total = 0;
-	ssize_t written = 0;
 
 	while (count > 0) {
-		written = xwrite(fd, p, count);
-		if (written <= 0) {
-			if (total)
-				return total;
-			else
-				return written;
+		size_t written = xwrite(fd, p, count);
+		if (written < 0)
+			return -1;
+		if (!written) {
+			errno = ENOSPC;
+			return -1
 		}
 		count -= written;
 		p += written;

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* Re: tree corrupted on disk quota full
  2007-01-11 19:19   ` Linus Torvalds
@ 2007-01-11 20:03     ` Linus Torvalds
  2007-01-11 21:02     ` Junio C Hamano
  2007-01-11 21:17     ` Andy Whitcroft
  2 siblings, 0 replies; 24+ messages in thread
From: Linus Torvalds @ 2007-01-11 20:03 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: Junio C Hamano, git



On Thu, 11 Jan 2007, Linus Torvalds wrote:
> 
> I would suggest perhaps a patch like this..

Except you need to add a semicolon after the return:

> +		if (!written) {
> +			errno = ENOSPC;
> +			return -1

otherwise it looks fine. But I obviously didn't even compile-test the 
patch I sent out, so caveat emptor.

		Linus

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: tree corrupted on disk quota full
  2007-01-11 19:19   ` Linus Torvalds
  2007-01-11 20:03     ` Linus Torvalds
@ 2007-01-11 21:02     ` Junio C Hamano
  2007-01-11 21:17     ` Andy Whitcroft
  2 siblings, 0 replies; 24+ messages in thread
From: Junio C Hamano @ 2007-01-11 21:02 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Michael S. Tsirkin, git

Linus Torvalds <torvalds@osdl.org> writes:

> I personally think write_in_full() is totally mis-designed. If you are 
> ready to handle partial writes, you should use "xwrite()". If you're not 
> ready to handle partial writes, you should either use "write_or_die()", 
> _or_ you should expect a partial write to at least return an error code 
> (which is how "write_buffer()" works).

> But that's not how write_in_full() actually works. Write-in-full does not 
> return an error for a partial write, it returns the partial size.
>
> Which is idiotic. It makes the function pointless. Just use xwrite() for 
> that.

I agree 100% with the above reasoning.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: tree corrupted on disk quota full
  2007-01-11 18:31 ` Linus Torvalds
  2007-01-11 19:19   ` Linus Torvalds
@ 2007-01-11 21:11   ` Michael S. Tsirkin
  2007-01-11 21:50     ` Linus Torvalds
  1 sibling, 1 reply; 24+ messages in thread
From: Michael S. Tsirkin @ 2007-01-11 21:11 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Junio C Hamano, git

> >
> > I hit a quota limit on a disk my tree was on, but did not notice.
> > Doing git pull on a tree seems to have corrupted it.
> > Now I have:
> > 
> > $ git-fsck-objects
> > error: 4d4d30be967d3284cbf59afd4fba6ab536e295f5: object not found
> > error: c03590b581d51d5fa43adbef9415e935d0229412: object not found
> > missing tree 10147d79b2418168d9433067b6439971bd4f1261
> > broken link from  commit 322a6c93ad86d2a151dd97a4c6b0e014a4893437
> >               to    tree 10147d79b2418168d9433067b6439971bd4f1261
> > dangling commit 322a6c93ad86d2a151dd97a4c6b0e014a4893437
> > 
> > The tree can not be pulled into, or from.
> 
> That's nasty, but something as simple a "git reset --hard ORIG_HEAD" 
> should fix it (of course, if the disk-full happened earlier, or you've 
> done some other reset or something else that over-write your ORIG_HEAD, 
> you'd need to find the most recent commit that wasn't broken).
> 
> The good news is that there's no way your old data got corrupted. You just 
> need to _find_ it (and normally ORIG_HEAD points to it, so it's trivial to 
> find).

I did lots of resets and they did not seems to help.

Then, on a hunch, I just did git prune and
it cleaned the tree so I can pull/push fine.

How come?

mst@mst-lt:~/tmp/libmthca_bad$ git --version
git version 1.5.0.rc0.g244a7
mst@mst-lt:~/tmp/libmthca_bad$ git pull ~/scm/libmthca/
remote: Generating pack...
remote: Done counting 18 objects.
Result has 11 objects.
remote: Deltifying 11 objects.
remote:  100% (11/11) done
remote: Total 11 (delta 8), reused 1 (delta 1)
Unpacking 11 objects
error: failed to read delta-pack base object 4d4d30be967d3284cbf59afd4fba6ab536e295f5
fatal: unpack-objects died with error code 1
Fetch failure: /home/mst/scm/libmthca/
mst@mst-lt:~/tmp/libmthca_bad$ git prune
mst@mst-lt:~/tmp/libmthca_bad$ git pull ~/scm/libmthca/
remote: Generating pack...
remote: Done counting 18 objects.
Result has 11 objects.
Deltifying 11 objects.
 10remote: 0% (11/11) done
Total 11 (delta 8), reused 1 (delta 1)
Unpacking 11 objects
 100% (11/11) done
Updating 732a507..322a6c9
Fast forward
 Makefile.am      |   25 +++++++++++++++++--------
 configure.in     |   16 ++++++++++++++--
 debian/changelog |    4 +---
 mthca.driver     |    1 +
 src/mthca.c      |   23 ++++++++++++-----------
 5 files changed, 45 insertions(+), 24 deletions(-)
 create mode 100644 mthca.driver

So it seems the tree was more or less fine (it just has some useless objects
because of the disk full failure), the bug seems to be that pull/push fail.

I made a backup of the bad tree so that if someone wants to play with it, here it is:
http://www.openfabrics.org/~mst/libmthca_bad.tgz

-- 
MST

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: tree corrupted on disk quota full
  2007-01-11 19:19   ` Linus Torvalds
  2007-01-11 20:03     ` Linus Torvalds
  2007-01-11 21:02     ` Junio C Hamano
@ 2007-01-11 21:17     ` Andy Whitcroft
  2007-01-11 21:27       ` Junio C Hamano
  2007-01-11 21:59       ` tree corrupted on disk quota full Linus Torvalds
  2 siblings, 2 replies; 24+ messages in thread
From: Andy Whitcroft @ 2007-01-11 21:17 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Michael S. Tsirkin, Junio C Hamano, git

Linus Torvalds wrote:
> 
> On Thu, 11 Jan 2007, Linus Torvalds wrote:
>> That said, clearly something didn't check the error return of a write() 
>> call. Some of that got fixed up recently, so it might even be fixed in 
>> current git already.
> 
> I'm not convinced.
> 
> The "write_in_full()" logic is supposed to help people avoid problems, but 
> it *still* returns a success for a partial write.
> 
> Example of extreme breakage:
> 
> 	static int write_buffer(int fd, const void *buf, size_t len)
> 	{
> 	        ssize_t size;
> 	
> 	        size = write_in_full(fd, buf, len);
> 	        if (!size)
> 	                return error("file write: disk full");
> 	        if (size < 0)
> 	                return error("file write error (%s)", strerror(errno));
> 	        return 0;
> 	}
> 
> which is TOTAL GARBAGE, because the disk-full event might have happened in 
> the middle of the write, so "write_in_full()" might have returned 4096, 
> for example, even though the buffer length was much bigger.
> 
> I personally think write_in_full() is totally mis-designed. If you are 
> ready to handle partial writes, you should use "xwrite()". If you're not 
> ready to handle partial writes, you should either use "write_or_die()", 
> _or_ you should expect a partial write to at least return an error code 
> (which is how "write_buffer()" works).
> 
> But that's not how write_in_full() actually works. Write-in-full does not 
> return an error for a partial write, it returns the partial size.
> 
> Which is idiotic. It makes the function pointless. Just use xwrite() for 
> that.

The call was intended to replace a common idiom:

if (xwrite(fd, buf, size) != size)
	error

write_in_full() is intended as a drop in replacement for that.  On a
short write we will return a short count and that will fail such a test.
 The call basically implements the standard write() call semantic with
maximum attempts to complete.

That said returning -1 would have the same effect.

-apw

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: tree corrupted on disk quota full
  2007-01-11 21:17     ` Andy Whitcroft
@ 2007-01-11 21:27       ` Junio C Hamano
  2007-01-11 22:09         ` Better error messages for corrupt databases Linus Torvalds
  2007-01-11 21:59       ` tree corrupted on disk quota full Linus Torvalds
  1 sibling, 1 reply; 24+ messages in thread
From: Junio C Hamano @ 2007-01-11 21:27 UTC (permalink / raw)
  To: Andy Whitcroft; +Cc: Michael S. Tsirkin, Linus Torvalds, git

Andy Whitcroft <apw@shadowen.org> writes:

> The call was intended to replace a common idiom:
>
> if (xwrite(fd, buf, size) != size)
> 	error
>
> write_in_full() is intended as a drop in replacement for that.  On a
> short write we will return a short count and that will fail such a test.
> The call basically implements the standard write() call semantic with
> maximum attempts to complete.

You are both right ;-).  I would have these fixups on top of
Linus's.

---

diff --git a/config.c b/config.c
index 2cd0263..733fb1a 100644
--- a/config.c
+++ b/config.c
@@ -694,11 +694,9 @@ int git_config_set_multivar(const char* key, const char* value,
 
 		store.key = (char*)key;
 		if (!store_write_section(fd, key) ||
-		    !store_write_pair(fd, key, value)) {
-			ret = write_error();
-			goto out_free;
-		}
-	} else{
+		    !store_write_pair(fd, key, value))
+			goto write_err_out;
+	} else {
 		struct stat st;
 		char* contents;
 		int i, copy_begin, copy_end, new_line = 0;
@@ -777,31 +775,33 @@ int git_config_set_multivar(const char* key, const char* value,
 
 			/* write the first part of the config */
 			if (copy_end > copy_begin) {
-				write_in_full(fd, contents + copy_begin,
-				copy_end - copy_begin);
-				if (new_line)
-					write_in_full(fd, "\n", 1);
+				if (write_in_full(fd, contents + copy_begin,
+						  copy_end - copy_begin) <
+				    copy_end - copy_begin)
+					goto write_err_out;
+				if (new_line &&
+				    write_in_full(fd, "\n", 1) != 1)
+					goto write_err_out;
 			}
 			copy_begin = store.offset[i];
 		}
 
 		/* write the pair (value == NULL means unset) */
 		if (value != NULL) {
-			if (store.state == START)
-				if (!store_write_section(fd, key)) {
-					ret = write_error();
-					goto out_free;
-				}
-			if (!store_write_pair(fd, key, value)) {
-				ret = write_error();
-				goto out_free;
+			if (store.state == START) {
+				if (!store_write_section(fd, key))
+					goto write_err_out;
 			}
+			if (!store_write_pair(fd, key, value))
+				goto write_err_out;
 		}
 
 		/* write the rest of the config */
 		if (copy_begin < st.st_size)
-			write_in_full(fd, contents + copy_begin,
-				st.st_size - copy_begin);
+			if (write_in_full(fd, contents + copy_begin,
+					  st.st_size - copy_begin) <
+			    st.st_size - copy_begin)
+				goto write_err_out;
 
 		munmap(contents, st.st_size);
 		unlink(config_filename);
@@ -824,6 +824,11 @@ out_free:
 		free(lock_file);
 	}
 	return ret;
+
+write_err_out:
+	ret = write_error();
+	goto out_free;
+
 }
 
 int git_config_rename_section(const char *old_name, const char *new_name)
diff --git a/index-pack.c b/index-pack.c
index 8d10d6b..72e0962 100644
--- a/index-pack.c
+++ b/index-pack.c
@@ -814,7 +814,7 @@ static void final(const char *final_pack_name, const char *curr_pack_name,
 		char buf[48];
 		int len = snprintf(buf, sizeof(buf), "%s\t%s\n",
 				   report, sha1_to_hex(sha1));
-		write_in_full(1, buf, len);
+		write_or_die(1, buf, len);
 
 		/*
 		 * Let's just mimic git-unpack-objects here and write

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* Re: tree corrupted on disk quota full
  2007-01-11 21:11   ` Michael S. Tsirkin
@ 2007-01-11 21:50     ` Linus Torvalds
  2007-01-11 21:58       ` Michael S. Tsirkin
  0 siblings, 1 reply; 24+ messages in thread
From: Linus Torvalds @ 2007-01-11 21:50 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: Junio C Hamano, git



On Thu, 11 Jan 2007, Michael S. Tsirkin wrote:
> 
> I did lots of resets and they did not seems to help.

NOTE! If "nothing seems to help" means "git-fsck-objects" still complains, 
then that is very much expected.

"git reset" does NOT fix a corrupted database. Never has, never will. It 
should only fix the case where a branch head points to a corrupt or 
incomplete tree.

To actually fix the database, you need to remove the broken objects. Which 
"git prune" did for you (but you could have just done it by hand too).

> Then, on a hunch, I just did git prune and
> it cleaned the tree so I can pull/push fine.

If so, your branch heads had _already_ been fixed (by one of the resets), 
and "git prune" just got rid of the (unreachable) objects that were 
broken.

> How come?

What happens is:

 - you had gotten some corrupt objects due to the disk filling up 
   (probably during the pull that thus populated the object database with
   partially written objects)

   In particular, the 4d4d30be967d3284cbf59afd4fba6ab536e295f5 object was 
   corrupt. fsck gave a confusing error message:

	error: 4d4d30be967d3284cbf59afd4fba6ab536e295f5: object not found
	error: c03590b581d51d5fa43adbef9415e935d0229412: object not found

   which is really because the _file_ for that object does exist, but the 
   file doesn't actually contain the object it expects (due to 
   corruption), so the object wasn't "found". 

 - git-fsck-objects complained about them, but it doesn't actually do 
   anything about it (which you maybe expected it to do - it doesn't 
   really act as a filesystem fsck which tries to _fix_ things, it really 
   just does the "check" part, since "fixing" things is almost always a 
   manual operation)

 - "git prune" actually removed all the unreachable objects, and since 
   none of the _reachable_ objects were broken, that makes 
   git-fsck-objects shut up too.

 - your "git pull" failed, because it was fetching objects that were 
   corrupt in your local database - and the rule is that local objects 
   ALWAYS override remote objects. That's an important security thing (a 
   "pull" is _never_ allowed to overwrite something you already have, and 
   it doesn't matter if it's corrupt or not, you're not ever going to have 
   a "git pull" overwriting old data)

> So it seems the tree was more or less fine (it just has some useless objects
> because of the disk full failure), the bug seems to be that pull/push fail.

Not a bug. See above. It's really a very important safety feature: we 
never EVER overwrite any old objects. Even if they are corrupt. But it 
means that you need to _fix_ any corruption in order to use the 
repository. 

That's a security feature. It's a feature because git absolutely ALWAYS 
considers the "local repository" to be the trustworthy one. It matters not 
a whit if git thinks a local object may be corrupt - the local copy is 
_still_ considered to always be the definite copy. It's part of what makes 
git stable.

You may not think that sounds "stable" to you right now, in that it made 
it harder to "fix" the problem, but it indirectly means that even a 
_buggy_ git binary (say, you by mistake use an older git binary that 
doesn't understand some new object format) will never overwrite data that 
you already had. That's true safety. 

It does mean that if you have a corrupt database, you really do need to 
fix it first, but it's _still_ a safety feature: git won't fix the 
database for you "by mistake". You need to fix it consciously.

That's true robustness.

			Linus

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: tree corrupted on disk quota full
  2007-01-11 21:50     ` Linus Torvalds
@ 2007-01-11 21:58       ` Michael S. Tsirkin
  2007-01-11 22:24         ` Linus Torvalds
  0 siblings, 1 reply; 24+ messages in thread
From: Michael S. Tsirkin @ 2007-01-11 21:58 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Junio C Hamano, git

>  - your "git pull" failed, because it was fetching objects that were 
>    corrupt in your local database - and the rule is that local objects 
>    ALWAYS override remote objects. That's an important security thing (a 
>    "pull" is _never_ allowed to overwrite something you already have, and 
>    it doesn't matter if it's corrupt or not, you're not ever going to have 
>    a "git pull" overwriting old data)

...

> That's true robustness.
> 
> 			Linus

OK, now that I know what happened, this makes sense to me.
But I'd like to understand whether what created this in the first place:

> 
>  - you had gotten some corrupt objects due to the disk filling up 
>    (probably during the pull that thus populated the object database with
>    partially written objects)
> 
>    In particular, the 4d4d30be967d3284cbf59afd4fba6ab536e295f5 object was 
>    corrupt. fsck gave a confusing error message:
> 
> 	error: 4d4d30be967d3284cbf59afd4fba6ab536e295f5: object not found
> 	error: c03590b581d51d5fa43adbef9415e935d0229412: object not found
> 
>    which is really because the _file_ for that object does exist, but the 
>    file doesn't actually contain the object it expects (due to 
>    corruption), so the object wasn't "found". 

is something expected?

-- 
MST

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: tree corrupted on disk quota full
  2007-01-11 21:17     ` Andy Whitcroft
  2007-01-11 21:27       ` Junio C Hamano
@ 2007-01-11 21:59       ` Linus Torvalds
  2007-01-11 22:10         ` Andy Whitcroft
  1 sibling, 1 reply; 24+ messages in thread
From: Linus Torvalds @ 2007-01-11 21:59 UTC (permalink / raw)
  To: Andy Whitcroft; +Cc: Michael S. Tsirkin, Junio C Hamano, git



On Thu, 11 Jan 2007, Andy Whitcroft wrote:
> 
> The call was intended to replace a common idiom:
> 
> if (xwrite(fd, buf, size) != size)
> 	error

I really don't agree.

You should use "write_or_die()" for this idiom.

There really is two cases:
 - the complex and robust one: "we will keep writing even in the presense 
   of partial writes".

   This is "xwrite()". 

 - the simple case: "write everything", anything else is an error. This is 
   "write_or_die()", or "write_in_full()".

And I claim, that for the "write_in_full()" case, if you EVER get anything 
but the full length back, that's an error.

And it should be treated as such. There is NO POINT in write_in_full() 
ever returning a partial result. It's unrecoverable by design - and if it 
wasn't, you wouldn't use "write_in_full()" in the first place, you'd just 
use "xwrite()".

And returning a partial result in that case is just a recipe for disaster. 
I already pointed to one real bug due to this: write_buffer() was (and 
currently is) simply buggy. And it's buggy EXACTLY becaue 
"write_in_full()" was doing the wrong thing, and just made it easy to 
write buggy code - it was no easier to use than xwrite(), and thus there 
was no point to it. Might as well have just used xwrite() in the first 
place.

So I repeat: either you use "xwrite()" (and handle the partial case), or 
you use "write_in_full()" (and the partial case is an *ERROR*). There is 
no sane middle ground in between those cases.

			Linus

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Better error messages for corrupt databases
  2007-01-11 21:27       ` Junio C Hamano
@ 2007-01-11 22:09         ` Linus Torvalds
  2007-01-12  0:40           ` Shawn O. Pearce
  0 siblings, 1 reply; 24+ messages in thread
From: Linus Torvalds @ 2007-01-11 22:09 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Andy Whitcroft, Michael S. Tsirkin, git



This fixes another problem that Andy's case showed: git-fsck-objects 
reports nonsensical results for corrupt objects.

There were actually two independent and confusing problems:

 - when we had a zero-sized file and used map_sha1_file, mmap() would 
   return EINVAL, and git-fsck-objects would report that as an insane and 
   confusing error. I don't know when this was introduced, it might have 
   been there forever.

 - when "parse_object()" returned NULL, fsck would say "object not found", 
   which can be very confusing, since obviously the object might "exist", 
   it's just unparseable because it's totally corrupt.

So this just makes "xmmap()" return NULL for a zero-sized object (which is 
a valid thing pointer, exactly the same way "malloc()" can return NULL for 
a zero-sized allocation). That fixes the first problem (but we could have 
fixed it in the caller too - I don't personally much care whichever way it 
goes, but maybe somebody should check that the NO_MMAP case does 
something sane in this case too?).

And the second problem is solved by just making the error message slightly 
clearer - the failure to parse an object may be because it's missing or 
corrupt, not necessarily because it's not "found".

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
---

This would hopefully have made the error case Andy had a bit more readable 
and understandable.

diff --git a/fsck-objects.c b/fsck-objects.c
index 0d8a8eb..81f00db 100644
--- a/fsck-objects.c
+++ b/fsck-objects.c
@@ -290,7 +290,7 @@ static int fsck_sha1(unsigned char *sha1)
 {
 	struct object *obj = parse_object(sha1);
 	if (!obj)
-		return error("%s: object not found", sha1_to_hex(sha1));
+		return error("%s: object corrupt or missing", sha1_to_hex(sha1));
 	if (obj->flags & SEEN)
 		return 0;
 	obj->flags |= SEEN;
diff --git a/git-compat-util.h b/git-compat-util.h
index f8d46d5..8781e8e 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -202,6 +202,8 @@ static inline void *xmmap(void *start, size_t length,
 {
 	void *ret = mmap(start, length, prot, flags, fd, offset);
 	if (ret == MAP_FAILED) {
+		if (!length)
+			return NULL;
 		release_pack_memory(length);
 		ret = mmap(start, length, prot, flags, fd, offset);
 		if (ret == MAP_FAILED)

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* Re: tree corrupted on disk quota full
  2007-01-11 21:59       ` tree corrupted on disk quota full Linus Torvalds
@ 2007-01-11 22:10         ` Andy Whitcroft
  2007-01-11 22:32           ` Linus Torvalds
  0 siblings, 1 reply; 24+ messages in thread
From: Andy Whitcroft @ 2007-01-11 22:10 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Michael S. Tsirkin, Junio C Hamano, git

Linus Torvalds wrote:
> 
> On Thu, 11 Jan 2007, Andy Whitcroft wrote:
>> The call was intended to replace a common idiom:
>>
>> if (xwrite(fd, buf, size) != size)
>> 	error
> 
> I really don't agree.
> 
> You should use "write_or_die()" for this idiom.
> 
> There really is two cases:
>  - the complex and robust one: "we will keep writing even in the presense 
>    of partial writes".
> 
>    This is "xwrite()". 
> 
>  - the simple case: "write everything", anything else is an error. This is 
>    "write_or_die()", or "write_in_full()".
> 
> And I claim, that for the "write_in_full()" case, if you EVER get anything 
> but the full length back, that's an error.
> 
> And it should be treated as such. There is NO POINT in write_in_full() 
> ever returning a partial result. It's unrecoverable by design - and if it 
> wasn't, you wouldn't use "write_in_full()" in the first place, you'd just 
> use "xwrite()".
> 
> And returning a partial result in that case is just a recipe for disaster. 
> I already pointed to one real bug due to this: write_buffer() was (and 
> currently is) simply buggy. And it's buggy EXACTLY becaue 
> "write_in_full()" was doing the wrong thing, and just made it easy to 
> write buggy code - it was no easier to use than xwrite(), and thus there 
> was no point to it. Might as well have just used xwrite() in the first 
> place.
> 
> So I repeat: either you use "xwrite()" (and handle the partial case), or 
> you use "write_in_full()" (and the partial case is an *ERROR*). There is 
> no sane middle ground in between those cases.

Things should be safe in general with the code as it is as we are
checking the write length.  But it is clear that converting to an error
would simplify and clean up the code.  Should have done that the first
time.

If its not done in the morning, I'll fix it up.

-apw

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: tree corrupted on disk quota full
  2007-01-11 21:58       ` Michael S. Tsirkin
@ 2007-01-11 22:24         ` Linus Torvalds
  2007-01-11 22:39           ` Michael S. Tsirkin
  2007-01-13  0:53           ` Junio C Hamano
  0 siblings, 2 replies; 24+ messages in thread
From: Linus Torvalds @ 2007-01-11 22:24 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: Junio C Hamano, Git Mailing List, Andy Whitcroft



On Thu, 11 Jan 2007, Michael S. Tsirkin wrote:
> 
> OK, now that I know what happened, this makes sense to me.
> But I'd like to understand whether what created this in the first place:
> 
> > 
> >  - you had gotten some corrupt objects due to the disk filling up 
> >    (probably during the pull that thus populated the object database with
> >    partially written objects)
> > 
> >    In particular, the 4d4d30be967d3284cbf59afd4fba6ab536e295f5 object was 
> >    corrupt. fsck gave a confusing error message:
> > 
> > 	error: 4d4d30be967d3284cbf59afd4fba6ab536e295f5: object not found
> > 	error: c03590b581d51d5fa43adbef9415e935d0229412: object not found
> > 
> >    which is really because the _file_ for that object does exist, but the 
> >    file doesn't actually contain the object it expects (due to 
> >    corruption), so the object wasn't "found". 
> 
> is something expected?

Well, it's a bug, and it's not "expected", but I think it's understood. 

What happens is that you pulled objects that were perfectly fine, and when 
you ran out of diskspace git could create the _filenames_ and inodes for 
them, but when it actually wrote the data itself, it failed.

And it failed in a very unfortunate place: when unpacking the pack-file 
(which you got when doing the "git pull"), it would call 
"write_sha1_file()" to actually write the unpacked object. That one does 
everything correctly and is actually very careful, but then it does

	if (write_buffer(fd, compressed, size) < 0)
		die("unable to write sha1 file");

which _should_ have caught the case that the buffer couldn't be written, 
and died cleanly with an error message, and it would neve rhave moved the 
temporary file that it wrote to into the real database.

In other words, it was doing everything right. A partial file would never 
have actually been allowed to be moved into the database at all, and you'd 
have gotten a nice error message, and the "git pull" would have failed 
gracefully.

However, "write_buffer()" itself was buggy. It did:

	static int write_buffer(int fd, const void *buf, size_t len)
	{
	        ssize_t size;
	
	        size = write_in_full(fd, buf, len);
	        if (!size)
	                return error("file write: disk full");
	        if (size < 0)
	                return error("file write error (%s)", strerror(errno));
	        return 0;
	}

and the problem here is that if the write was _partial_ (not totally 
empty), it would see a positive size, but not a full write, and it would 
incorrectly return zero for "everything is fine". Even though it wasn't.

So my patch to make "write_in_full()" have better semantics (and make it 
simpler too) should have fixed the fundamental problem that caused your 
failure in the first place. The other patch I just sent out should just 
make the error messages be a bit nicer, and isn't important in itself.

Btw, that "write_buffer()" bug was introduced pretty recently. It used to 
be that write_buffer() did the right thing: it used to do:

	while (len) {
		ssize_t size;

		size = write(fd, buf, len);
		if (!size)
			return error("file write: disk full");
		if (size < 0) {
			if (errno == EINTR || errno == EAGAIN)
				continue;
			return error("file write error (%s)", strerror(errno));
		}
		len -= size;
		buf = (char *) buf + size;
	}

which is safe and does the right thing for partial writes and disk full 
errors (of course it is: I wrote that piece of code).

So this bug was _literally_ introduced three days ago, and it was 
introduced by a set of patches that tried to _avoid_ the problem.

Sad. The old code was perfectly good. The new code was unsafe, but thought 
it was better. See commit 93822c2239a336e5cb583549071c59202ef6c5b2 for 
details.

Junio, pls apply my "fix write_in_full" patch asap if you haven't already. 
I find it very irritating when people "clean up" my code, and introduce 
bugs when they do so.

		Linus

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: tree corrupted on disk quota full
  2007-01-11 22:10         ` Andy Whitcroft
@ 2007-01-11 22:32           ` Linus Torvalds
  0 siblings, 0 replies; 24+ messages in thread
From: Linus Torvalds @ 2007-01-11 22:32 UTC (permalink / raw)
  To: Andy Whitcroft; +Cc: Michael S. Tsirkin, Junio C Hamano, git



On Thu, 11 Jan 2007, Andy Whitcroft wrote:
>
> > So I repeat: either you use "xwrite()" (and handle the partial case), or 
> > you use "write_in_full()" (and the partial case is an *ERROR*). There is 
> > no sane middle ground in between those cases.
> 
> Things should be safe in general with the code as it is as we are
> checking the write length.

NO WE ARE NOT.

I already pointed you to write_buffer(). It used to do the right thing. It 
doesn't any more. And it doesn't, exactly because you converted it away 
from a loop that did it right, to doing "write_in_full()" and NOT checking 
the return value properly.

The thing is, if you support partial writes (ie xwrite()), you need to do 
it in a loop, and then the correct thing to check for is "zero or error".

Once you don't do a loop (ie "write_in_full()" - the whole _point_ is to 
not do the loop, after all), you need to either expand that check to "zero 
or error or partial" (which just makes the code _more_ complex), or you 
need to make "write_in_full()" just return an error for the partial case.

Which is why I'm harping on this issue: either we use "xwrite()", or we 
fix "write_in_full()" to return errors on partials. Because the "middle 
ground", where write_in_full() emulates the partial case of "xwrite()" is 
actually MORE complex than "xwrite()" itself.

		Linus

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: tree corrupted on disk quota full
  2007-01-11 22:24         ` Linus Torvalds
@ 2007-01-11 22:39           ` Michael S. Tsirkin
  2007-01-12  0:42             ` Linus Torvalds
  2007-01-13  0:53           ` Junio C Hamano
  1 sibling, 1 reply; 24+ messages in thread
From: Michael S. Tsirkin @ 2007-01-11 22:39 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Junio C Hamano, Git Mailing List, Andy Whitcroft

> So this bug was _literally_ introduced three days ago, and it was 
> introduced by a set of patches that tried to _avoid_ the problem.
> 
> Sad. The old code was perfectly good. The new code was unsafe, but thought 
> it was better. See commit 93822c2239a336e5cb583549071c59202ef6c5b2 for 
> details.

Weird. I think the system where the tree got corrupted had git 1.4.4.4.

-- 
MST

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: Better error messages for corrupt databases
  2007-01-11 22:09         ` Better error messages for corrupt databases Linus Torvalds
@ 2007-01-12  0:40           ` Shawn O. Pearce
  0 siblings, 0 replies; 24+ messages in thread
From: Shawn O. Pearce @ 2007-01-12  0:40 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Junio C Hamano, Andy Whitcroft, Michael S. Tsirkin, git

Linus Torvalds <torvalds@osdl.org> wrote:
> So this just makes "xmmap()" return NULL for a zero-sized object (which is 
> a valid thing pointer, exactly the same way "malloc()" can return NULL for 
> a zero-sized allocation). That fixes the first problem (but we could have 
> fixed it in the caller too - I don't personally much care whichever way it 
> goes, but maybe somebody should check that the NO_MMAP case does 
> something sane in this case too?).

All calls to perform any sort of mmap go through xmmap().  If NO_MMAP
was defined at compile time than the mmap() call within xmmap() is
redefined to invoke git_mmap() via a preprocessor define slightly
earlier in git-compat-util.h.

So your patch will also automatically do the right thing in the
NO_MMAP case.

BTW, I like your solution of just fixing it here in xmmap().  Good idea.

-- 
Shawn.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: tree corrupted on disk quota full
  2007-01-11 22:39           ` Michael S. Tsirkin
@ 2007-01-12  0:42             ` Linus Torvalds
  2007-01-12  0:51               ` Shawn O. Pearce
  0 siblings, 1 reply; 24+ messages in thread
From: Linus Torvalds @ 2007-01-12  0:42 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: Junio C Hamano, Git Mailing List, Andy Whitcroft



On Fri, 12 Jan 2007, Michael S. Tsirkin wrote:
> 
> Weird. I think the system where the tree got corrupted had git 1.4.4.4.

Ok, you had an email with "git version" that said 1.5.0-rc0-g<something>, 
but that may have been after you already upgraded for other reasons.

It would definitely be good to reproduce this - there are multiple places 
where we could screw up in the presense of a short write. It's also 
entirely possible that the core code doesn't screw up, but if some of the 
higher-level scripts don't always check the error code, an error at 
unpacking time (or some other time) could just go unnoticed.

That said, even though I complain about the "write_in_full()" bug, I think 
that with the "return error even for partial writes" change it actually 
_does_ end up being a safer way to do things, so it's entirely possible 
that while it introduced one bug, it could have fixed another one. The 
call chain I looked at was just one particular one (it's the most 
fundamental one for writing out individual objects, so in that sense it's 
the most likely one, but it's certainly possible that something else 
happened)

		Linus

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: tree corrupted on disk quota full
  2007-01-12  0:42             ` Linus Torvalds
@ 2007-01-12  0:51               ` Shawn O. Pearce
  0 siblings, 0 replies; 24+ messages in thread
From: Shawn O. Pearce @ 2007-01-12  0:51 UTC (permalink / raw)
  To: Linus Torvalds
  Cc: Michael S. Tsirkin, Junio C Hamano, Git Mailing List,
	Andy Whitcroft

On Fri, 12 Jan 2007, Michael S. Tsirkin wrote:
> 
> Weird. I think the system where the tree got corrupted had git 1.4.4.4.

Or maybe it was 1.5.0-rc0g<something>.  git-describe has a bug (but
is patched in pu) that caused it to pick up 1.4.4.4 on master/next/pu
right now due to the 1.4.4.4 maint release being merged back into
master/next/pu after the 1.5.0rc-0 tag was created.

-- 
Shawn.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: tree corrupted on disk quota full
  2007-01-11 22:24         ` Linus Torvalds
  2007-01-11 22:39           ` Michael S. Tsirkin
@ 2007-01-13  0:53           ` Junio C Hamano
  1 sibling, 0 replies; 24+ messages in thread
From: Junio C Hamano @ 2007-01-13  0:53 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: git

Linus Torvalds <torvalds@osdl.org> writes:

> Sad. The old code was perfectly good. The new code was unsafe, but thought 
> it was better. See commit 93822c2239a336e5cb583549071c59202ef6c5b2 for 
> details.

Sorry about not catching it earlier.

^ permalink raw reply	[flat|nested] 24+ messages in thread

end of thread, other threads:[~2007-01-13  0:53 UTC | newest]

Thread overview: 24+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-01-11 12:57 tree corrupted on disk quota full Michael S. Tsirkin
2007-01-11 13:40 ` Andreas Ericsson
2007-01-11 13:43   ` Andy Whitcroft
2007-01-11 13:59   ` Michael S. Tsirkin
2007-01-11 14:28     ` Andreas Ericsson
2007-01-11 18:31 ` Linus Torvalds
2007-01-11 19:19   ` Linus Torvalds
2007-01-11 20:03     ` Linus Torvalds
2007-01-11 21:02     ` Junio C Hamano
2007-01-11 21:17     ` Andy Whitcroft
2007-01-11 21:27       ` Junio C Hamano
2007-01-11 22:09         ` Better error messages for corrupt databases Linus Torvalds
2007-01-12  0:40           ` Shawn O. Pearce
2007-01-11 21:59       ` tree corrupted on disk quota full Linus Torvalds
2007-01-11 22:10         ` Andy Whitcroft
2007-01-11 22:32           ` Linus Torvalds
2007-01-11 21:11   ` Michael S. Tsirkin
2007-01-11 21:50     ` Linus Torvalds
2007-01-11 21:58       ` Michael S. Tsirkin
2007-01-11 22:24         ` Linus Torvalds
2007-01-11 22:39           ` Michael S. Tsirkin
2007-01-12  0:42             ` Linus Torvalds
2007-01-12  0:51               ` Shawn O. Pearce
2007-01-13  0:53           ` Junio C Hamano

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox