All of lore.kernel.org
 help / color / mirror / Atom feed
* [f2fs-dev] [PATCH 1/2] libf2fs: Accept Sparse files with non 4K Blocksize
@ 2024-01-26 22:18 Daniel Rosenberg via Linux-f2fs-devel
  2024-01-26 22:18 ` [f2fs-dev] [PATCH 2/2] libf2fs: Fix possible memleak with Sparse Files Daniel Rosenberg via Linux-f2fs-devel
  2024-01-29 20:14 ` [f2fs-dev] [PATCH 1/2] libf2fs: Accept Sparse files with non 4K Blocksize Jaegeuk Kim
  0 siblings, 2 replies; 3+ messages in thread
From: Daniel Rosenberg via Linux-f2fs-devel @ 2024-01-26 22:18 UTC (permalink / raw)
  To: linux-f2fs-devel; +Cc: Jaegeuk Kim, kernel-team, Daniel Rosenberg

Since we may not know the block size when initializing sparse files, we
should assume that the sparse file's blocksize is correct.

Signed-off-by: Daniel Rosenberg <drosen@google.com>
---
 fsck/mount.c     | 20 +++++++++++++-------
 lib/libf2fs_io.c | 11 +++++++----
 2 files changed, 20 insertions(+), 11 deletions(-)

diff --git a/fsck/mount.c b/fsck/mount.c
index 30c6228..7bbec3f 100644
--- a/fsck/mount.c
+++ b/fsck/mount.c
@@ -995,6 +995,10 @@ int sanity_check_raw_super(struct f2fs_super_block *sb, enum SB_ADDR sb_addr)
 		return -1;
 
 	blocksize = 1 << get_sb(log_blocksize);
