[PATCH] ufs: i_blocks wrong count
Evgeniy Dushistov [Sun, 25 Jun 2006 12:47:26 +0000 (05:47 -0700)]
At now UFS code uses DQUOT_* mechanism, but it also update inode->i_blocks
manually, this cause wrong i_blocks value.

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/truncate.c

index 7a4735f..62193db 100644 (file)
@@ -395,7 +395,6 @@ unsigned ufs_new_fragments(struct inode * inode, __fs32 * p, unsigned fragment,
                if (result) {
                        *p = cpu_to_fs32(sb, result);
                        *err = 0;
-                       inode->i_blocks += count << uspi->s_nspfshift;
                        UFS_I(inode)->i_lastfrag = max_t(u32, UFS_I(inode)->i_lastfrag, fragment + count);
                }
                unlock_super(sb);
@@ -409,7 +408,6 @@ unsigned ufs_new_fragments(struct inode * inode, __fs32 * p, unsigned fragment,
        result = ufs_add_fragments (inode, tmp, oldcount, newcount, err);
        if (result) {
                *err = 0;
-               inode->i_blocks += count << uspi->s_nspfshift;
                UFS_I(inode)->i_lastfrag = max_t(u32, UFS_I(inode)->i_lastfrag, fragment + count);
                unlock_super(sb);
                UFSD("EXIT, result %u\n", result);
@@ -444,7 +442,6 @@ unsigned ufs_new_fragments(struct inode * inode, __fs32 * p, unsigned fragment,
 
                *p = cpu_to_fs32(sb, result);
                *err = 0;
-               inode->i_blocks += count << uspi->s_nspfshift;
                UFS_I(inode)->i_lastfrag = max_t(u32, UFS_I(inode)->i_lastfrag, fragment + count);
                unlock_super(sb);
                if (newcount < request)
index 716183d..b860a29 100644 (file)
@@ -112,9 +112,8 @@ static int ufs_trunc_direct (struct inode * inode)
        frag1 = ufs_fragnum (frag1);
        frag2 = ufs_fragnum (frag2);
 
-       inode->i_blocks -= (frag2-frag1) << uspi->s_nspfshift;
-       mark_inode_dirty(inode);
        ufs_free_fragments (inode, tmp + frag1, frag2 - frag1);
+       mark_inode_dirty(inode);
        frag_to_free = tmp + frag1;
 
 next1:
@@ -128,8 +127,7 @@ next1:
                        continue;
 
                *p = 0;
-               inode->i_blocks -= uspi->s_nspb;
-               mark_inode_dirty(inode);
+
                if (free_count == 0) {
                        frag_to_free = tmp;
                        free_count = uspi->s_fpb;
@@ -140,6 +138,7 @@ next1:
                        frag_to_free = tmp;
                        free_count = uspi->s_fpb;
                }
+               mark_inode_dirty(inode);
        }
        
        if (free_count > 0)
@@ -158,9 +157,9 @@ next1:
        frag4 = ufs_fragnum (frag4);
 
        *p = 0;
-       inode->i_blocks -= frag4 << uspi->s_nspfshift;
-       mark_inode_dirty(inode);
+
        ufs_free_fragments (inode, tmp, frag4);
+       mark_inode_dirty(inode);
  next3:
 
        UFSD("EXIT\n");
@@ -219,7 +218,7 @@ static int ufs_trunc_indirect (struct inode * inode, unsigned offset, __fs32 *p)
                        frag_to_free = tmp;
                        free_count = uspi->s_fpb;
                }
-               inode->i_blocks -= uspi->s_nspb;
+
                mark_inode_dirty(inode);
        }
 
@@ -232,9 +231,9 @@ static int ufs_trunc_indirect (struct inode * inode, unsigned offset, __fs32 *p)
        if (i >= uspi->s_apb) {
                tmp = fs32_to_cpu(sb, *p);
                *p = 0;
-               inode->i_blocks -= uspi->s_nspb;
-               mark_inode_dirty(inode);
+
                ufs_free_blocks (inode, tmp, uspi->s_fpb);
+               mark_inode_dirty(inode);
                ubh_bforget(ind_ubh);
                ind_ubh = NULL;
        }
@@ -295,9 +294,9 @@ static int ufs_trunc_dindirect (struct inode *inode, unsigned offset, __fs32 *p)
        if (i >= uspi->s_apb) {
                tmp = fs32_to_cpu(sb, *p);
                *p = 0;
-               inode->i_blocks -= uspi->s_nspb;
+
+               ufs_free_blocks(inode, tmp, uspi->s_fpb);
                mark_inode_dirty(inode);
-               ufs_free_blocks (inode, tmp, uspi->s_fpb);
                ubh_bforget(dind_bh);
                dind_bh = NULL;
        }
@@ -355,9 +354,9 @@ static int ufs_trunc_tindirect (struct inode * inode)
        if (i >= uspi->s_apb) {
                tmp = fs32_to_cpu(sb, *p);
                *p = 0;
-               inode->i_blocks -= uspi->s_nspb;
+
+               ufs_free_blocks(inode, tmp, uspi->s_fpb);
                mark_inode_dirty(inode);
-               ufs_free_blocks (inode, tmp, uspi->s_fpb);
                ubh_bforget(tind_bh);
                tind_bh = NULL;
        }