Commit fd4287db authored by Jan Kara's avatar Jan Kara

udf: Fix handling of i_blocks

Commit 36350462 removed unused quota support from UDF. As an unfortunate
sideeffect it also removed updates of i_blocks so all files had i_block == 0.
Fix the problem by returning updates of file space back to UDF allocation and
freeing functions.
Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent bf097aaf
...@@ -105,7 +105,6 @@ static void udf_add_free_space(struct super_block *sb, u16 partition, u32 cnt) ...@@ -105,7 +105,6 @@ static void udf_add_free_space(struct super_block *sb, u16 partition, u32 cnt)
} }
static void udf_bitmap_free_blocks(struct super_block *sb, static void udf_bitmap_free_blocks(struct super_block *sb,
struct inode *inode,
struct udf_bitmap *bitmap, struct udf_bitmap *bitmap,
struct kernel_lb_addr *bloc, struct kernel_lb_addr *bloc,
uint32_t offset, uint32_t offset,
...@@ -172,7 +171,6 @@ static void udf_bitmap_free_blocks(struct super_block *sb, ...@@ -172,7 +171,6 @@ static void udf_bitmap_free_blocks(struct super_block *sb,
} }
static int udf_bitmap_prealloc_blocks(struct super_block *sb, static int udf_bitmap_prealloc_blocks(struct super_block *sb,
struct inode *inode,
struct udf_bitmap *bitmap, struct udf_bitmap *bitmap,
uint16_t partition, uint32_t first_block, uint16_t partition, uint32_t first_block,
uint32_t block_count) uint32_t block_count)
...@@ -223,7 +221,6 @@ static int udf_bitmap_prealloc_blocks(struct super_block *sb, ...@@ -223,7 +221,6 @@ static int udf_bitmap_prealloc_blocks(struct super_block *sb,
} }
static int udf_bitmap_new_block(struct super_block *sb, static int udf_bitmap_new_block(struct super_block *sb,
struct inode *inode,
struct udf_bitmap *bitmap, uint16_t partition, struct udf_bitmap *bitmap, uint16_t partition,
uint32_t goal, int *err) uint32_t goal, int *err)
{ {
...@@ -349,7 +346,6 @@ static int udf_bitmap_new_block(struct super_block *sb, ...@@ -349,7 +346,6 @@ static int udf_bitmap_new_block(struct super_block *sb,
} }
static void udf_table_free_blocks(struct super_block *sb, static void udf_table_free_blocks(struct super_block *sb,
struct inode *inode,
struct inode *table, struct inode *table,
struct kernel_lb_addr *bloc, struct kernel_lb_addr *bloc,
uint32_t offset, uint32_t offset,
...@@ -581,7 +577,6 @@ static void udf_table_free_blocks(struct super_block *sb, ...@@ -581,7 +577,6 @@ static void udf_table_free_blocks(struct super_block *sb,
} }
static int udf_table_prealloc_blocks(struct super_block *sb, static int udf_table_prealloc_blocks(struct super_block *sb,
struct inode *inode,
struct inode *table, uint16_t partition, struct inode *table, uint16_t partition,
uint32_t first_block, uint32_t block_count) uint32_t first_block, uint32_t block_count)
{ {
...@@ -643,7 +638,6 @@ static int udf_table_prealloc_blocks(struct super_block *sb, ...@@ -643,7 +638,6 @@ static int udf_table_prealloc_blocks(struct super_block *sb,
} }
static int udf_table_new_block(struct super_block *sb, static int udf_table_new_block(struct super_block *sb,
struct inode *inode,
struct inode *table, uint16_t partition, struct inode *table, uint16_t partition,
uint32_t goal, int *err) uint32_t goal, int *err)
{ {
...@@ -743,18 +737,23 @@ void udf_free_blocks(struct super_block *sb, struct inode *inode, ...@@ -743,18 +737,23 @@ void udf_free_blocks(struct super_block *sb, struct inode *inode,
struct udf_part_map *map = &UDF_SB(sb)->s_partmaps[partition]; struct udf_part_map *map = &UDF_SB(sb)->s_partmaps[partition];
if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP) { if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP) {
udf_bitmap_free_blocks(sb, inode, map->s_uspace.s_bitmap, udf_bitmap_free_blocks(sb, map->s_uspace.s_bitmap,
bloc, offset, count); bloc, offset, count);
} else if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE) { } else if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE) {
udf_table_free_blocks(sb, inode, map->s_uspace.s_table, udf_table_free_blocks(sb, map->s_uspace.s_table,
bloc, offset, count); bloc, offset, count);
} else if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP) { } else if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP) {
udf_bitmap_free_blocks(sb, inode, map->s_fspace.s_bitmap, udf_bitmap_free_blocks(sb, map->s_fspace.s_bitmap,
bloc, offset, count); bloc, offset, count);
} else if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE) { } else if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE) {
udf_table_free_blocks(sb, inode, map->s_fspace.s_table, udf_table_free_blocks(sb, map->s_fspace.s_table,
bloc, offset, count); bloc, offset, count);
} }
if (inode) {
inode_sub_bytes(inode,
((sector_t)count) << sb->s_blocksize_bits);
}
} }
inline int udf_prealloc_blocks(struct super_block *sb, inline int udf_prealloc_blocks(struct super_block *sb,
...@@ -763,29 +762,34 @@ inline int udf_prealloc_blocks(struct super_block *sb, ...@@ -763,29 +762,34 @@ inline int udf_prealloc_blocks(struct super_block *sb,
uint32_t block_count) uint32_t block_count)
{ {
struct udf_part_map *map = &UDF_SB(sb)->s_partmaps[partition]; struct udf_part_map *map = &UDF_SB(sb)->s_partmaps[partition];
sector_t allocated;
if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP) if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP)
return udf_bitmap_prealloc_blocks(sb, inode, allocated = udf_bitmap_prealloc_blocks(sb,
map->s_uspace.s_bitmap, map->s_uspace.s_bitmap,
partition, first_block, partition, first_block,
block_count); block_count);
else if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE) else if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE)
return udf_table_prealloc_blocks(sb, inode, allocated = udf_table_prealloc_blocks(sb,
map->s_uspace.s_table, map->s_uspace.s_table,
partition, first_block, partition, first_block,
block_count); block_count);
else if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP) else if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP)
return udf_bitmap_prealloc_blocks(sb, inode, allocated = udf_bitmap_prealloc_blocks(sb,
map->s_fspace.s_bitmap, map->s_fspace.s_bitmap,
partition, first_block, partition, first_block,
block_count); block_count);
else if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE) else if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE)
return udf_table_prealloc_blocks(sb, inode, allocated = udf_table_prealloc_blocks(sb,
map->s_fspace.s_table, map->s_fspace.s_table,
partition, first_block, partition, first_block,
block_count); block_count);
else else
return 0; return 0;
if (inode && allocated > 0)
inode_add_bytes(inode, allocated << sb->s_blocksize_bits);
return allocated;
} }
inline int udf_new_block(struct super_block *sb, inline int udf_new_block(struct super_block *sb,
...@@ -793,25 +797,29 @@ inline int udf_new_block(struct super_block *sb, ...@@ -793,25 +797,29 @@ inline int udf_new_block(struct super_block *sb,
uint16_t partition, uint32_t goal, int *err) uint16_t partition, uint32_t goal, int *err)
{ {
struct udf_part_map *map = &UDF_SB(sb)->s_partmaps[partition]; struct udf_part_map *map = &UDF_SB(sb)->s_partmaps[partition];
int block;
if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP) if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP)
return udf_bitmap_new_block(sb, inode, block = udf_bitmap_new_block(sb,
map->s_uspace.s_bitmap, map->s_uspace.s_bitmap,
partition, goal, err); partition, goal, err);
else if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE) else if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE)
return udf_table_new_block(sb, inode, block = udf_table_new_block(sb,
map->s_uspace.s_table, map->s_uspace.s_table,
partition, goal, err);
else if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP)
return udf_bitmap_new_block(sb, inode,
map->s_fspace.s_bitmap,
partition, goal, err); partition, goal, err);
else if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP)
block = udf_bitmap_new_block(sb,
map->s_fspace.s_bitmap,
partition, goal, err);
else if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE) else if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE)
return udf_table_new_block(sb, inode, block = udf_table_new_block(sb,
map->s_fspace.s_table, map->s_fspace.s_table,
partition, goal, err); partition, goal, err);
else { else {
*err = -EIO; *err = -EIO;
return 0; return 0;
} }
if (inode && block)
inode_add_bytes(inode, sb->s_blocksize);
return block;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment