udf: Add flag to disable block preallocation
authorJan Kara <jack@suse.cz>
Wed, 18 Jan 2023 14:18:41 +0000 (15:18 +0100)
committerJan Kara <jack@suse.cz>
Thu, 26 Jan 2023 15:46:33 +0000 (16:46 +0100)
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: Jan Kara <jack@suse.cz>
fs/udf/inode.c

index 31088e9..1a6627c 100644 (file)
@@ -322,7 +322,8 @@ int udf_expand_file_adinicb(struct inode *inode)
        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_NEW    0x02    /* Block was freshly allocated */
@@ -381,6 +382,14 @@ static int udf_get_block(struct inode *inode, sector_t block,
                .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);
        if (err < 0)
                return err;
@@ -808,11 +817,7 @@ static int inode_getblk(struct inode *inode, struct udf_map_rq *map)
         * block */
        udf_split_extents(inode, &c, offset, newblocknum, laarr, &endnum);
 
-       /* 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))
+       if (!(map->iflags & UDF_MAP_NOPREALLOC))
                udf_prealloc_extents(inode, c, lastblock, laarr, &endnum);
 
        /* merge any continuous blocks in laarr */