diff options
author | Evgeniy Dushistov <dushistov@mail.ru> | 2006-06-25 14:47:19 +0200 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-25 19:01:01 +0200 |
commit | c9a27b5dca52bbd0955e065e49e56eb313d02c34 (patch) | |
tree | 6e5223f9ee942e8a55552138aa67ef2a37e01738 /fs/ufs/inode.c | |
parent | [PATCH] ufs: ufs_trunc_indirect: infinite cycle (diff) | |
download | linux-c9a27b5dca52bbd0955e065e49e56eb313d02c34.tar.xz linux-c9a27b5dca52bbd0955e065e49e56eb313d02c34.zip |
[PATCH] ufs: right block allocation
* After block allocation, we map it on the same "address" as 8 others
blocks
* We nullify block several times: once in ufs/block.c and once in
block_*write_full_page, and use different "caches" for this.
Signed-off-by: Evgeniy Dushistov <dushistov@mail.ru>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs/ufs/inode.c')
-rw-r--r-- | fs/ufs/inode.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c index 3c3f62ce2ad9..2b2366360e5a 100644 --- a/fs/ufs/inode.c +++ b/fs/ufs/inode.c @@ -161,6 +161,17 @@ out: return ret; } +static void ufs_clear_block(struct inode *inode, struct buffer_head *bh) +{ + lock_buffer(bh); + memset(bh->b_data, 0, inode->i_sb->s_blocksize); + set_buffer_uptodate(bh); + mark_buffer_dirty(bh); + unlock_buffer(bh); + if (IS_SYNC(inode)) + sync_dirty_buffer(bh); +} + static struct buffer_head * ufs_inode_getfrag (struct inode *inode, unsigned int fragment, unsigned int new_fragment, unsigned int required, int *err, int metadata, long *phys, int *new) @@ -204,7 +215,7 @@ repeat: brelse (result); goto repeat; } else { - *phys = tmp; + *phys = tmp + blockoff; return NULL; } } @@ -259,14 +270,11 @@ repeat: return NULL; } - /* The nullification of framgents done in ufs/balloc.c is - * something I don't have the stomache to move into here right - * now. -DaveM - */ if (metadata) { result = sb_getblk(inode->i_sb, tmp + blockoff); + ufs_clear_block(inode, result); } else { - *phys = tmp; + *phys = tmp + blockoff; result = NULL; *err = 0; *new = 1; @@ -333,7 +341,7 @@ repeat: brelse (result); goto repeat; } else { - *phys = tmp; + *phys = tmp + blockoff; goto out; } } @@ -349,14 +357,12 @@ repeat: goto out; } - /* The nullification of framgents done in ufs/balloc.c is - * something I don't have the stomache to move into here right - * now. -DaveM - */ + if (metadata) { result = sb_getblk(sb, tmp + blockoff); + ufs_clear_block(inode, result); } else { - *phys = tmp; + *phys = tmp + blockoff; *new = 1; } |