From 5c4e9e036678fae65c9288e1c00a6f33cd447283 Mon Sep 17 00:00:00 2001 From: Steven Whitehouse Date: Wed, 15 Feb 2006 12:26:19 +0000 Subject: [GFS2] Fix a case where we didn't get unstuffing right There was a bug in the unstuffing logic which caused a crash under certain circumstances. This is now fixed. Signed-off-by: Steven Whitehouse --- fs/gfs2/ops_address.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'fs') diff --git a/fs/gfs2/ops_address.c b/fs/gfs2/ops_address.c index 39d03f3f2d5..1ccc2642682 100644 --- a/fs/gfs2/ops_address.c +++ b/fs/gfs2/ops_address.c @@ -220,14 +220,14 @@ static int stuffed_readpage(struct gfs2_inode *ip, struct page *page) if (error) return error; - kaddr = kmap(page); + kaddr = kmap_atomic(page, KM_USER0); memcpy((char *)kaddr, dibh->b_data + sizeof(struct gfs2_dinode), ip->i_di.di_size); memset((char *)kaddr + ip->i_di.di_size, 0, PAGE_CACHE_SIZE - ip->i_di.di_size); - kunmap(page); + kunmap_atomic(page, KM_USER0); brelse(dibh); @@ -240,9 +240,9 @@ static int zero_readpage(struct page *page) { void *kaddr; - kaddr = kmap(page); + kaddr = kmap_atomic(page, KM_USER0); memset(kaddr, 0, PAGE_CACHE_SIZE); - kunmap(page); + kunmap_atomic(page, KM_USER0); SetPageUptodate(page); unlock_page(page); @@ -364,14 +364,14 @@ static int gfs2_prepare_write(struct file *file, struct page *page, if (gfs2_is_stuffed(ip)) { if (end > sdp->sd_sb.sb_bsize - sizeof(struct gfs2_dinode)) { error = gfs2_unstuff_dinode(ip, gfs2_unstuffer_page, page); - if (error) - goto out; - } else if (!PageUptodate(page)) { + if (error == 0) + goto prepare_write; + } else if (!PageUptodate(page)) error = stuffed_readpage(ip, page); - goto out; - } + goto out; } +prepare_write: error = block_prepare_write(page, from, to, gfs2_get_block); out: -- cgit v1.2.3