Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion Assemble.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
*/

#include "mdadm.h"
#include "mdstat.h"
#include "xmalloc.h"

#include <ctype.h>
Expand Down Expand Up @@ -120,7 +121,7 @@ static int is_member_busy(char *metadata_version)
continue;

/* Skip first char - it can be '/' or '-' */
if (strcmp(&ent->metadata_version[10], metadata_version + 1) == 0) {
if (strcmp(&ent->metadata_version[MD_VER_EXT_LEN + 1], metadata_version + 1) == 0) {
busy = 1;
break;
}
Expand Down
9 changes: 5 additions & 4 deletions Detail.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
*/

#include "mdadm.h"
#include "mdstat.h"
#include "xmalloc.h"

#include <ctype.h>
Expand Down Expand Up @@ -683,10 +684,10 @@ int Detail(char *dev, struct context *c)
de->d_name);
if (load_sys(path, vbuf, sizeof(vbuf)) < 0)
continue;
if (strncmp(vbuf, "external:", 9) ||
!is_subarray(vbuf + 9) ||
strncmp(vbuf + 10, sra->sys_name, nlen) ||
vbuf[10 + nlen] != '/')
if (strncmp(vbuf, MD_VER_EXT, MD_VER_EXT_LEN) ||
!is_subarray(vbuf + MD_VER_EXT_LEN) ||
strncmp(vbuf + MD_VER_EXT_LEN + 1, sra->sys_name, nlen) ||
vbuf[MD_VER_EXT_LEN + 1 + nlen] != '/')
continue;
devid = devnm2devid(de->d_name);
printf(" %s",
Expand Down
3 changes: 2 additions & 1 deletion Grow.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
* Email: <neilb@suse.de>
*/
#include "mdadm.h"
#include "mdstat.h"
#include "dlink.h"
#include "xmalloc.h"

Expand Down Expand Up @@ -696,7 +697,7 @@ static int check_idle(struct supertype *st)
if (!is_container_member(e, container))
continue;
/* frozen array is not idle*/
if (e->percent >= 0 || e->metadata_version[9] == '-') {
if (e->percent >= 0 || e->metadata_version[MD_VER_BLOCKED_IDX] == '-') {
is_idle = 0;
break;
}
Expand Down
1 change: 1 addition & 0 deletions Incremental.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
*/

#include "mdadm.h"
#include "mdstat.h"
#include "xmalloc.h"
#include "udev.h"

Expand Down
1 change: 1 addition & 0 deletions Kill.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
*/

#include "mdadm.h"
#include "mdstat.h"

int Kill(char *dev, struct supertype *st, int force, int verbose, int noexcl)
{
Expand Down
16 changes: 9 additions & 7 deletions Manage.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
*/

#include "mdadm.h"
#include "mdstat.h"
#include "udev.h"
#include "xmalloc.h"

Expand All @@ -48,12 +49,12 @@ int Manage_ro(char *devname, int fd, int readonly)
mdi->array.major_version == -1 &&
is_subarray(mdi->text_version)) {
char vers[64];
strcpy(vers, "external:");
strcpy(vers, MD_VER_EXT);
strcat(vers, mdi->text_version);
if (readonly > 0) {
int rv;
/* We set readonly ourselves. */
vers[9] = '-';
vers[MD_VER_BLOCKED_IDX] = '-';
sysfs_set_str(mdi, NULL, "metadata_version", vers);

close_fd(&fd);
Expand All @@ -63,21 +64,21 @@ int Manage_ro(char *devname, int fd, int readonly)
pr_err("failed to set readonly for %s: %s\n",
devname, strerror(errno));

vers[9] = mdi->text_version[0];
vers[MD_VER_BLOCKED_IDX] = mdi->text_version[0];
sysfs_set_str(mdi, NULL, "metadata_version", vers);
rv = 1;
goto out;
}
} else {
char *cp;
/* We cannot set read/write - must signal mdmon */
vers[9] = '/';
vers[MD_VER_BLOCKED_IDX] = '/';
sysfs_set_str(mdi, NULL, "metadata_version", vers);

cp = strchr(vers+10, '/');
cp = strchr(vers + MD_VER_BLOCKED_IDX + 1, '/');
if (cp)
*cp = 0;
ping_monitor(vers+10);
ping_monitor(vers + MD_VER_BLOCKED_IDX + 1);
if (mdi->array.level <= 0)
sysfs_set_str(mdi, NULL, "array_state", "active");
}
Expand Down Expand Up @@ -278,7 +279,8 @@ int Manage_stop(char *devname, int fd, int verbose, int will_retry)
mds = mdstat_read(0, 0);
for (m = mds; m; m = m->next)
if (is_mdstat_ent_external(m) &&
metadata_container_matches(m->metadata_version + 9, devnm)) {
metadata_container_matches(m->metadata_version + MD_VER_EXT_LEN,
devnm)) {
if (verbose >= 0)
pr_err("Cannot stop container %s: member %s still active\n",
devname, m->devnm);
Expand Down
1 change: 1 addition & 0 deletions config.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
*/

#include "mdadm.h"
#include "mdstat.h"
#include "dlink.h"
#include "xmalloc.h"

Expand Down
1 change: 1 addition & 0 deletions managemon.c
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@
#define _GNU_SOURCE
#endif
#include "mdadm.h"
#include "mdstat.h"
#include "mdmon.h"
#include "xmalloc.h"

Expand Down
1 change: 1 addition & 0 deletions mapfile.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
* at compile time via MAP_DIR and MAP_FILE.
*/
#include "mdadm.h"
#include "mdstat.h"
#include "xmalloc.h"

#include <sys/file.h>
Expand Down
29 changes: 29 additions & 0 deletions md_common.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/* SPDX-License-Identifier: GPL-2.0-only */

/*
* md_common - constants shared between md driver abstractions.
*/

#ifndef MD_COMMON_H
#define MD_COMMON_H

/*
* Prefix used by the md driver version to mark an externally-managed array or
* container. The full form is:
*
* "external:" [/-] containername [/subarray]
*
* The '/' or '-' separator distinguishes normal read-write arrays from those
* that mdmon must not reconfigure (read-only, reshaping, etc.).
*/
#define MD_EXT "external" /* The external keyword used in various contexts */

#define MD_VER_EXT "external:" /* The "external:" version const prefix */
#define MD_VER_EXT_LEN (sizeof(MD_VER_EXT) - 1) /* Length of external prefix */

/* Index of the character that blocks the version.
* It is the one after the prefix so the array index is MD_VER_EXT_LEN
*/
#define MD_VER_BLOCKED_IDX (MD_VER_EXT_LEN)

#endif
1 change: 1 addition & 0 deletions mdadm.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
*/

#include "mdadm.h"
#include "mdstat.h"
#include "md_p.h"
#include "xmalloc.h"

Expand Down
37 changes: 0 additions & 37 deletions mdadm.h
Original file line number Diff line number Diff line change
Expand Up @@ -684,36 +684,6 @@ typedef struct mapping {
int num;
} mapping_t;

struct mdstat_ent {
char devnm[32];
int active;
char *level;
char *pattern; /* U for up, _ for down */
int percent; /* -1 if no resync */
int resync; /* 3 if check, 2 if reshape, 1 if resync, 0 if recovery */
int devcnt;
int raid_disks;
char * metadata_version;
struct dev_member {
char *name;
struct dev_member *next;
} *members;
struct mdstat_ent *next;
};

extern struct mdstat_ent *mdstat_read(int hold, int start);
extern void mdstat_close(void);
extern void free_mdstat(struct mdstat_ent *ms);
extern int mdstat_wait(int seconds);
extern void mdstat_wait_fd(int fd, const sigset_t *sigmask);
extern int mddev_busy(char *devnm);
extern struct mdstat_ent *mdstat_by_component(char *name);
extern struct mdstat_ent *mdstat_find_by_member_name(struct mdstat_ent *mdstat, char *member_devnm);
extern struct mdstat_ent *mdstat_by_subdev(char *subdev, char *container);

extern bool is_mdstat_ent_external(struct mdstat_ent *ent);
extern bool is_mdstat_ent_subarray(struct mdstat_ent *ent);

struct map_ent {
struct map_ent *next;
char devnm[32];
Expand Down Expand Up @@ -1727,8 +1697,6 @@ extern int is_mddev(char *dev);
extern int open_container(int fd);
extern int metadata_container_matches(char *metadata, char *devnm);
extern int metadata_subdev_matches(char *metadata, char *devnm);
extern bool is_container_member(struct mdstat_ent *ent, char *devname);
extern int is_subarray_active(char *subarray, char *devname);
extern int open_subarray(char *dev, char *subarray, struct supertype *st, int quiet);
extern struct superswitch *version_to_superswitch(char *vers);

Expand Down Expand Up @@ -1823,11 +1791,6 @@ static inline int is_subarray(char *vers)
return (*vers == '/' || *vers == '-');
}

static inline char *to_subarray(struct mdstat_ent *ent, char *container)
{
return &ent->metadata_version[10+strlen(container)+1];
}

/**
* signal_s() - Wrapper for sigaction() with signal()-like interface.
* @sig: The signal to set the signal handler to.
Expand Down
1 change: 1 addition & 0 deletions mdmon.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@
#endif

#include "mdadm.h"
#include "mdstat.h"
#include "mdmon.h"
#include "xmalloc.h"

Expand Down
3 changes: 0 additions & 3 deletions mdmon.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,9 +84,6 @@ void do_manager(struct supertype *container);
extern volatile sig_atomic_t sigterm;

int read_dev_state(int fd);
bool is_container_member(struct mdstat_ent *mdstat, char *container);

struct mdstat_ent *mdstat_read(int hold, int start);

extern int exit_now, manager_ready;
extern int mon_tid, mgr_tid;
Expand Down
10 changes: 6 additions & 4 deletions mdmonitor.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
*/

#include "mdadm.h"
#include "mdstat.h"
#include "udev.h"
#include "xmalloc.h"

Expand Down Expand Up @@ -892,7 +893,8 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,

if (is_mdstat_ent_subarray(mse)) {
char *sl;
snprintf(st->parent_devnm, MD_NAME_MAX, "%s", mse->metadata_version + 10);
snprintf(st->parent_devnm, MD_NAME_MAX, "%s",
mse->metadata_version + MD_VER_EXT_LEN + 1);
sl = strchr(st->parent_devnm, '/');
if (sl)
*sl = 0;
Expand Down Expand Up @@ -1005,7 +1007,7 @@ static int add_new_arrays(struct mdstat_ent *mdstat, struct state **statelist)
char *sl;

snprintf(st->parent_devnm, MD_NAME_MAX, "%s",
mse->metadata_version + 10);
mse->metadata_version + MD_VER_EXT_LEN + 1);
sl = strchr(st->parent_devnm, '/');
if (sl)
*sl = 0;
Expand Down Expand Up @@ -1306,8 +1308,8 @@ int Wait(char *dev)
}
if (!e || e->percent == RESYNC_NONE) {
if (e && is_mdstat_ent_external(e)) {
if (is_subarray(&e->metadata_version[9]))
ping_monitor(&e->metadata_version[9]);
if (is_subarray(&e->metadata_version[MD_VER_EXT_LEN]))
ping_monitor(&e->metadata_version[MD_VER_EXT_LEN]);
else
ping_monitor(devnm);
}
Expand Down
1 change: 1 addition & 0 deletions mdopen.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
*/

#include "mdadm.h"
#include "mdstat.h"
#include "udev.h"
#include "md_p.h"
#include "xmalloc.h"
Expand Down
26 changes: 21 additions & 5 deletions mdstat.c
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@
*/

#include "mdadm.h"
#include "mdstat.h"
#include "dlink.h"
#include "xmalloc.h"

Expand Down Expand Up @@ -155,27 +156,42 @@ bool is_mdstat_ent_external(struct mdstat_ent *ent)
if (!ent->metadata_version)
return false;

if (strncmp(ent->metadata_version, "external:", 9) == 0)
if (strncmp(ent->metadata_version, MD_VER_EXT, MD_VER_EXT_LEN) == 0)
return true;
return false;
}

bool is_mdstat_ent_subarray(struct mdstat_ent *ent)
{
if (is_mdstat_ent_external(ent) && is_subarray(ent->metadata_version + 9))
if (is_mdstat_ent_external(ent) && is_subarray(ent->metadata_version + MD_VER_EXT_LEN))
return true;
return false;
}

bool is_container_member(struct mdstat_ent *mdstat, char *container)
{
if (is_mdstat_ent_external(mdstat) &&
metadata_container_matches(mdstat->metadata_version + 9, container))
metadata_container_matches(mdstat->metadata_version + MD_VER_EXT_LEN, container))
return true;

return false;
}

int is_subarray_active(char *subarray, char *container)
{
struct mdstat_ent *mdstat = mdstat_read(0, 0);
struct mdstat_ent *ent;

for (ent = mdstat; ent; ent = ent->next)
if (is_container_member(ent, container))
if (strcmp(to_subarray(ent, container), subarray) == 0)
break;

free_mdstat(mdstat);

return ent != NULL;
}

static int mdstat_fd = -1;
struct mdstat_ent *mdstat_read(int hold, int start)
{
Expand Down Expand Up @@ -493,9 +509,9 @@ struct mdstat_ent *mdstat_by_subdev(char *subdev, char *container)
if (!is_mdstat_ent_external(ent))
continue;

if (!metadata_container_matches(ent->metadata_version + 9, container))
if (!metadata_container_matches(ent->metadata_version + MD_VER_EXT_LEN, container))
continue;
if (!metadata_subdev_matches(ent->metadata_version + 9, subdev))
if (!metadata_subdev_matches(ent->metadata_version + MD_VER_EXT_LEN, subdev))
continue;

break;
Expand Down
Loading