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

Commit eb315d2a authored by Al Viro's avatar Al Viro
Browse files

ufs: restore maintaining ->i_blocks



Cc: stable@vger.kernel.org
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 414cf718
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -672,6 +672,7 @@ void __inode_add_bytes(struct inode *inode, loff_t bytes)
		inode->i_bytes -= 512;
	}
}
EXPORT_SYMBOL(__inode_add_bytes);

void inode_add_bytes(struct inode *inode, loff_t bytes)
{
+25 −1
Original line number Diff line number Diff line
@@ -83,6 +83,7 @@ void ufs_free_fragments(struct inode *inode, u64 fragment, unsigned count)
				   "bit already cleared for fragment %u", i);
	}

	inode_sub_bytes(inode, count << uspi->s_fshift);
	fs32_add(sb, &ucg->cg_cs.cs_nffree, count);
	uspi->cs_total.cs_nffree += count;
	fs32_add(sb, &UFS_SB(sb)->fs_cs(cgno).cs_nffree, count);
@@ -184,6 +185,7 @@ void ufs_free_blocks(struct inode *inode, u64 fragment, unsigned count)
			ufs_error(sb, "ufs_free_blocks", "freeing free fragment");
		}
		ubh_setblock(UCPI_UBH(ucpi), ucpi->c_freeoff, blkno);
		inode_sub_bytes(inode, uspi->s_fpb << uspi->s_fshift);
		if ((UFS_SB(sb)->s_flags & UFS_CG_MASK) == UFS_CG_44BSD)
			ufs_clusteracct (sb, ucpi, blkno, 1);

@@ -494,6 +496,20 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment,
	return 0;
}		

static bool try_add_frags(struct inode *inode, unsigned frags)
{
	unsigned size = frags * i_blocksize(inode);
	spin_lock(&inode->i_lock);
	__inode_add_bytes(inode, size);
	if (unlikely((u32)inode->i_blocks != inode->i_blocks)) {
		__inode_sub_bytes(inode, size);
		spin_unlock(&inode->i_lock);
		return false;
	}
	spin_unlock(&inode->i_lock);
	return true;
}

static u64 ufs_add_fragments(struct inode *inode, u64 fragment,
			     unsigned oldcount, unsigned newcount)
{
@@ -530,6 +546,9 @@ static u64 ufs_add_fragments(struct inode *inode, u64 fragment,
	for (i = oldcount; i < newcount; i++)
		if (ubh_isclr (UCPI_UBH(ucpi), ucpi->c_freeoff, fragno + i))
			return 0;

	if (!try_add_frags(inode, count))
		return 0;
	/*
	 * Block can be extended
	 */
@@ -647,6 +666,7 @@ static u64 ufs_alloc_fragments(struct inode *inode, unsigned cgno,
			ubh_setbit (UCPI_UBH(ucpi), ucpi->c_freeoff, goal + i);
		i = uspi->s_fpb - count;

		inode_sub_bytes(inode, i << uspi->s_fshift);
		fs32_add(sb, &ucg->cg_cs.cs_nffree, i);
		uspi->cs_total.cs_nffree += i;
		fs32_add(sb, &UFS_SB(sb)->fs_cs(cgno).cs_nffree, i);
@@ -657,6 +677,8 @@ static u64 ufs_alloc_fragments(struct inode *inode, unsigned cgno,
	result = ufs_bitmap_search (sb, ucpi, goal, allocsize);
	if (result == INVBLOCK)
		return 0;
	if (!try_add_frags(inode, count))
		return 0;
	for (i = 0; i < count; i++)
		ubh_clrbit (UCPI_UBH(ucpi), ucpi->c_freeoff, result + i);
	
@@ -716,6 +738,8 @@ static u64 ufs_alloccg_block(struct inode *inode,
		return INVBLOCK;
	ucpi->c_rotor = result;
gotit:
	if (!try_add_frags(inode, uspi->s_fpb))
		return 0;
	blkno = ufs_fragstoblks(result);
	ubh_clrblock (UCPI_UBH(ucpi), ucpi->c_freeoff, blkno);
	if ((UFS_SB(sb)->s_flags & UFS_CG_MASK) == UFS_CG_44BSD)