[systemd-devel] [RFC 1/4] use libmount to enumerate /proc/self/mountinfo

Tom Gundersen teg at jklm.no
Sat Nov 15 05:09:26 PST 2014


Usually we don't do this kind of fallback, but rather disable the relevant
functionality if the lib is not available.

In this case I guess it means making support for .mount units optional. I
could imagine someone doing that in very specialised use cases, but maybe
it makes more sense to make the library a hard dependency for now...

Cheers,

Tom
On 7 Nov 2014 06:11, "Chris Leech" <cleech at redhat.com> wrote:

> This lets libmount add in user options from /run/mount/utab, like
> _netdev which is needed to get proper ordering against remote-fs.target
> ---
>  .travis.yml      |  2 +-
>  Makefile.am      |  4 +++-
>  README           |  1 +
>  configure.ac     | 13 ++++++++++++
>  src/core/build.h |  7 +++++++
>  src/core/mount.c | 62
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  6 files changed, 87 insertions(+), 2 deletions(-)
>
> diff --git a/.travis.yml b/.travis.yml
> index 7e5251c..4ea2bc2 100644
> --- a/.travis.yml
> +++ b/.travis.yml
> @@ -3,7 +3,7 @@ compiler:
>    - gcc
>  before_install:
>   - sudo apt-get update -qq
> - - sudo apt-get install autotools-dev automake autoconf libtool
> libdbus-1-dev libcap-dev libblkid-dev libpam-dev libcryptsetup-dev
> libaudit-dev libacl1-dev libattr1-dev libselinux-dev liblzma-dev
> libgcrypt-dev libqrencode-dev libmicrohttpd-dev gtk-doc-tools gperf
> python2.7-dev
> + - sudo apt-get install autotools-dev automake autoconf libtool
> libdbus-1-dev libcap-dev libblkid-dev libmount-dev libpam-dev
> libcryptsetup-dev libaudit-dev libacl1-dev libattr1-dev libselinux-dev
> liblzma-dev libgcrypt-dev libqrencode-dev libmicrohttpd-dev gtk-doc-tools
> gperf python2.7-dev
>  script: ./autogen.sh && ./configure --enable-gtk-doc --enable-gtk-doc-pdf
> && make V=1 && sudo ./systemd-machine-id-setup && make check && make
> distcheck
>  after_failure: cat test-suite.log
>  notifications:
> diff --git a/Makefile.am b/Makefile.am
> index 461ffa9..3deffe8 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -1163,6 +1163,7 @@ libsystemd_core_la_CFLAGS = \
>         $(KMOD_CFLAGS) \
>         $(APPARMOR_CFLAGS) \
>         $(SECCOMP_CFLAGS) \
> +       $(MOUNT_CFLAGS) \
>         -pthread
>
>  libsystemd_core_la_LIBADD = \
> @@ -1177,7 +1178,8 @@ libsystemd_core_la_LIBADD = \
>         $(CAP_LIBS) \
>         $(KMOD_LIBS) \
>         $(APPARMOR_LIBS) \
> -       $(SECCOMP_LIBS)
> +       $(SECCOMP_LIBS) \
> +       $(MOUNT_LIBS)
>
>  if HAVE_SECCOMP
>  libsystemd_core_la_LIBADD += \
> diff --git a/README b/README
> index aefb349..89abc3e 100644
> --- a/README
> +++ b/README
> @@ -108,6 +108,7 @@ REQUIREMENTS:
>          libcap
>          libseccomp >= 1.0.0 (optional)
>          libblkid >= 2.20 (from util-linux) (optional)
> +        libmount >= 2.20 (from util-linux) (optional)
>          libkmod >= 15 (optional)
>          PAM >= 1.1.2 (optional)
>          libcryptsetup (optional)
> diff --git a/configure.ac b/configure.ac
> index 05fc00d..85ff053 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -426,6 +426,18 @@ fi
>  AM_CONDITIONAL(HAVE_BLKID, [test "$have_blkid" = "yes"])
>
>  #
> ------------------------------------------------------------------------------
> +have_libmount=no
> +AC_ARG_ENABLE(libmount, AS_HELP_STRING([--disable-libmount], [disable
> libmount support]))
> +if test "x$enable_libmount" != "xno"; then
> +        PKG_CHECK_MODULES(MOUNT, [ mount >= 2.20 ],
> +                [AC_DEFINE(HAVE_LIBMOUNT, 1, [Define if libmount is
> available]) have_libmount=yes], have_libmount=no)
> +        if test "x$have_libmount" = xno -a "x$enable_libmount" = xyes;
> then
> +                AC_MSG_ERROR([*** libmount support requested but
> libraries not found])
> +        fi
> +fi
> +AM_CONDITIONAL(HAVE_LIBMOUNT, [test "$have_libmount" = "yes"])
> +
> +#
> ------------------------------------------------------------------------------
>  have_seccomp=no
>  AC_ARG_ENABLE(seccomp, AS_HELP_STRING([--disable-seccomp], [Disable
> optional SECCOMP support]))
>  if test "x$enable_seccomp" != "xno"; then
> @@ -1374,6 +1386,7 @@ AC_MSG_RESULT([
>          efi:                     ${have_efi}
>          kmod:                    ${have_kmod}
>          blkid:                   ${have_blkid}
> +        libmount:                ${have_libmount}
>          dbus:                    ${have_dbus}
>          nss-myhostname:          ${have_myhostname}
>          gudev:                   ${enable_gudev}
> diff --git a/src/core/build.h b/src/core/build.h
> index d5e5550..5644693 100644
> --- a/src/core/build.h
> +++ b/src/core/build.h
> @@ -117,6 +117,12 @@
>  #define _BLKID_FEATURE_ "-BLKID"
>  #endif
>
> +#ifdef HAVE_LIBMOUNT
> +#define _LIBMOUNT_FEATURE_ "+LIBMOUNT"
> +#else
> +#define _LIBMOUNT_FEATURE_ "-LIBMOUNT"
> +#endif
> +
>  #ifdef HAVE_ELFUTILS
>  #define _ELFUTILS_FEATURE_ "+ELFUTILS"
>  #else
> @@ -152,6 +158,7 @@
>          _LZ4_FEATURE_ " "                                               \
>          _SECCOMP_FEATURE_ " "                                           \
>          _BLKID_FEATURE_ " "                                             \
> +        _LIBMOUNT_FEATURE_ " "                                          \
>          _ELFUTILS_FEATURE_ " "                                          \
>          _KMOD_FEATURE_ " "                                              \
>          _IDN_FEATURE_ " "
> diff --git a/src/core/mount.c b/src/core/mount.c
> index 8b787f6..a639515 100644
> --- a/src/core/mount.c
> +++ b/src/core/mount.c
> @@ -25,6 +25,12 @@
>  #include <sys/epoll.h>
>  #include <signal.h>
>
> +#ifdef HAVE_LIBMOUNT
> +#include <libmount.h>
> +#else
> +#define mnt_init_debug(m) do {} while (0)
> +#endif
> +
>  #include "manager.h"
>  #include "unit.h"
>  #include "mount.h"
> @@ -1492,6 +1498,58 @@ fail:
>          return r;
>  }
>
> +#ifdef HAVE_LIBMOUNT
> +
> +static inline void mnt_free_table_p(struct libmnt_table **tb) {
> +        mnt_free_table(*tb);
> +}
> +
> +static inline void mnt_free_iter_p(struct libmnt_iter **itr) {
> +        mnt_free_iter(*itr);
> +}
> +
> +static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
> +        _cleanup_(mnt_free_table_p) struct libmnt_table *tb = NULL;
> +        _cleanup_(mnt_free_iter_p) struct libmnt_iter *itr = NULL;
> +        struct libmnt_fs *fs;
> +        int r = 0;
> +
> +        assert(m);
> +
> +        tb = mnt_new_table();
> +        itr = mnt_new_iter(MNT_ITER_FORWARD);
> +        if (!tb || !itr)
> +                return log_oom();
> +
> +        mnt_table_parse_mtab(tb, NULL);
> +        if (r)
> +                return r;
> +
> +        while (mnt_table_next_fs(tb, itr, &fs) == 0) {
> +                const char *device, *path, *options, *fstype;
> +                _cleanup_free_ const char *d = NULL, *p = NULL;
> +                int k;
> +
> +                device = mnt_fs_get_source(fs);
> +                path = mnt_fs_get_target(fs);
> +                options = mnt_fs_get_options(fs);
> +                fstype = mnt_fs_get_fstype(fs);
> +
> +                d = cunescape(device);
> +                p = cunescape(path);
> +                if (!d || !p)
> +                        return log_oom();
> +
> +                k = mount_add_one(m, d, p, options, fstype, set_flags);
> +                if (k < 0)
> +                        r = k;
> +        }
> +
> +        return r;
> +}
> +
> +#else
> +
>  static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
>          int r = 0;
>          unsigned i;
> @@ -1548,6 +1606,8 @@ static int mount_load_proc_self_mountinfo(Manager
> *m, bool set_flags) {
>          return r;
>  }
>
> +#endif
> +
>  static void mount_shutdown(Manager *m) {
>          assert(m);
>
> @@ -1577,6 +1637,8 @@ static int mount_enumerate(Manager *m) {
>          int r;
>          assert(m);
>
> +        mnt_init_debug(0);
> +
>          if (!m->proc_self_mountinfo) {
>                  m->proc_self_mountinfo = fopen("/proc/self/mountinfo",
> "re");
>                  if (!m->proc_self_mountinfo)
> --
> 1.9.3
>
> _______________________________________________
> systemd-devel mailing list
> systemd-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/systemd-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/systemd-devel/attachments/20141115/bd62afe5/attachment-0001.html>


More information about the systemd-devel mailing list