From: Kay Sievers Date: Sun, 16 Sep 2012 21:31:11 +0000 (+0200) Subject: udev: add btrfs support X-Git-Tag: v190~61 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=0bb91b50100e4633a0e68135854e606653055748;ds=sidebyside udev: add btrfs support All "btrfs" file systems will be registered with the kernel when they show up. Incomplete multi-device volumes will set SYSTEMD_READY=0, to prevent access until the volume is complete and fully registered. --- diff --git a/Makefile.am b/Makefile.am index 8f421001c..6d211404f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1737,6 +1737,7 @@ dist_udevrules_DATA += \ rules/60-persistent-input.rules \ rules/60-persistent-alsa.rules \ rules/60-persistent-storage.rules \ + rules/64-btrfs.rules \ rules/75-net-description.rules \ rules/75-tty-description.rules \ rules/78-sound-card.rules \ @@ -1797,6 +1798,7 @@ libudev_core_la_SOURCES = \ src/udev/udev-ctrl.c \ src/udev/udev-builtin.c \ src/udev/udev-builtin-blkid.c \ + src/udev/udev-builtin-btrfs.c \ src/udev/udev-builtin-firmware.c \ src/udev/udev-builtin-hwdb.c \ src/udev/udev-builtin-input_id.c \ diff --git a/rules/64-btrfs.rules b/rules/64-btrfs.rules new file mode 100644 index 000000000..fe0100131 --- /dev/null +++ b/rules/64-btrfs.rules @@ -0,0 +1,13 @@ +# do not edit this file, it will be overwritten on update + +SUBSYSTEM!="block", GOTO="btrfs_end" +ACTION=="remove", GOTO="btrfs_end" +ENV{ID_FS_TYPE}!="btrfs", GOTO="btrfs_end" + +# let the kernel know about this btrfs filesystem, and check if it is complete +IMPORT{builtin}="btrfs ready $devnode" + +# mark the device as not ready to be used by the system +ENV{ID_BTRFS_READY}=="0", ENV{SYSTEMD_READY}="0" + +LABEL="btrfs_end" diff --git a/src/udev/udev-builtin-btrfs.c b/src/udev/udev-builtin-btrfs.c new file mode 100644 index 000000000..f95a75e39 --- /dev/null +++ b/src/udev/udev-builtin-btrfs.c @@ -0,0 +1,57 @@ +/* + * btrfs - volume management + * + * Copyright (C) 2012 Kay Sievers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "udev.h" + +#define BTRFS_PATH_NAME_MAX 4087 +struct btrfs_ioctl_vol_args { + int64_t fd; + char name[BTRFS_PATH_NAME_MAX + 1]; +}; +#define BTRFS_IOCTL_MAGIC 0x94 +#define BTRFS_IOC_DEVICES_READY _IOR(BTRFS_IOCTL_MAGIC, 39, struct btrfs_ioctl_vol_args) + +static int builtin_btrfs(struct udev_device *dev, int argc, char *argv[], bool test) +{ + struct btrfs_ioctl_vol_args args; + int fd; + int err; + + if (argc != 3 || !streq(argv[1], "ready")) + return EXIT_FAILURE; + + fd = open("/dev/btrfs-control", O_RDWR); + if (fd < 0) + return EXIT_FAILURE; + + util_strscpy(args.name, sizeof(args.name), argv[2]); + err = ioctl(fd, BTRFS_IOC_DEVICES_READY, &args); + close(fd); + if (err < 0) + return EXIT_FAILURE; + + udev_builtin_add_property(dev, test, "ID_BTRFS_READY", err == 0 ? "1" : "0"); + return EXIT_SUCCESS; +} + +const struct udev_builtin udev_builtin_btrfs = { + .name = "btrfs", + .cmd = builtin_btrfs, + .help = "btrfs volume management", +}; diff --git a/src/udev/udev-builtin.c b/src/udev/udev-builtin.c index 7d89f2279..b632edaae 100644 --- a/src/udev/udev-builtin.c +++ b/src/udev/udev-builtin.c @@ -29,6 +29,7 @@ static bool initialized; static const struct udev_builtin *builtins[] = { [UDEV_BUILTIN_BLKID] = &udev_builtin_blkid, + [UDEV_BUILTIN_BTRFS] = &udev_builtin_btrfs, [UDEV_BUILTIN_FIRMWARE] = &udev_builtin_firmware, [UDEV_BUILTIN_INPUT_ID] = &udev_builtin_input_id, [UDEV_BUILTIN_KMOD] = &udev_builtin_kmod, @@ -142,7 +143,6 @@ int udev_builtin_add_property(struct udev_device *dev, bool test, const char *ke if (key[0] != '.') udev_list_entry_set_num(entry, true); - log_debug("%s=%s\n", key, val); if (test) printf("%s=%s\n", key, val); return 0; diff --git a/src/udev/udev.h b/src/udev/udev.h index 56eff0093..d160a86df 100644 --- a/src/udev/udev.h +++ b/src/udev/udev.h @@ -135,6 +135,7 @@ int udev_ctrl_get_set_children_max(struct udev_ctrl_msg *ctrl_msg); /* built-in commands */ enum udev_builtin_cmd { UDEV_BUILTIN_BLKID, + UDEV_BUILTIN_BTRFS, UDEV_BUILTIN_FIRMWARE, UDEV_BUILTIN_INPUT_ID, UDEV_BUILTIN_KMOD, @@ -157,6 +158,7 @@ struct udev_builtin { bool run_once; }; extern const struct udev_builtin udev_builtin_blkid; +extern const struct udev_builtin udev_builtin_btrfs; extern const struct udev_builtin udev_builtin_firmware; extern const struct udev_builtin udev_builtin_input_id; extern const struct udev_builtin udev_builtin_kmod; diff --git a/src/udev/udevadm-test-builtin.c b/src/udev/udevadm-test-builtin.c index ef788b0e0..92f07f138 100644 --- a/src/udev/udevadm-test-builtin.c +++ b/src/udev/udevadm-test-builtin.c @@ -108,8 +108,9 @@ static int adm_builtin(struct udev *udev, int argc, char *argv[]) goto out; } - if (udev_builtin_run(dev, cmd, command, true) < 0) { - fprintf(stderr, "error executing '%s'\n\n", command); + rc = udev_builtin_run(dev, cmd, command, true); + if (rc < 0) { + fprintf(stderr, "error executing '%s', exit code %i\n\n", command, rc); rc = 6; } out: