r=alex
Replace i_sem with BKL in ext3_fsfilt_write_record
int err, blocksize, csize, boffs;
/* prevent reading after eof */
int err, blocksize, csize, boffs;
/* prevent reading after eof */
if (inode->i_size < *offs + size) {
size = inode->i_size - *offs;
if (inode->i_size < *offs + size) {
size = inode->i_size - *offs;
if (size < 0) {
CERROR("size %llu is too short for read %u@%llu\n",
if (size < 0) {
CERROR("size %llu is too short for read %u@%llu\n",
- inode->i_size, size, *offs);
+ inode->i_size, size, *offs);
+ } else if (size == 0) {
+ }
+ } else {
+ unlock_kernel();
}
blocksize = 1 << inode->i_blkbits;
}
blocksize = 1 << inode->i_blkbits;
blocksize = 1 << inode->i_blkbits;
block_count = (*offs & (blocksize - 1)) + bufsize;
block_count = (block_count + blocksize - 1) >> inode->i_blkbits;
blocksize = 1 << inode->i_blkbits;
block_count = (*offs & (blocksize - 1)) + bufsize;
block_count = (block_count + blocksize - 1) >> inode->i_blkbits;
journal = EXT3_SB(inode->i_sb)->s_journal;
journal = EXT3_SB(inode->i_sb)->s_journal;
handle = journal_start(journal,
block_count * EXT3_DATA_TRANS_BLOCKS + 2);
handle = journal_start(journal,
block_count * EXT3_DATA_TRANS_BLOCKS + 2);
if (IS_ERR(handle)) {
CERROR("can't start transaction\n");
if (IS_ERR(handle)) {
CERROR("can't start transaction\n");
return PTR_ERR(handle);
}
return PTR_ERR(handle);
}
/* correct in-core and on-disk sizes */
if (new_size > inode->i_size) {
/* correct in-core and on-disk sizes */
if (new_size > inode->i_size) {
if (new_size > inode->i_size)
inode->i_size = new_size;
if (inode->i_size > EXT3_I(inode)->i_disksize)
EXT3_I(inode)->i_disksize = inode->i_size;
if (inode->i_size > old_size)
mark_inode_dirty(inode);
if (new_size > inode->i_size)
inode->i_size = new_size;
if (inode->i_size > EXT3_I(inode)->i_disksize)
EXT3_I(inode)->i_disksize = inode->i_size;
if (inode->i_size > old_size)
mark_inode_dirty(inode);
if (err == 0)
*offs = offset;
if (err == 0)
*offs = offset;