[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[patch] ext2fs/pager.c:diskfs_grow: another logic error
From: |
Neal H Walfield |
Subject: |
[patch] ext2fs/pager.c:diskfs_grow: another logic error |
Date: |
05 Apr 2002 22:41:35 -0500 |
User-agent: |
Gnus/5.0808 (Gnus v5.8.8) Emacs/21.1 |
Fixing the last logic error exposed another error in diskfs_grow: when
we take the correct branch, we miscalculate the value of NEW_SIZE.
Consider the case where the file system block size is 1024 and
diskfs_grow is called with a node that has the allocsize field set to
1024 and with the size argument set to 1025. After the ext2_getblk
loop, END_BLOCK will be 2 (correctly indicating that block 0 and block
1 are allocated for NODE yielding a total allocation of 2048 bytes).
When we recalculate NEW_SIZE (which is eventually assigned to
NODE->allocsize), we set it to (END_BLOCK - 1) * 1024 or, 1024! This
should really just be END_BLOCK * 1024.
Here is a patch. Okay to apply?
2002-04-05 Neal H Walfield <neal@cs.uml.edu>
* pager.c (diskfs_grow): Correctly recalculate NEW_SIZE.
Index: pager.c
===================================================================
RCS file: /cvsroot/hurd/hurd/ext2fs/pager.c,v
retrieving revision 1.70
diff -u -p -r1.70 pager.c
--- pager.c 1 Apr 2002 20:12:03 -0000 1.70
+++ pager.c 6 Apr 2002 03:24:25 -0000
@@ -646,7 +646,7 @@ diskfs_grow (struct node *node, off_t si
if (! err)
/* Reflect how much we allocated successfully. */
- new_size = (end_block - 1) << log2_block_size;
+ new_size = end_block << log2_block_size;
else
/* See if it's still valid to say this. */
dn->last_page_partially_writable =
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [patch] ext2fs/pager.c:diskfs_grow: another logic error,
Neal H Walfield <=