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

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

[PATCH] ufs: missed brelse and wrong baseblk



This patch fixes two bugs, which introduced by previous patches:

1) Missed "brelse"

2) Sometimes "baseblk" may be wrongly calculated, if i_size is equal to
   zero, which lead infinite cycle in "mpage_writepages".

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 96710b29
Loading
Loading
Loading
Loading
+5 −7
Original line number Diff line number Diff line
@@ -269,20 +269,17 @@ static struct page *ufs_get_locked_page(struct address_space *mapping,
 * We can come here from ufs_writepage or ufs_prepare_write,
 * locked_page is argument of these functions, so we already lock it.
 */
static void ufs_change_blocknr(struct inode *inode, unsigned int count,
			       unsigned int oldb, unsigned int newb,
			       struct page *locked_page)
static void ufs_change_blocknr(struct inode *inode, unsigned int baseblk,
			       unsigned int count, unsigned int oldb,
			       unsigned int newb, struct page *locked_page)
{
	unsigned int blk_per_page = 1 << (PAGE_CACHE_SHIFT - inode->i_blkbits);
	sector_t baseblk;
	struct address_space *mapping = inode->i_mapping;
	pgoff_t index, cur_index = locked_page->index;
	unsigned int i, j;
	struct page *page;
	struct buffer_head *head, *bh;

	baseblk = ((i_size_read(inode) - 1) >> inode->i_blkbits) + 1 - count;

	UFSD("ENTER, ino %lu, count %u, oldb %u, newb %u\n",
	      inode->i_ino, count, oldb, newb);

@@ -439,7 +436,8 @@ unsigned ufs_new_fragments(struct inode * inode, __fs32 * p, unsigned fragment,
	}
	result = ufs_alloc_fragments (inode, cgno, goal, request, err);
	if (result) {
		ufs_change_blocknr(inode, oldcount, tmp, result, locked_page);
		ufs_change_blocknr(inode, fragment - oldcount, oldcount, tmp,
				   result, locked_page);

		*p = cpu_to_fs32(sb, result);
		*err = 0;
+1 −0
Original line number Diff line number Diff line
@@ -175,6 +175,7 @@ ufs_clear_frags(struct inode *inode, sector_t beg,
	for (++beg; beg < end; ++beg) {
		bh = sb_getblk(inode->i_sb, beg);
		ufs_clear_frag(inode, bh);
		brelse(bh);
	}
	return res;
}