btrfs-progs: mkfs: fix regression preventing --rootdir to create file
Commit460e93f257
("btrfs-progs: mkfs: check the status of file at mkfs") will try to check the file state before creating fs on it. The check is mostly fine for normal mkfs case, while for --rootdir option, it's allowed to create a new file if the destination file doesn't exist. Fix it by allowing non-existent file if --rootdir is specified. Fixes:460e93f257
("btrfs-progs: mkfs: check the status of file at mkfs") Signed-off-by: Qu Wenruo <wqu@suse.com> Reviewed-by: Tomohiro Misono <misono.tomohiro@jp.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
1c9c5f7fb3
commit
0855a8cd43
|
@ -720,7 +720,7 @@ int main(int argc, char **argv)
|
|||
u32 stripesize = 4096;
|
||||
int zero_end = 1;
|
||||
int fd = -1;
|
||||
int ret;
|
||||
int ret = 0;
|
||||
int close_ret;
|
||||
int i;
|
||||
int mixed = 0;
|
||||
|
@ -888,7 +888,9 @@ int main(int argc, char **argv)
|
|||
|
||||
while (dev_cnt-- > 0) {
|
||||
file = argv[optind++];
|
||||
if (is_block_device(file) == 1)
|
||||
if (source_dir_set && is_path_exist(file) == 0)
|
||||
ret = 0;
|
||||
else if (is_block_device(file) == 1)
|
||||
ret = test_dev_for_mkfs(file, force_overwrite);
|
||||
else
|
||||
ret = test_status_for_mkfs(file, force_overwrite);
|
||||
|
|
15
utils.c
15
utils.c
|
@ -456,6 +456,21 @@ static int is_reg_file(const char *path)
|
|||
return S_ISREG(statbuf.st_mode);
|
||||
}
|
||||
|
||||
int is_path_exist(const char *path)
|
||||
{
|
||||
struct stat statbuf;
|
||||
int ret;
|
||||
|
||||
ret = stat(path, &statbuf);
|
||||
if (ret < 0) {
|
||||
if (errno == ENOENT)
|
||||
return 0;
|
||||
else
|
||||
return -errno;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* This function checks if the given input parameter is
|
||||
* an uuid or a path
|
||||
|
|
1
utils.h
1
utils.h
|
@ -122,6 +122,7 @@ int set_label(const char *btrfs_dev, const char *label);
|
|||
char *__strncpy_null(char *dest, const char *src, size_t n);
|
||||
int is_block_device(const char *file);
|
||||
int is_mount_point(const char *file);
|
||||
int is_path_exist(const char *file);
|
||||
int check_arg_type(const char *input);
|
||||
int open_path_or_dev_mnt(const char *path, DIR **dirstream, int verbose);
|
||||
int btrfs_open(const char *path, DIR **dirstream, int verbose, int dir_only);
|
||||
|
|
Loading…
Reference in New Issue