Commit 80942521 authored by Jan Kara's avatar Jan Kara

udf: Add flag to disable block preallocation

In some cases we don't want to create block preallocation when
allocating blocks. Add a flag to udf_map_rq controlling the behavior.
Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent b3c03fce
...@@ -322,7 +322,8 @@ int udf_expand_file_adinicb(struct inode *inode) ...@@ -322,7 +322,8 @@ int udf_expand_file_adinicb(struct inode *inode)
return err; return err;
} }
#define UDF_MAP_CREATE 0x01 /* Mapping can allocate new blocks */ #define UDF_MAP_CREATE 0x01 /* Mapping can allocate new blocks */
#define UDF_MAP_NOPREALLOC 0x02 /* Do not preallocate blocks */
#define UDF_BLK_MAPPED 0x01 /* Block was successfully mapped */ #define UDF_BLK_MAPPED 0x01 /* Block was successfully mapped */
#define UDF_BLK_NEW 0x02 /* Block was freshly allocated */ #define UDF_BLK_NEW 0x02 /* Block was freshly allocated */
...@@ -381,6 +382,14 @@ static int udf_get_block(struct inode *inode, sector_t block, ...@@ -381,6 +382,14 @@ static int udf_get_block(struct inode *inode, sector_t block,
.iflags = create ? UDF_MAP_CREATE : 0, .iflags = create ? UDF_MAP_CREATE : 0,
}; };
/*
* We preallocate blocks only for regular files. It also makes sense
* for directories but there's a problem when to drop the
* preallocation. We might use some delayed work for that but I feel
* it's overengineering for a filesystem like UDF.
*/
if (!S_ISREG(inode->i_mode))
map.iflags |= UDF_MAP_NOPREALLOC;
err = udf_map_block(inode, &map); err = udf_map_block(inode, &map);
if (err < 0) if (err < 0)
return err; return err;
...@@ -808,11 +817,7 @@ static int inode_getblk(struct inode *inode, struct udf_map_rq *map) ...@@ -808,11 +817,7 @@ static int inode_getblk(struct inode *inode, struct udf_map_rq *map)
* block */ * block */
udf_split_extents(inode, &c, offset, newblocknum, laarr, &endnum); udf_split_extents(inode, &c, offset, newblocknum, laarr, &endnum);
/* We preallocate blocks only for regular files. It also makes sense if (!(map->iflags & UDF_MAP_NOPREALLOC))
* for directories but there's a problem when to drop the
* preallocation. We might use some delayed work for that but I feel
* it's overengineering for a filesystem like UDF. */
if (S_ISREG(inode->i_mode))
udf_prealloc_extents(inode, c, lastblock, laarr, &endnum); udf_prealloc_extents(inode, c, lastblock, laarr, &endnum);
/* merge any continuous blocks in laarr */ /* merge any continuous blocks in laarr */
......
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