|
@@ -301,10 +301,9 @@ static int udf_get_block(struct inode *inode, sector_t block,
|
|
err = -EIO;
|
|
err = -EIO;
|
|
new = 0;
|
|
new = 0;
|
|
bh = NULL;
|
|
bh = NULL;
|
|
-
|
|
|
|
- lock_kernel();
|
|
|
|
-
|
|
|
|
iinfo = UDF_I(inode);
|
|
iinfo = UDF_I(inode);
|
|
|
|
+
|
|
|
|
+ down_write(&iinfo->i_data_sem);
|
|
if (block == iinfo->i_next_alloc_block + 1) {
|
|
if (block == iinfo->i_next_alloc_block + 1) {
|
|
iinfo->i_next_alloc_block++;
|
|
iinfo->i_next_alloc_block++;
|
|
iinfo->i_next_alloc_goal++;
|
|
iinfo->i_next_alloc_goal++;
|
|
@@ -323,7 +322,7 @@ static int udf_get_block(struct inode *inode, sector_t block,
|
|
map_bh(bh_result, inode->i_sb, phys);
|
|
map_bh(bh_result, inode->i_sb, phys);
|
|
|
|
|
|
abort:
|
|
abort:
|
|
- unlock_kernel();
|
|
|
|
|
|
+ up_write(&iinfo->i_data_sem);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1021,16 +1020,16 @@ void udf_truncate(struct inode *inode)
|
|
if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
|
|
if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
|
|
return;
|
|
return;
|
|
|
|
|
|
- lock_kernel();
|
|
|
|
iinfo = UDF_I(inode);
|
|
iinfo = UDF_I(inode);
|
|
if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) {
|
|
if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) {
|
|
|
|
+ down_write(&iinfo->i_data_sem);
|
|
if (inode->i_sb->s_blocksize <
|
|
if (inode->i_sb->s_blocksize <
|
|
(udf_file_entry_alloc_offset(inode) +
|
|
(udf_file_entry_alloc_offset(inode) +
|
|
inode->i_size)) {
|
|
inode->i_size)) {
|
|
udf_expand_file_adinicb(inode, inode->i_size, &err);
|
|
udf_expand_file_adinicb(inode, inode->i_size, &err);
|
|
if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) {
|
|
if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) {
|
|
inode->i_size = iinfo->i_lenAlloc;
|
|
inode->i_size = iinfo->i_lenAlloc;
|
|
- unlock_kernel();
|
|
|
|
|
|
+ up_write(&iinfo->i_data_sem);
|
|
return;
|
|
return;
|
|
} else
|
|
} else
|
|
udf_truncate_extents(inode);
|
|
udf_truncate_extents(inode);
|
|
@@ -1041,10 +1040,13 @@ void udf_truncate(struct inode *inode)
|
|
offset - udf_file_entry_alloc_offset(inode));
|
|
offset - udf_file_entry_alloc_offset(inode));
|
|
iinfo->i_lenAlloc = inode->i_size;
|
|
iinfo->i_lenAlloc = inode->i_size;
|
|
}
|
|
}
|
|
|
|
+ up_write(&iinfo->i_data_sem);
|
|
} else {
|
|
} else {
|
|
block_truncate_page(inode->i_mapping, inode->i_size,
|
|
block_truncate_page(inode->i_mapping, inode->i_size,
|
|
udf_get_block);
|
|
udf_get_block);
|
|
|
|
+ down_write(&iinfo->i_data_sem);
|
|
udf_truncate_extents(inode);
|
|
udf_truncate_extents(inode);
|
|
|
|
+ up_write(&iinfo->i_data_sem);
|
|
}
|
|
}
|
|
|
|
|
|
inode->i_mtime = inode->i_ctime = current_fs_time(inode->i_sb);
|
|
inode->i_mtime = inode->i_ctime = current_fs_time(inode->i_sb);
|
|
@@ -1052,7 +1054,6 @@ void udf_truncate(struct inode *inode)
|
|
udf_sync_inode(inode);
|
|
udf_sync_inode(inode);
|
|
else
|
|
else
|
|
mark_inode_dirty(inode);
|
|
mark_inode_dirty(inode);
|
|
- unlock_kernel();
|
|
|
|
}
|
|
}
|
|
|
|
|
|
static void __udf_read_inode(struct inode *inode)
|
|
static void __udf_read_inode(struct inode *inode)
|
|
@@ -2043,7 +2044,7 @@ long udf_block_map(struct inode *inode, sector_t block)
|
|
struct extent_position epos = {};
|
|
struct extent_position epos = {};
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
- lock_kernel();
|
|
|
|
|
|
+ down_read(&UDF_I(inode)->i_data_sem);
|
|
|
|
|
|
if (inode_bmap(inode, block, &epos, &eloc, &elen, &offset) ==
|
|
if (inode_bmap(inode, block, &epos, &eloc, &elen, &offset) ==
|
|
(EXT_RECORDED_ALLOCATED >> 30))
|
|
(EXT_RECORDED_ALLOCATED >> 30))
|
|
@@ -2051,7 +2052,7 @@ long udf_block_map(struct inode *inode, sector_t block)
|
|
else
|
|
else
|
|
ret = 0;
|
|
ret = 0;
|
|
|
|
|
|
- unlock_kernel();
|
|
|
|
|
|
+ up_read(&UDF_I(inode)->i_data_sem);
|
|
brelse(epos.bh);
|
|
brelse(epos.bh);
|
|
|
|
|
|
if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_VARCONV))
|
|
if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_VARCONV))
|