[PATCH] ufs: right block allocation
Evgeniy Dushistov [Sun, 25 Jun 2006 12:47:19 +0000 (05:47 -0700)]
* 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>

fs/ufs/balloc.c
fs/ufs/inode.c

index 3ada9dc..cc0c8f1 100644 (file)
@@ -223,18 +223,6 @@ failed:
 }
 
 
-
-#define NULLIFY_FRAGMENTS \
-       for (i = oldcount; i < newcount; i++) { \
-               bh = sb_getblk(sb, result + i); \
-               memset (bh->b_data, 0, sb->s_blocksize); \
-               set_buffer_uptodate(bh); \
-               mark_buffer_dirty (bh); \
-               if (IS_SYNC(inode)) \
-                       sync_dirty_buffer(bh); \
-               brelse (bh); \
-       }
-
 unsigned ufs_new_fragments (struct inode * inode, __fs32 * p, unsigned fragment,
        unsigned goal, unsigned count, int * err )
 {
@@ -312,7 +300,6 @@ unsigned ufs_new_fragments (struct inode * inode, __fs32 * p, unsigned fragment,
                        *err = 0;
                        inode->i_blocks += count << uspi->s_nspfshift;
                        UFS_I(inode)->i_lastfrag = max_t(u32, UFS_I(inode)->i_lastfrag, fragment + count);
-                       NULLIFY_FRAGMENTS
                }
                unlock_super(sb);
                UFSD(("EXIT, result %u\n", result))
@@ -327,7 +314,6 @@ unsigned ufs_new_fragments (struct inode * inode, __fs32 * p, unsigned fragment,
                *err = 0;
                inode->i_blocks += count << uspi->s_nspfshift;
                UFS_I(inode)->i_lastfrag = max_t(u32, UFS_I(inode)->i_lastfrag, fragment + count);
-               NULLIFY_FRAGMENTS
                unlock_super(sb);
                UFSD(("EXIT, result %u\n", result))
                return result;
@@ -379,7 +365,6 @@ unsigned ufs_new_fragments (struct inode * inode, __fs32 * p, unsigned fragment,
                *err = 0;
                inode->i_blocks += count << uspi->s_nspfshift;
                UFS_I(inode)->i_lastfrag = max_t(u32, UFS_I(inode)->i_lastfrag, fragment + count);
-               NULLIFY_FRAGMENTS
                unlock_super(sb);
                if (newcount < request)
                        ufs_free_fragments (inode, result + newcount, request - newcount);
index 3c3f62c..2b23663 100644 (file)
@@ -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;
        }