]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
tree-wide: make use of new_mount_api() where it makes sense 3659/head
authorChristian Brauner <christian.brauner@ubuntu.com>
Fri, 5 Feb 2021 17:46:47 +0000 (18:46 +0100)
committerChristian Brauner <christian.brauner@ubuntu.com>
Fri, 5 Feb 2021 18:01:32 +0000 (19:01 +0100)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/cgroups/cgfsng.c
src/lxc/conf.c

index 45c2c0622904ee21e4fadca683ce11ae7b56aecb..cac8ce58a950c40d7ba2f82163c79e13f6b878ea 100644 (file)
@@ -1785,8 +1785,26 @@ static int __cg_mount_direct(int type, struct hierarchy *h,
                fstype = "cgroup";
        }
 
-       fd_fs = fs_prepare(fstype, -EBADF, "", 0, 0);
-       if (fd_fs < 0) {
+       if (new_mount_api()) {
+               fd_fs = fs_prepare(fstype, -EBADF, "", 0, 0);
+               if (fd_fs < 0)
+                       return log_error_errno(-errno, errno, "Failed to prepare filesystem context for %s", fstype);
+
+               if (!is_unified_hierarchy(h)) {
+                       for (const char **it = (const char **)h->controllers; it && *it; it++) {
+                               if (strncmp(*it, "name=", STRLITERALLEN("name=")) == 0)
+                                       ret = fs_set_property(fd_fs, "name", *it + STRLITERALLEN("name="));
+                               else
+                                       ret = fs_set_property(fd_fs, *it, "");
+                               if (ret < 0)
+                                       return log_error_errno(-errno, errno, "Failed to add %s controller to cgroup filesystem context %d(dev)", *it, fd_fs);
+                       }
+               }
+
+               ret = fs_attach(fd_fs, dfd_mnt_cgroupfs, hierarchy_mnt,
+                               PROTECT_OPATH_DIRECTORY, PROTECT_LOOKUP_BENEATH,
+                               flags);
+       } else {
                __do_free char *controllers = NULL, *target = NULL;
                unsigned int old_flags = 0;
                const char *rootfs_mnt;
@@ -1804,21 +1822,6 @@ static int __cg_mount_direct(int type, struct hierarchy *h,
 
                target = must_make_path(rootfs_mnt, DEFAULT_CGROUP_MOUNTPOINT, hierarchy_mnt, NULL);
                ret = safe_mount(NULL, target, fstype, old_flags, controllers, rootfs_mnt);
-       } else {
-               if (!is_unified_hierarchy(h)) {
-                       for (const char **it = (const char **)h->controllers; it && *it; it++) {
-                               if (strncmp(*it, "name=", STRLITERALLEN("name=")) == 0)
-                                       ret = fs_set_property(fd_fs, "name", *it + STRLITERALLEN("name="));
-                               else
-                                       ret = fs_set_property(fd_fs, *it, "");
-                               if (ret < 0)
-                                       return log_error_errno(-errno, errno, "Failed to add %s controller to cgroup filesystem context %d(dev)", *it, fd_fs);
-                       }
-               }
-
-               ret = fs_attach(fd_fs, dfd_mnt_cgroupfs, hierarchy_mnt,
-                               PROTECT_OPATH_DIRECTORY, PROTECT_LOOKUP_BENEATH,
-                               flags);
        }
        if (ret < 0)
                return log_error_errno(ret, errno, "Failed to mount %s filesystem onto %d(%s)",
@@ -1928,13 +1931,11 @@ __cgfsng_ops static bool cgfsng_mount(struct cgroup_ops *ops,
         * relying on RESOLVE_BENEATH so we need to skip the leading "/" in the
         * DEFAULT_CGROUP_MOUNTPOINT define.
         */
-       fd_fs = fs_prepare("tmpfs", -EBADF, "", 0, 0);
-       if (fd_fs < 0) {
-               cgroup_root = must_make_path(rootfs_mnt, DEFAULT_CGROUP_MOUNTPOINT, NULL);
-               ret = safe_mount(NULL, cgroup_root, "tmpfs",
-                                MS_NOSUID | MS_NODEV | MS_NOEXEC | MS_RELATIME,
-                                "size=10240k,mode=755", rootfs_mnt);
-       } else {
+       if (new_mount_api()) {
+               fd_fs = fs_prepare("tmpfs", -EBADF, "", 0, 0);
+               if (fd_fs < 0)
+                       return log_error_errno(-errno, errno, "Failed to create new filesystem context for tmpfs");
+
                ret = fs_set_property(fd_fs, "mode", "0755");
                if (ret < 0)
                        return log_error_errno(-errno, errno, "Failed to mount tmpfs onto %d(dev)", fd_fs);
@@ -1947,6 +1948,11 @@ __cgfsng_ops static bool cgfsng_mount(struct cgroup_ops *ops,
                                PROTECT_OPATH_DIRECTORY, PROTECT_LOOKUP_BENEATH_XDEV,
                                MOUNT_ATTR_NOSUID | MOUNT_ATTR_NODEV |
                                MOUNT_ATTR_NOEXEC | MOUNT_ATTR_RELATIME);
+       } else {
+               cgroup_root = must_make_path(rootfs_mnt, DEFAULT_CGROUP_MOUNTPOINT, NULL);
+               ret = safe_mount(NULL, cgroup_root, "tmpfs",
+                                MS_NOSUID | MS_NODEV | MS_NOEXEC | MS_RELATIME,
+                                "size=10240k,mode=755", rootfs_mnt);
        }
        if (ret < 0)
                return log_error_errno(false, errno, "Failed to mount tmpfs on %s",
index d436467bfc068ccd3287180cde0a04e3b5e8dc10..095c94bb0bf22b498eaacbea91df3d6ed6441df5 100644 (file)
@@ -1077,20 +1077,11 @@ static int mount_autodev(const char *name, const struct lxc_rootfs *rootfs,
                goto reset_umask;
        }
 
-       fd_fs = fs_prepare("tmpfs", -EBADF, "", 0, 0);
-       if (fd_fs < 0) {
-               __do_free char *fallback_path = NULL;
-
-               sprintf(mount_options, "size=%zu,mode=755", tmpfs_size);
-               DEBUG("Using mount options: %s", mount_options);
+       if (new_mount_api()) {
+               fd_fs = fs_prepare("tmpfs", -EBADF, "", 0, 0);
+               if (fd_fs < 0)
+                       return log_error_errno(-errno, errno, "Failed to prepare filesystem context for tmpfs");
 
-               if (path) {
-                       fallback_path = must_make_path(path, "/dev", NULL);
-                       ret = safe_mount("none", fallback_path, "tmpfs", 0, mount_options, path);
-               } else {
-                       ret = safe_mount("none", "dev", "tmpfs", 0, mount_options, NULL);
-               }
-       } else {
                sprintf(mount_options, "%zu", tmpfs_size);
 
                ret = fs_set_property(fd_fs, "mode", "0755");
@@ -1102,6 +1093,18 @@ static int mount_autodev(const char *name, const struct lxc_rootfs *rootfs,
                        return log_error_errno(-errno, errno, "Failed to mount tmpfs onto %d(dev)", fd_fs);
 
                ret = fs_attach(fd_fs, rootfs->dfd_mnt, "dev", PROTECT_OPATH_DIRECTORY, PROTECT_LOOKUP_BENEATH, 0);
+       } else {
+               __do_free char *fallback_path = NULL;
+
+               sprintf(mount_options, "size=%zu,mode=755", tmpfs_size);
+               DEBUG("Using mount options: %s", mount_options);
+
+               if (path) {
+                       fallback_path = must_make_path(path, "/dev", NULL);
+                       ret = safe_mount("none", fallback_path, "tmpfs", 0, mount_options, path);
+               } else {
+                       ret = safe_mount("none", "dev", "tmpfs", 0, mount_options, NULL);
+               }
        }
        if (ret < 0) {
                SYSERROR("Failed to mount tmpfs on \"%s\"", path);
@@ -1217,23 +1220,16 @@ static int lxc_fill_autodev(const struct lxc_rootfs *rootfs)
                if (ret < 0 || (size_t)ret >= sizeof(device_path))
                        return ret_errno(EIO);
 
-               ret = fd_bind_mount(rootfs->dfd_host, device_path,
-                                   PROTECT_OPATH_FILE,
-                                   PROTECT_LOOKUP_BENEATH_XDEV,
-                                   rootfs->dfd_dev, device->name,
-                                   PROTECT_OPATH_FILE,
-                                   PROTECT_LOOKUP_BENEATH, 0, false);
-               if (ret < 0) {
+               if (new_mount_api()) {
+                       ret = fd_bind_mount(rootfs->dfd_host, device_path,
+                                           PROTECT_OPATH_FILE,
+                                           PROTECT_LOOKUP_BENEATH_XDEV,
+                                           rootfs->dfd_dev, device->name,
+                                           PROTECT_OPATH_FILE,
+                                           PROTECT_LOOKUP_BENEATH, 0, false);
+               } else {
                        char path[PATH_MAX];
 
-                       if (errno != ENOSYS)
-                               return log_error_errno(-errno, errno,
-                                                      "Failed to mount %d(%s) to %d(%s)",
-                                                      rootfs->dfd_host,
-                                                      device_path,
-                                                      rootfs->dfd_dev,
-                                                      device->name);
-
                        ret = snprintf(device_path, sizeof(device_path), "/dev/%s", device->name);
                        if (ret < 0 || (size_t)ret >= sizeof(device_path))
                                return ret_errno(EIO);