Merging upstream version 4.3+20240723.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
9d4f96bc70
commit
aa881a3626
70 changed files with 1465 additions and 1206 deletions
79
config.c
79
config.c
|
@ -188,8 +188,36 @@ inline void ident_init(struct mddev_ident *ident)
|
|||
ident->uuid_set = 0;
|
||||
}
|
||||
|
||||
/** ident_check_name() - helper function to verify name.
|
||||
* @name: name to check.
|
||||
* @prop_name: the name of the property it is validated against, used for logging.
|
||||
* @cmdline: context dependent actions.
|
||||
*
|
||||
* @name must follow name's criteria, be POSIX compatible and does not have leading dot.
|
||||
*/
|
||||
static mdadm_status_t ident_check_name(const char *name, const char *prop_name, const bool cmdline)
|
||||
{
|
||||
if (!is_string_lq(name, MD_NAME_MAX + 1)) {
|
||||
ident_log(prop_name, name, "Too long or empty", cmdline);
|
||||
return MDADM_STATUS_ERROR;
|
||||
}
|
||||
|
||||
if (*name == '.') {
|
||||
/* MD device should not be considered as hidden. */
|
||||
ident_log(prop_name, name, "Leading dot forbidden", cmdline);
|
||||
return MDADM_STATUS_ERROR;
|
||||
}
|
||||
|
||||
if (!is_name_posix_compatible(name)) {
|
||||
ident_log(prop_name, name, "Not POSIX compatible", cmdline);
|
||||
return MDADM_STATUS_ERROR;
|
||||
}
|
||||
|
||||
return MDADM_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* _ident_set_devname()- verify devname and set it in &mddev_ident.
|
||||
* _ident_set_devname() - verify devname and set it in &mddev_ident.
|
||||
* @ident: pointer to &mddev_ident.
|
||||
* @devname: devname to be set.
|
||||
* @cmdline: context dependent actions. If set, ignore keyword is not allowed.
|
||||
|
@ -202,8 +230,7 @@ inline void ident_init(struct mddev_ident *ident)
|
|||
* /dev/md/{name}
|
||||
* {name}
|
||||
*
|
||||
* {name} must follow name's criteria and be POSIX compatible.
|
||||
* If criteria passed, duplicate memory and set devname in @ident.
|
||||
* If verification passed, duplicate memory and set devname in @ident.
|
||||
*
|
||||
* Return: %MDADM_STATUS_SUCCESS or %MDADM_STATUS_ERROR.
|
||||
*/
|
||||
|
@ -216,6 +243,7 @@ mdadm_status_t _ident_set_devname(struct mddev_ident *ident, const char *devname
|
|||
static const char named_dev_pref[] = DEV_NUM_PREF "_";
|
||||
static const int named_dev_pref_size = sizeof(named_dev_pref) - 1;
|
||||
const char *prop_name = "devname";
|
||||
mdadm_status_t ret;
|
||||
const char *name;
|
||||
|
||||
if (ident->devname) {
|
||||
|
@ -242,53 +270,40 @@ mdadm_status_t _ident_set_devname(struct mddev_ident *ident, const char *devname
|
|||
else
|
||||
name = devname;
|
||||
|
||||
if (is_name_posix_compatible(name) == false) {
|
||||
ident_log(prop_name, name, "Not POSIX compatible", cmdline);
|
||||
return MDADM_STATUS_ERROR;
|
||||
}
|
||||
|
||||
if (is_string_lq(name, MD_NAME_MAX + 1) == false) {
|
||||
ident_log(prop_name, devname, "Invalid length", cmdline);
|
||||
return MDADM_STATUS_ERROR;
|
||||
}
|
||||
ret = ident_check_name(name, prop_name, cmdline);
|
||||
if (ret)
|
||||
return ret;
|
||||
pass:
|
||||
ident->devname = xstrdup(devname);
|
||||
return MDADM_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* _ident_set_name()- set name in &mddev_ident.
|
||||
* _ident_set_name() - set name in &mddev_ident.
|
||||
* @ident: pointer to &mddev_ident.
|
||||
* @name: name to be set.
|
||||
* @cmdline: context dependent actions.
|
||||
*
|
||||
* If criteria passed, set name in @ident.
|
||||
* Note: name is not used by config file, it for cmdline only.
|
||||
*
|
||||
* Return: %MDADM_STATUS_SUCCESS or %MDADM_STATUS_ERROR.
|
||||
*/
|
||||
static mdadm_status_t _ident_set_name(struct mddev_ident *ident, const char *name,
|
||||
const bool cmdline)
|
||||
mdadm_status_t ident_set_name(struct mddev_ident *ident, const char *name)
|
||||
{
|
||||
assert(name);
|
||||
assert(ident);
|
||||
|
||||
const char *prop_name = "name";
|
||||
mdadm_status_t ret;
|
||||
|
||||
if (ident->name[0]) {
|
||||
ident_log(prop_name, name, "Already defined", cmdline);
|
||||
ident_log(prop_name, name, "Already defined", true);
|
||||
return MDADM_STATUS_ERROR;
|
||||
}
|
||||
|
||||
if (is_string_lq(name, MD_NAME_MAX + 1) == false) {
|
||||
ident_log(prop_name, name, "Too long or empty", cmdline);
|
||||
return MDADM_STATUS_ERROR;
|
||||
}
|
||||
|
||||
if (is_name_posix_compatible(name) == false) {
|
||||
ident_log(prop_name, name, "Not POSIX compatible", cmdline);
|
||||
return MDADM_STATUS_ERROR;
|
||||
}
|
||||
ret = ident_check_name(name, prop_name, true);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
snprintf(ident->name, MD_NAME_MAX + 1, "%s", name);
|
||||
return MDADM_STATUS_SUCCESS;
|
||||
|
@ -302,14 +317,6 @@ mdadm_status_t ident_set_devname(struct mddev_ident *ident, const char *name)
|
|||
return _ident_set_devname(ident, name, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* ident_set_name()- exported, for cmdline.
|
||||
*/
|
||||
mdadm_status_t ident_set_name(struct mddev_ident *ident, const char *name)
|
||||
{
|
||||
return _ident_set_name(ident, name, true);
|
||||
}
|
||||
|
||||
struct conf_dev {
|
||||
struct conf_dev *next;
|
||||
char *name;
|
||||
|
@ -379,6 +386,7 @@ struct mddev_dev *load_containers(void)
|
|||
map = NULL;
|
||||
}
|
||||
free_mdstat(mdstat);
|
||||
map_free(map);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
@ -949,7 +957,8 @@ void conf_file_or_dir(FILE *f)
|
|||
struct dirent *dp;
|
||||
struct fname *list = NULL;
|
||||
|
||||
fstat(fileno(f), &st);
|
||||
if (fstat(fileno(f), &st) != 0)
|
||||
return;
|
||||
if (S_ISREG(st.st_mode))
|
||||
conf_file(f);
|
||||
else if (!S_ISDIR(st.st_mode))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue