diff options
| -rw-r--r-- | fs/udf/file.c | 32 | ||||
| -rw-r--r-- | fs/udf/inode.c | 8 | ||||
| -rw-r--r-- | fs/udf/truncate.c | 8 |
3 files changed, 38 insertions, 10 deletions
diff --git a/fs/udf/file.c b/fs/udf/file.c index 72ce8252793f..e6fdea847c4b 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c @@ -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 = { diff --git a/fs/udf/inode.c b/fs/udf/inode.c index 9d7cc260dfb7..93f842967cf6 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c @@ -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)); diff --git a/fs/udf/truncate.c b/fs/udf/truncate.c index 72878e5334e9..5ffebd9a4865 100644 --- a/fs/udf/truncate.c +++ b/fs/udf/truncate.c @@ -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; } |
