struct buffer_head *bh;
int block;
char *kaddr;
+ int err = 0;
if (!PageLocked(page))
PAGE_BUG(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)
struct buffer_head *bh;
int block;
char *kaddr;
+ int err = 0;
if (!PageLocked(page))
PAGE_BUG(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)
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 = {
{
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();
}
}
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);
if (elen > numalloc)
{
- laarr[c+1].extLength -=
+ laarr[c].extLength -=
(numalloc << inode->i_sb->s_blocksize_bits);
numalloc = 0;
}
(*endnum) --;
}
}
+ UDF_I_LENEXTENTS(inode) += numalloc << inode->i_sb->s_blocksize_bits;
}
}
}
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));
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;
}