Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 50aa4eb0 authored by Evgeniy Dushistov's avatar Evgeniy Dushistov Committed by Linus Torvalds
Browse files

[PATCH] ufs: i_blocks wrong count



At now UFS code uses DQUOT_* mechanism, but it also update inode->i_blocks
manually, this cause wrong i_blocks value.

Signed-off-by: default avatarEvgeniy Dushistov <dushistov@mail.ru>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent dd187a26
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -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)
+12 −13
Original line number Diff line number Diff line
@@ -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 @@ static int ufs_trunc_direct (struct inode * inode)
			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 @@ static int ufs_trunc_direct (struct inode * inode)
			frag_to_free = tmp;
			free_count = uspi->s_fpb;
		}
		mark_inode_dirty(inode);
	}
	
	if (free_count > 0)
@@ -158,9 +157,9 @@ static int ufs_trunc_direct (struct inode * inode)
	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;
		mark_inode_dirty(inode);

		ufs_free_blocks(inode, tmp, uspi->s_fpb);
		mark_inode_dirty(inode);
		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;
		mark_inode_dirty(inode);

		ufs_free_blocks(inode, tmp, uspi->s_fpb);
		mark_inode_dirty(inode);
		ubh_bforget(tind_bh);
		tind_bh = NULL;
	}