[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 <swhiteho@redhat.com>
diff --git a/fs/gfs2/ops_address.c b/fs/gfs2/ops_address.c
index 39d03f3..1ccc264 100644
--- a/fs/gfs2/ops_address.c
+++ b/fs/gfs2/ops_address.c
@@ -220,14 +220,14 @@
 	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 @@
 {
 	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 @@
 	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: