> In article <Pine.GSO.4.21.0103011345110.11577-100000@weyl.math.psu.edu>,
> Alexander Viro <viro@math.psu.edu> wrote:
> >
> >Alan, fix is really quite simple. Especially if you have vmtruncate()
> >returning int (ac1 used to do it, I didn't check later ones). Actually
> >just a generic_cont_expand() done on expanding path in vmtruncate()
> >will be enough - it should be OK for all cases, including normal
> >filesystems. <grabbing -ac7>
> >
> >OK, any brave soul to test that? All I can promise that it builds.
>
> This looks like it would create a dummy block even for non-broken
> filesystems (ie truncating a file to be larger on ext2 would create a
> block, no?). While that would work, it would also waste disk-space.
<checking> yeah... Frankly, I'd just do
--- buffer.c Thu Mar 1 15:16:34 2001
+++ buffer.c.old Thu Mar 1 15:17:55 2001
@@ -1571,6 +1571,9 @@
struct buffer_head *bh, *head, *wait[2], **wait_bh=wait;
char *kaddr = kmap(page);
+ if (from >= to)
+ goto done;
+
blocksize = inode->i_sb->s_blocksize;
if (!page->buffers)
create_empty_buffers(page, inode->i_dev, blocksize);
@@ -1626,6 +1629,7 @@
if (!buffer_uptodate(*wait_bh))
goto out;
}
+done:
return 0;
out:
bh = head;
@@ -1648,6 +1652,9 @@
unsigned blocksize;
struct buffer_head *bh, *head;
+ if (from >= to)
+ goto done;
+
blocksize = inode->i_sb->s_blocksize;
for(bh = head = page->buffers, block_start = 0;
@@ -1677,6 +1684,7 @@
*/
if (!partial)
SetPageUptodate(page);
+done:
return 0;
}
- obviously correct, avoids disk waste and since we do it in __block...
everything keeps working (block_... versions are obviously OK, cont_...
also does the right thing).
Dunno. I like the idea of expanding truncate() being the same as
lseek() + empty write(). After all, that's what it is.
Comments?
Cheers,
Al
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/