+	if (c.sparse_mode && F2FS_BLKSIZE != blocksize) {
+		MSG(0, "Invalid blocksize (%u), does not equal sparse file blocksize (%u)",
+			F2FS_BLKSIZE);
+	}
 	if (blocksize < F2FS_MIN_BLKSIZE || blocksize > F2FS_MAX_BLKSIZE) {
 		MSG(0, "Invalid blocksize (%u), must be between 4KB and 16KB\n",
 			blocksize);
@@ -3965,20 +3969,22 @@ int f2fs_do_mount(struct f2fs_sb_info *sbi)
 	sbi->active_logs = NR_CURSEG_TYPE;
 	ret = validate_super_block(sbi, SB0_ADDR);
 	if (ret) {
-		/* Assuming 4K Block Size */
-		c.blksize_bits = 12;
-		c.blksize = 1 << c.blksize_bits;
-		MSG(0, "Looking for secondary superblock assuming 4K Block Size\n");
+		if (!c.sparse_mode) {
+			/* Assuming 4K Block Size */
+			c.blksize_bits = 12;
+			c.blksize = 1 << c.blksize_bits;
+			MSG(0, "Looking for secondary superblock assuming 4K Block Size\n");
+		}
 		ret = validate_super_block(sbi, SB1_ADDR);
-		if (ret) {
+		if (ret && !c.sparse_mode) {
 			/* Trying 16K Block Size */
 			c.blksize_bits = 14;
 			c.blksize = 1 << c.blksize_bits;
 			MSG(0, "Looking for secondary superblock assuming 16K Block Size\n");
 			ret = validate_super_block(sbi, SB1_ADDR);
-			if (ret)
-				return -1;
 		}
+		if (ret)
+			return -1;
 	}
 	sb = F2FS_RAW_SUPER(sbi);
 	c.cache_config.num_cache_entry = num_cache_entry;
diff --git a/lib/libf2fs_io.c b/lib/libf2fs_io.c
index d76da83..97c91ef 100644
--- a/lib/libf2fs_io.c
+++ b/lib/libf2fs_io.c
@@ -662,14 +662,17 @@ int f2fs_init_sparse_file(void)
 		if (!f2fs_sparse_file)
 			return -1;
 
+		c.blksize = sparse_file_block_size(f2fs_sparse_file);
+		c.blksize_bits = log_base_2(c.blksize);
+		if (c.blksize_bits == -1) {
+			MSG(0, "\tError: Sparse file blocksize not a power of 2.\n");
+			return -1;
+		}
+
 		c.device_size = sparse_file_len(f2fs_sparse_file, 0, 0);
 		c.device_size &= (~((uint64_t)(F2FS_BLKSIZE - 1)));
 	}
 
-	if (sparse_file_block_size(f2fs_sparse_file) != F2FS_BLKSIZE) {
-		MSG(0, "\tError: Corrupted sparse file\n");
-		return -1;
-	}
 	blocks_count = c.device_size / F2FS_BLKSIZE;
 	blocks = calloc(blocks_count, sizeof(char *));
 	if (!blocks) {

base-commit: bf5100606d63f6928799846b7322aa6f3f158bcf
-- 
2.43.0.429.g432eaa2c6b-goog



_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [f2fs-dev] [PATCH 2/2] libf2fs: Fix possible memleak with Sparse Files
  2024-01-26 22:18 [f2fs-dev] [PATCH 1/2] libf2fs: Accept Sparse files with non 4K Blocksize Daniel Rosenberg via Linux-f2fs-devel
@ 2024-01-26 22:18 ` Daniel Rosenberg via Linux-f2fs-devel
  2024-01-29 20:14 ` [f2fs-dev] [PATCH 1/2] libf2fs: Accept Sparse files with non 4K Blocksize Jaegeuk Kim
  1 sibling, 0 replies; 3+ messages in thread
From: Daniel Rosenberg via Linux-f2fs-devel @ 2024-01-26 22:18 UTC (permalink / raw)
  To: linux-f2fs-devel; +Cc: Jaegeuk Kim, kernel-team, Daniel Rosenberg

If sparse files is set along with multiple devices, we initialize
sparse file data multiple times without freeing the previously allocated
data. This skips the initialization for subsequent devices, as sparse
file mode currently only deals with device 0 anyways.

Signed-off-by: Daniel Rosenberg <drosen@google.com>
---
 lib/libf2fs.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/libf2fs.c b/lib/libf2fs.c
index 2451201..13f2b07 100644
--- a/lib/libf2fs.c
+++ b/lib/libf2fs.c
@@ -974,7 +974,7 @@ int get_device_info(int i)
 
 	dev->fd = fd;
 
-	if (c.sparse_mode) {
+	if (c.sparse_mode && i == 0) {
 		if (f2fs_init_sparse_file()) {
 			free(stat_buf);
 			return -1;
@@ -1221,7 +1221,7 @@ int get_device_info(int i)
 	c.sectors_per_blk = F2FS_BLKSIZE / c.sector_size;
 	c.total_sectors += dev->total_sectors;
 
-	if (c.sparse_mode && f2fs_init_sparse_file())
+	if (c.sparse_mode && i==0 && f2fs_init_sparse_file())
 		return -1;
 	return 0;
 }
-- 
2.43.0.429.g432eaa2c6b-goog



_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [f2fs-dev] [PATCH 1/2] libf2fs: Accept Sparse files with non 4K Blocksize
  2024-01-26 22:18 [f2fs-dev] [PATCH 1/2] libf2fs: Accept Sparse files with non 4K Blocksize Daniel Rosenberg via Linux-f2fs-devel
  2024-01-26 22:18 ` [f2fs-dev] [PATCH 2/2] libf2fs: Fix possible memleak with Sparse Files Daniel Rosenberg via Linux-f2fs-devel
@ 2024-01-29 20:14 ` Jaegeuk Kim
  1 sibling, 0 replies; 3+ messages in thread
From: Jaegeuk Kim @ 2024-01-29 20:14 UTC (permalink / raw)
  To: Daniel Rosenberg; +Cc: kernel-team, linux-f2fs-devel

On 01/26, Daniel Rosenberg wrote:
> Since we may not know the block size when initializing sparse files, we
> should assume that the sparse file's blocksize is correct.
> 
> Signed-off-by: Daniel Rosenberg <drosen@google.com>
> ---
>  fsck/mount.c     | 20 +++++++++++++-------
>  lib/libf2fs_io.c | 11 +++++++----
>  2 files changed, 20 insertions(+), 11 deletions(-)
> 
> diff --git a/fsck/mount.c b/fsck/mount.c
> index 30c6228..7bbec3f 100644
> --- a/fsck/mount.c
> +++ b/fsck/mount.c
> @@ -995,6 +995,10 @@ int sanity_check_raw_super(struct f2fs_super_block *sb, enum SB_ADDR sb_addr)
>  		return -1;
>  
>  	blocksize = 1 << get_sb(log_blocksize);
> +	if (c.sparse_mode && F2FS_BLKSIZE != blocksize) {
> +		MSG(0, "Invalid blocksize (%u), does not equal sparse file blocksize (%u)",
> +			F2FS_BLKSIZE);

Applied with the below fix.
--- a/fsck/mount.c
+++ b/fsck/mount.c
@@ -997,7 +997,7 @@ int sanity_check_raw_super(struct f2fs_super_block *sb, enum SB_ADDR sb_addr)
        blocksize = 1 << get_sb(log_blocksize);
        if (c.sparse_mode && F2FS_BLKSIZE != blocksize) {
                MSG(0, "Invalid blocksize (%u), does not equal sparse file blocksize (%u)",
-                       F2FS_BLKSIZE);
+                       F2FS_BLKSIZE, blocksize);
        }


> +	}
>  	if (blocksize < F2FS_MIN_BLKSIZE || blocksize > F2FS_MAX_BLKSIZE) {
>  		MSG(0, "Invalid blocksize (%u), must be between 4KB and 16KB\n",
>  			blocksize);
> @@ -3965,20 +3969,22 @@ int f2fs_do_mount(struct f2fs_sb_info *sbi)
>  	sbi->active_logs = NR_CURSEG_TYPE;
>  	ret = validate_super_block(sbi, SB0_ADDR);
>  	if (ret) {
> -		/* Assuming 4K Block Size */
> -		c.blksize_bits = 12;
> -		c.blksize = 1 << c.blksize_bits;
> -		MSG(0, "Looking for secondary superblock assuming 4K Block Size\n");
> +		if (!c.sparse_mode) {
> +			/* Assuming 4K Block Size */
> +			c.blksize_bits = 12;
> +			c.blksize = 1 << c.blksize_bits;
> +			MSG(0, "Looking for secondary superblock assuming 4K Block Size\n");
> +		}
>  		ret = validate_super_block(sbi, SB1_ADDR);
> -		if (ret) {
> +		if (ret && !c.sparse_mode) {
>  			/* Trying 16K Block Size */
>  			c.blksize_bits = 14;
>  			c.blksize = 1 << c.blksize_bits;
>  			MSG(0, "Looking for secondary superblock assuming 16K Block Size\n");
>  			ret = validate_super_block(sbi, SB1_ADDR);
> -			if (ret)
> -				return -1;
>  		}
> +		if (ret)
> +			return -1;
>  	}
>  	sb = F2FS_RAW_SUPER(sbi);
>  	c.cache_config.num_cache_entry = num_cache_entry;
> diff --git a/lib/libf2fs_io.c b/lib/libf2fs_io.c
> index d76da83..97c91ef 100644
> --- a/lib/libf2fs_io.c
> +++ b/lib/libf2fs_io.c
> @@ -662,14 +662,17 @@ int f2fs_init_sparse_file(void)
>  		if (!f2fs_sparse_file)
>  			return -1;
>  
> +		c.blksize = sparse_file_block_size(f2fs_sparse_file);
> +		c.blksize_bits = log_base_2(c.blksize);
> +		if (c.blksize_bits == -1) {
> +			MSG(0, "\tError: Sparse file blocksize not a power of 2.\n");
> +			return -1;
> +		}
> +
>  		c.device_size = sparse_file_len(f2fs_sparse_file, 0, 0);
>  		c.device_size &= (~((uint64_t)(F2FS_BLKSIZE - 1)));
>  	}
>  
> -	if (sparse_file_block_size(f2fs_sparse_file) != F2FS_BLKSIZE) {
> -		MSG(0, "\tError: Corrupted sparse file\n");
> -		return -1;
> -	}
>  	blocks_count = c.device_size / F2FS_BLKSIZE;
>  	blocks = calloc(blocks_count, sizeof(char *));
>  	if (!blocks) {
> 
> base-commit: bf5100606d63f6928799846b7322aa6f3f158bcf
> -- 
> 2.43.0.429.g432eaa2c6b-goog


_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2024-01-29 20:15 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-01-26 22:18 [f2fs-dev] [PATCH 1/2] libf2fs: Accept Sparse files with non 4K Blocksize Daniel Rosenberg via Linux-f2fs-devel
2024-01-26 22:18 ` [f2fs-dev] [PATCH 2/2] libf2fs: Fix possible memleak with Sparse Files Daniel Rosenberg via Linux-f2fs-devel
2024-01-29 20:14 ` [f2fs-dev] [PATCH 1/2] libf2fs: Accept Sparse files with non 4K Blocksize Jaegeuk Kim

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.