mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +03:00
devices: refactor recursive dir create
Make recursive directory path creation reusable via dir_create_recursive. While we already have dm_create_dir() - it's not taking mode arg, so let's make lvm's internal file helper function.
This commit is contained in:
parent
c534cf3bca
commit
4f936f2312
@ -457,55 +457,12 @@ bad:
|
|||||||
|
|
||||||
void online_dir_setup(struct cmd_context *cmd)
|
void online_dir_setup(struct cmd_context *cmd)
|
||||||
{
|
{
|
||||||
struct stat st;
|
if (!dir_create_recursive(PVS_ONLINE_DIR, 0755))
|
||||||
int rv;
|
stack;
|
||||||
|
if (!dir_create_recursive(VGS_ONLINE_DIR, 0755))
|
||||||
if (!stat(DEFAULT_RUN_DIR, &st))
|
stack;
|
||||||
goto do_pvs;
|
if (!dir_create_recursive(PVS_LOOKUP_DIR, 0755))
|
||||||
|
stack;
|
||||||
log_debug("Creating run_dir.");
|
|
||||||
dm_prepare_selinux_context(DEFAULT_RUN_DIR, S_IFDIR);
|
|
||||||
rv = mkdir(DEFAULT_RUN_DIR, 0755);
|
|
||||||
dm_prepare_selinux_context(NULL, 0);
|
|
||||||
|
|
||||||
if ((rv < 0) && stat(DEFAULT_RUN_DIR, &st))
|
|
||||||
log_error_pvscan(cmd, "Failed to create %s %d", DEFAULT_RUN_DIR, errno);
|
|
||||||
|
|
||||||
do_pvs:
|
|
||||||
if (!stat(PVS_ONLINE_DIR, &st))
|
|
||||||
goto do_vgs;
|
|
||||||
|
|
||||||
log_debug("Creating pvs_online_dir.");
|
|
||||||
dm_prepare_selinux_context(PVS_ONLINE_DIR, S_IFDIR);
|
|
||||||
rv = mkdir(PVS_ONLINE_DIR, 0755);
|
|
||||||
dm_prepare_selinux_context(NULL, 0);
|
|
||||||
|
|
||||||
if ((rv < 0) && stat(PVS_ONLINE_DIR, &st))
|
|
||||||
log_error_pvscan(cmd, "Failed to create %s %d", PVS_ONLINE_DIR, errno);
|
|
||||||
|
|
||||||
do_vgs:
|
|
||||||
if (!stat(VGS_ONLINE_DIR, &st))
|
|
||||||
goto do_lookup;
|
|
||||||
|
|
||||||
log_debug("Creating vgs_online_dir.");
|
|
||||||
dm_prepare_selinux_context(VGS_ONLINE_DIR, S_IFDIR);
|
|
||||||
rv = mkdir(VGS_ONLINE_DIR, 0755);
|
|
||||||
dm_prepare_selinux_context(NULL, 0);
|
|
||||||
|
|
||||||
if ((rv < 0) && stat(VGS_ONLINE_DIR, &st))
|
|
||||||
log_error_pvscan(cmd, "Failed to create %s %d", VGS_ONLINE_DIR, errno);
|
|
||||||
|
|
||||||
do_lookup:
|
|
||||||
if (!stat(PVS_LOOKUP_DIR, &st))
|
|
||||||
return;
|
|
||||||
|
|
||||||
log_debug("Creating pvs_lookup_dir.");
|
|
||||||
dm_prepare_selinux_context(PVS_LOOKUP_DIR, S_IFDIR);
|
|
||||||
rv = mkdir(PVS_LOOKUP_DIR, 0755);
|
|
||||||
dm_prepare_selinux_context(NULL, 0);
|
|
||||||
|
|
||||||
if ((rv < 0) && stat(PVS_LOOKUP_DIR, &st))
|
|
||||||
log_error_pvscan(cmd, "Failed to create %s %d", PVS_LOOKUP_DIR, errno);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void online_lookup_file_remove(const char *vgname)
|
void online_lookup_file_remove(const char *vgname)
|
||||||
|
@ -141,6 +141,57 @@ int dir_exists(const char *path)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int dir_create(const char *path, int mode)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
|
||||||
|
log_debug("Creating directory %s.", path);
|
||||||
|
|
||||||
|
dm_prepare_selinux_context(path, S_IFDIR);
|
||||||
|
r = mkdir(path, mode);
|
||||||
|
dm_prepare_selinux_context(NULL, 0);
|
||||||
|
|
||||||
|
if (r == 0)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if (errno == EEXIST) {
|
||||||
|
if (dir_exists(path))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
log_error("Path %s is not a directory.", path);
|
||||||
|
} else
|
||||||
|
log_sys_error("mkdir", path);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int dir_create_recursive(const char *path, int mode)
|
||||||
|
{
|
||||||
|
int r = 0;
|
||||||
|
char *orig, *s;
|
||||||
|
|
||||||
|
orig = s = strdup(path);
|
||||||
|
if (!s) {
|
||||||
|
log_error("Failed to duplicate directory path %s.", path);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((s = strchr(s, '/')) != NULL) {
|
||||||
|
*s = '\0';
|
||||||
|
if (*orig && !dir_exists(orig) && !dir_create(orig, mode))
|
||||||
|
goto_out;
|
||||||
|
*s++ = '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!dir_exists(path) && !dir_create(path, mode))
|
||||||
|
goto_out;
|
||||||
|
r = 1;
|
||||||
|
out:
|
||||||
|
free(orig);
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
void sync_dir(const char *file)
|
void sync_dir(const char *file)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
|
@ -40,6 +40,8 @@ int lvm_rename(const char *old, const char *new);
|
|||||||
*/
|
*/
|
||||||
int path_exists(const char *path);
|
int path_exists(const char *path);
|
||||||
int dir_exists(const char *path);
|
int dir_exists(const char *path);
|
||||||
|
int dir_create(const char *path, int mode);
|
||||||
|
int dir_create_recursive(const char *path, int mode);
|
||||||
|
|
||||||
/* Sync directory changes */
|
/* Sync directory changes */
|
||||||
void sync_dir(const char *file);
|
void sync_dir(const char *file);
|
||||||
|
Loading…
Reference in New Issue
Block a user