summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafał Miłecki <rafal@milecki.pl>2020-04-02 14:12:13 +0200
committerRafał Miłecki <rafal@milecki.pl>2020-05-02 12:59:34 +0200
commit32db27dc8b2b55da2de5e64b1548adc0fb475c13 (patch)
tree0febfc5e10e47e2d422f0596c9eb60f77a5b324d
parent0b93429329e9f403cf4fc45043b73e3a8d4e8e0d (diff)
downloadfstools-32db27dc8b2b55da2de5e64b1548adc0fb475c13.tar.gz
Revert "block: support hierarchical mount/umount"
This reverts commit fb0700f0fdfc4bec220203d31df87be2b4ccc467. Switching to AVL tree allows sorting devices by selected parameter (mount path) but does not implement a real hierarchical layout. That would require a tree with parent nodes being parent devices / mount paths. Cc: Yousong Zhou <yszhou4tech@gmail.com> Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-rw-r--r--block.c152
1 files changed, 51 insertions, 101 deletions
diff --git a/block.c b/block.c
index f743e75..dfee7fb 100644
--- a/block.c
+++ b/block.c
@@ -82,20 +82,9 @@ struct mount {
unsigned int prio;
};
-struct device {
- struct vlist_node node;
-
- struct probe_info *pr;
- struct mount *m;
-};
-
-static void vlist_nop_update(struct vlist_tree *tree, struct vlist_node *node_new,
- struct vlist_node *node_old);
-static int devices_cmp(const void *k1, const void *k2, void *ptr);
-
+static struct vlist_tree mounts;
static struct blob_buf b;
-static VLIST_TREE(mounts, avl_strcmp, vlist_nop_update, false, false);
-static VLIST_TREE(devices, devices_cmp, vlist_nop_update, false, false);
+static LIST_HEAD(devices);
static int anon_mount, anon_swap, auto_mount, auto_swap, check_fs;
static unsigned int delay_root;
@@ -420,10 +409,9 @@ static struct mount* find_block(const char *uuid, const char *label, const char
return NULL;
}
-static void vlist_nop_update(struct vlist_tree *tree, struct vlist_node *node_new,
+static void mounts_update(struct vlist_tree *tree, struct vlist_node *node_new,
struct vlist_node *node_old)
{
- // NOTE: free on delete skipped
}
static struct uci_package * config_try_load(struct uci_context *ctx, char *path)
@@ -454,6 +442,8 @@ static int config_load(char *cfg)
struct uci_element *e;
char path[64];
+ vlist_init(&mounts, avl_strcmp, mounts_update);
+
if (cfg) {
snprintf(path, sizeof(path), "%s/upper/etc/config/fstab", cfg);
pkg = config_try_load(ctx, path);
@@ -492,15 +482,15 @@ static int config_load(char *cfg)
static struct probe_info* _probe_path(char *path)
{
- struct device *dev;
+ struct probe_info *pr;
char tmppath[64];
/* skip ubi device if ubiblock device is present */
if (path[5] == 'u' && path[6] == 'b' && path[7] == 'i' &&
path[8] >= '0' && path[8] <= '9' ) {
snprintf(tmppath, sizeof(tmppath), "/dev/ubiblock%s", path + 8);
- vlist_for_each_element(&devices, dev, node)
- if (!strcasecmp(dev->pr->dev, tmppath))
+ list_for_each_entry(pr, &devices, list)
+ if (!strcasecmp(pr->dev, tmppath))
return NULL;
}
@@ -512,20 +502,14 @@ static int _cache_load(const char *path)
int gl_flags = GLOB_NOESCAPE | GLOB_MARK;
int j;
glob_t gl;
- struct device *dev;
if (glob(path, gl_flags, NULL, &gl) < 0)
return -1;
for (j = 0; j < gl.gl_pathc; j++) {
struct probe_info *pr = _probe_path(gl.gl_pathv[j]);
- if (pr) {
- dev = malloc(sizeof(struct device));
- dev->pr = pr;
- dev->m = find_block(pr->uuid, pr->label,
- basename(pr->dev), NULL);
- vlist_add(&devices, &dev->node, dev);
- }
+ if (pr)
+ list_add_tail(&pr->list, &devices);
}
globfree(&gl);
@@ -533,30 +517,8 @@ static int _cache_load(const char *path)
return 0;
}
-static int devices_cmp(const void *k1, const void *k2, void *ptr)
-{
- struct device *dev1 = (struct device *)k1;
- struct device *dev2 = (struct device *)k2;
-
- if (dev1->m) {
- if (!dev2->m)
- return -1;
- if (dev1->m->type == TYPE_MOUNT && dev2->m->type == TYPE_MOUNT &&
- dev1->m->target && dev2->m->target) {
- int len1 = strlen(dev1->m->target);
- int len2 = strlen(dev2->m->target);
- if (len1 != len2)
- return len1 - len2;
- }
- } else if (dev2->m) {
- return 1;
- }
- return strcmp(dev1->pr->dev, dev2->pr->dev);
-}
-
static void cache_load(int mtd)
{
- vlist_update(&devices);
if (mtd) {
_cache_load("/dev/mtdblock*");
_cache_load("/dev/ubiblock*");
@@ -571,28 +533,27 @@ static void cache_load(int mtd)
_cache_load("/dev/vd*");
_cache_load("/dev/xvd*");
_cache_load("/dev/mapper/*");
- vlist_flush(&devices);
}
-static struct device* find_block_device(char *uuid, char *label, char *path)
+static struct probe_info* find_block_info(char *uuid, char *label, char *path)
{
- struct device *dev;
+ struct probe_info *pr = NULL;
if (uuid)
- vlist_for_each_element(&devices, dev, node)
- if (dev->pr->uuid && !strcasecmp(dev->pr->uuid, uuid))
- return dev;
+ list_for_each_entry(pr, &devices, list)
+ if (pr->uuid && !strcasecmp(pr->uuid, uuid))
+ return pr;
if (label)
- vlist_for_each_element(&devices, dev, node)
- if (dev->pr->label && !strcmp(dev->pr->label, label))
- return dev;
+ list_for_each_entry(pr, &devices, list)
+ if (pr->label && !strcmp(pr->label, label))
+ return pr;
if (path)
- vlist_for_each_element(&devices, dev, node)
- if (dev->pr->dev && !strcmp(basename(dev->pr->dev), basename(path)))
- return dev;
+ list_for_each_entry(pr, &devices, list)
+ if (pr->dev && !strcmp(basename(pr->dev), basename(path)))
+ return pr;
return NULL;
}
@@ -1068,10 +1029,9 @@ static int blockd_notify(char *device, struct mount *m, struct probe_info *pr)
return err;
}
-static int mount_device(struct device *dev, int type)
+static int mount_device(struct probe_info *pr, int type)
{
struct mount *m;
- struct probe_info *pr;
struct stat st;
char _target[32];
char *target;
@@ -1079,10 +1039,9 @@ static int mount_device(struct device *dev, int type)
char *mp;
int err;
- if (!dev)
+ if (!pr)
return -1;
- pr = dev->pr;
device = basename(pr->dev);
if (!strcmp(pr->type, "swap")) {
@@ -1095,7 +1054,7 @@ static int mount_device(struct device *dev, int type)
return 0;
}
- m = dev->m;
+ m = find_block(pr->uuid, pr->label, device, NULL);
if (m && m->extroot)
return -1;
@@ -1225,7 +1184,7 @@ static int mount_action(char *action, char *device, int type)
return -1;
cache_load(0);
- return mount_device(find_block_device(NULL, NULL, path), type);
+ return mount_device(find_block_info(NULL, NULL, path), type);
}
static int main_hotplug(int argc, char **argv)
@@ -1241,21 +1200,19 @@ static int main_autofs(int argc, char **argv)
return -1;
if (!strcmp(argv[2], "start")) {
- struct device *dev;
struct probe_info *pr;
if (config_load(NULL))
return -1;
cache_load(0);
- vlist_for_each_element(&devices, dev, node) {
+ list_for_each_entry(pr, &devices, list) {
struct mount *m;
- pr = dev->pr;
if (!strcmp(pr->type, "swap"))
continue;
- m = dev->m;
+ m = find_block(pr->uuid, pr->label, NULL, NULL);
if (m && m->extroot)
continue;
@@ -1419,8 +1376,7 @@ static int test_fs_support(const char *name)
static int check_extroot(char *path)
{
- struct device *dev;
- struct probe_info *pr;
+ struct probe_info *pr = NULL;
char devpath[32];
#ifdef UBIFS_EXTROOT
@@ -1443,8 +1399,7 @@ static int check_extroot(char *path)
}
#endif
- vlist_for_each_element(&devices, dev, node) {
- pr = dev->pr;
+ list_for_each_entry(pr, &devices, list) {
if (!strcmp(pr->dev, devpath)) {
struct stat s;
FILE *fp = NULL;
@@ -1502,7 +1457,6 @@ static int mount_extroot(char *cfg)
char overlay[] = "/tmp/extroot/overlay";
char mnt[] = "/tmp/extroot/mnt";
char *path = mnt;
- struct device *dev;
struct probe_info *pr;
struct mount *m;
int err = -1;
@@ -1523,17 +1477,16 @@ static int mount_extroot(char *cfg)
}
/* Find block device pointed by the mount config */
- dev = find_block_device(m->uuid, m->label, m->device);
+ pr = find_block_info(m->uuid, m->label, m->device);
- if (!dev && delay_root){
+ if (!pr && delay_root){
ULOG_INFO("extroot: device not present, retrying in %u seconds\n", delay_root);
sleep(delay_root);
make_devs();
cache_load(1);
- dev = find_block_device(m->uuid, m->label, m->device);
+ pr = find_block_info(m->uuid, m->label, m->device);
}
- if (dev) {
- pr = dev->pr;
+ if (pr) {
if (strncmp(pr->type, "ext", 3) &&
strncmp(pr->type, "f2fs", 4) &&
strncmp(pr->type, "btrfs", 5) &&
@@ -1577,6 +1530,7 @@ static int mount_extroot(char *cfg)
static int main_extroot(int argc, char **argv)
{
+ struct probe_info *pr;
char blkdev_path[32] = { 0 };
int err = -1;
#ifdef UBIFS_EXTROOT
@@ -1605,8 +1559,8 @@ static int main_extroot(int argc, char **argv)
/* Start with looking for MTD partition */
find_block_mtd("\"rootfs_data\"", blkdev_path, sizeof(blkdev_path));
if (blkdev_path[0]) {
- struct device *dev = find_block_device(NULL, NULL, blkdev_path);
- if (dev && !strcmp(dev->pr->type, "jffs2")) {
+ pr = find_block_info(NULL, NULL, blkdev_path);
+ if (pr && !strcmp(pr->type, "jffs2")) {
char cfg[] = "/tmp/jffs_cfg";
/*
@@ -1652,14 +1606,14 @@ static int main_extroot(int argc, char **argv)
static int main_mount(int argc, char **argv)
{
- struct device *dev;
+ struct probe_info *pr;
if (config_load(NULL))
return -1;
cache_load(1);
- vlist_for_each_element(&devices, dev, node)
- mount_device(dev, TYPE_DEV);
+ list_for_each_entry(pr, &devices, list)
+ mount_device(pr, TYPE_DEV);
handle_swapfiles(true);
@@ -1668,7 +1622,6 @@ static int main_mount(int argc, char **argv)
static int main_umount(int argc, char **argv)
{
- struct device *dev;
struct probe_info *pr;
bool all = false;
@@ -1682,14 +1635,13 @@ static int main_umount(int argc, char **argv)
if (argc == 3)
all = !strcmp(argv[2], "-a");
- vlist_for_each_element_reverse(&devices, dev, node) {
+ list_for_each_entry(pr, &devices, list) {
struct mount *m;
- pr = dev->pr;
if (!strcmp(pr->type, "swap"))
continue;
- m = dev->m;
+ m = find_block(pr->uuid, pr->label, basename(pr->dev), NULL);
if (m && m->extroot)
continue;
@@ -1701,7 +1653,7 @@ static int main_umount(int argc, char **argv)
static int main_detect(int argc, char **argv)
{
- struct device *dev;
+ struct probe_info *pr;
cache_load(0);
printf("config 'global'\n");
@@ -1711,8 +1663,8 @@ static int main_detect(int argc, char **argv)
printf("\toption\tauto_mount\t'1'\n");
printf("\toption\tdelay_root\t'5'\n");
printf("\toption\tcheck_fs\t'0'\n\n");
- vlist_for_each_element(&devices, dev, node)
- print_block_uci(dev->pr);
+ list_for_each_entry(pr, &devices, list)
+ print_block_uci(pr);
return 0;
}
@@ -1720,12 +1672,12 @@ static int main_detect(int argc, char **argv)
static int main_info(int argc, char **argv)
{
int i;
- struct device *dev;
+ struct probe_info *pr;
cache_load(1);
if (argc == 2) {
- vlist_for_each_element(&devices, dev, node)
- print_block_info(dev->pr);
+ list_for_each_entry(pr, &devices, list)
+ print_block_info(pr);
return 0;
};
@@ -1741,9 +1693,9 @@ static int main_info(int argc, char **argv)
ULOG_ERR("%s is not a block device\n", argv[i]);
continue;
}
- dev = find_block_device(NULL, NULL, argv[i]);
- if (dev)
- print_block_info(dev->pr);
+ pr = find_block_info(NULL, NULL, argv[i]);
+ if (pr)
+ print_block_info(pr);
}
return 0;
@@ -1765,7 +1717,6 @@ static int main_swapon(int argc, char **argv)
FILE *fp;
char *lineptr;
size_t s;
- struct device *dev;
struct probe_info *pr;
int flags = 0;
int pri;
@@ -1790,8 +1741,7 @@ static int main_swapon(int argc, char **argv)
return 0;
case 'a':
cache_load(0);
- vlist_for_each_element(&devices, dev, node) {
- pr = dev->pr;
+ list_for_each_entry(pr, &devices, list) {
if (strcmp(pr->type, "swap"))
continue;
if (swapon(pr->dev, 0))