]> git.hungrycats.org Git - linux/commitdiff
[PATCH] udf patch for 2.5.7-pre1 (part 3/4)
authorBen Fennema <bfennema@falcon.csc.calpoly.edu>
Wed, 13 Mar 2002 07:37:35 +0000 (23:37 -0800)
committerLinus Torvalds <torvalds@home.transmeta.com>
Wed, 13 Mar 2002 07:37:35 +0000 (23:37 -0800)
This patch fixes an extent preallocation bug and adds missing sb_bread == NULL
checks.

fs/udf/file.c
fs/udf/inode.c
fs/udf/truncate.c

index 72ce8252793f8094364d46e7ad27757726d6e7b2..e6fdea847c4bd47fc7115ca827ff8a849a4f0dea 100644 (file)
@@ -50,6 +50,7 @@ static int udf_adinicb_readpage(struct file *file, struct page * page)
        struct buffer_head *bh;
        int block;
        char *kaddr;
+       int err = 0;
 
        if (!PageLocked(page))
                PAGE_BUG(page);
@@ -58,13 +59,20 @@ static int udf_adinicb_readpage(struct file *file, struct page * page)
        memset(kaddr, 0, PAGE_CACHE_SIZE);
        block = udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0);
        bh = sb_bread(inode->i_sb, block);
+       if (!bh)
+       {
+               SetPageError(page);
+               err = -EIO;
+               goto out;
+       }
        memcpy(kaddr, bh->b_data + udf_ext0_offset(inode), inode->i_size);
        brelse(bh);
        flush_dcache_page(page);
        SetPageUptodate(page);
+out:
        kunmap(page);
        UnlockPage(page);
-       return 0;
+       return err;
 }
 
 static int udf_adinicb_writepage(struct page *page)
@@ -74,6 +82,7 @@ static int udf_adinicb_writepage(struct page *page)
        struct buffer_head *bh;
        int block;
        char *kaddr;
+       int err = 0;
 
        if (!PageLocked(page))
                PAGE_BUG(page);
@@ -81,13 +90,20 @@ static int udf_adinicb_writepage(struct page *page)
        kaddr = kmap(page);
        block = udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0);
        bh = sb_bread(inode->i_sb, block);
+       if (!bh)
+       {
+               SetPageError(page);
+               err = -EIO;
+               goto out;
+       }
        memcpy(bh->b_data + udf_ext0_offset(inode), kaddr, inode->i_size);
        mark_buffer_dirty(bh);
        brelse(bh);
        SetPageUptodate(page);
+out:
        kunmap(page);
        UnlockPage(page);
-       return 0;
+       return err;
 }
 
 static int udf_adinicb_prepare_write(struct file *file, struct page *page, unsigned offset, unsigned to)
@@ -103,19 +119,27 @@ static int udf_adinicb_commit_write(struct file *file, struct page *page, unsign
        struct buffer_head *bh;
        int block;
        char *kaddr = page_address(page);
+       int err = 0;
 
        block = udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0);
        bh = sb_bread(inode->i_sb, block);
+       if (!bh)
+       {
+               SetPageError(page);
+               err = -EIO;
+               goto out;
+       }
        memcpy(bh->b_data + udf_file_entry_alloc_offset(inode) + offset,
-               kaddr + offset, to-offset);
+               kaddr + offset, to - offset);
        mark_buffer_dirty(bh);
        brelse(bh);
        SetPageUptodate(page);
+out:
        kunmap(page);
        /* only one page here */
        if (to > inode->i_size)
                inode->i_size = to;
-       return 0;
+       return err;
 }
 
 struct address_space_operations udf_adinicb_aops = {
index 9d7cc260dfb7638d119c58f9845f42abb03801f9..93f842967cf64959d574536b9467cb1d4b2c6f96 100644 (file)
@@ -83,9 +83,6 @@ void udf_put_inode(struct inode * inode)
        {
                lock_kernel();
                udf_discard_prealloc(inode);
-               /* write the root inode on put, if dirty */
-               if (!inode->i_sb->s_root && inode->i_state & I_DIRTY)
-                       udf_update_inode(inode, IS_SYNC(inode));
                unlock_kernel();
        }
 }
@@ -703,7 +700,6 @@ static void udf_prealloc_extents(struct inode *inode, int c, int lastblock,
 
                if (numalloc)
                {
-                       UDF_I_LENEXTENTS(inode) += numalloc << inode->i_sb->s_blocksize_bits;
                        if (start == (c+1))
                                laarr[start].extLength +=
                                        (numalloc << inode->i_sb->s_blocksize_bits);
@@ -727,7 +723,7 @@ static void udf_prealloc_extents(struct inode *inode, int c, int lastblock,
 
                                if (elen > numalloc)
                                {
-                                       laarr[c+1].extLength -=
+                                       laarr[c].extLength -=
                                                (numalloc << inode->i_sb->s_blocksize_bits);
                                        numalloc = 0;
                                }
@@ -741,6 +737,7 @@ static void udf_prealloc_extents(struct inode *inode, int c, int lastblock,
                                        (*endnum) --;
                                }
                        }
+                       UDF_I_LENEXTENTS(inode) += numalloc << inode->i_sb->s_blocksize_bits;
                }
        }
 }
@@ -1349,6 +1346,7 @@ udf_update_inode(struct inode *inode, int do_sync)
                use->lengthAllocDescs = cpu_to_le32(UDF_I_LENALLOC(inode));
                crclen = sizeof(struct UnallocatedSpaceEntry) + UDF_I_LENALLOC(inode) -
                        sizeof(tag);
+               use->descTag.tagLocation = cpu_to_le32(UDF_I_LOCATION(inode).logicalBlockNum);
                use->descTag.descCRCLength = cpu_to_le16(crclen);
                use->descTag.descCRC = cpu_to_le16(udf_crc((char *)use + sizeof(tag), crclen, 0));
 
index 72878e5334e9aeb8d0e4c7621d1a520ec89dbb19..5ffebd9a486506f9d589daf1609567113e5ffe15 100644 (file)
@@ -41,7 +41,13 @@ static void extent_trunc(struct inode * inode, lb_addr bloc, int extoffset,
 
        if (nelen)
        {
-               neloc = eloc;
+               if (etype == EXTENT_NOT_RECORDED_ALLOCATED)
+               {
+                       udf_free_blocks(inode->i_sb, inode, eloc, 0, last_block);
+                       etype = EXTENT_NOT_RECORDED_NOT_ALLOCATED;
+               }
+               else
+                       neloc = eloc;
                nelen = (etype << 30) | nelen;
        }