]> git.karo-electronics.de Git - linux-beck.git/commitdiff
[GFS2] Fix a case where we didn't get unstuffing right
authorSteven Whitehouse <steve@men-an-tol.chygwyn.com>
Wed, 15 Feb 2006 12:26:19 +0000 (12:26 +0000)
committerSteven Whitehouse <steve@chygwyn.com>
Wed, 15 Feb 2006 12:26:19 +0000 (12:26 +0000)
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>
fs/gfs2/ops_address.c

index 39d03f3f2d541008f96799676a3095ee24342118..1ccc264268214b7886a80b69756dfd1330dd5561 100644 (file)
@@ -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: