summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Documentation/btrfs-convert.asciidoc3
-rw-r--r--btrfs-convert.c15
2 files changed, 18 insertions, 0 deletions
diff --git a/Documentation/btrfs-convert.asciidoc b/Documentation/btrfs-convert.asciidoc
index ecc157cd..cbc1c730 100644
--- a/Documentation/btrfs-convert.asciidoc
+++ b/Documentation/btrfs-convert.asciidoc
@@ -33,6 +33,9 @@ have supported data block size (ie. the same that would be valid for
'mkfs.btrfs'). This is typically the system page size (4KiB on x86_64
machines).
+NOTE: The source filesystem should be clean, you are encouraged to run the
+'fsck' tool if you're not sure.
+
**REMOVE THE ORIGINAL FILESYSTEM METADATA**
By removing the 'ext2_saved' subvolume, all metadata of the original filesystem
diff --git a/btrfs-convert.c b/btrfs-convert.c
index 727bfea1..a62d2f01 100644
--- a/btrfs-convert.c
+++ b/btrfs-convert.c
@@ -2183,6 +2183,17 @@ static void ext2_copy_inode_item(struct btrfs_inode_item *dst,
}
memset(&dst->reserved, 0, sizeof(dst->reserved));
}
+static int check_filesystem_state(struct btrfs_convert_context *cctx)
+{
+ ext2_filsys fs = cctx->fs_data;
+
+ if (!(fs->super->s_state & EXT2_VALID_FS))
+ return 1;
+ else if (fs->super->s_state & EXT2_ERROR_FS)
+ return 1;
+ else
+ return 0;
+}
/*
* copy a single inode. do all the required works, such as cloning
@@ -2352,6 +2363,10 @@ static int do_convert(const char *devname, int datacsum, int packing,
ret = convert_open_fs(devname, &cctx);
if (ret)
goto fail;
+ ret = check_filesystem_state(&cctx);
+ if (ret)
+ warning(
+ "source filesystem is not clean, running filesystem check is recommended");
ret = convert_read_used_space(&cctx);
if (ret)
goto fail;