[lxc-devel] [lxcfs/master] Add support for fuse3
alliedtelesis on Github
lxc-bot at linuxcontainers.org
Thu Sep 3 00:58:33 UTC 2020
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 366 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20200902/306ba5aa/attachment.bin>
-------------- next part --------------
From 09dffa69e29f492cedc0d296be37e57c4e50f6fe Mon Sep 17 00:00:00 2001
From: Scott Parlane <scott.parlane at alliedtelesis.co.nz>
Date: Thu, 3 Sep 2020 12:54:39 +1200
Subject: [PATCH] Add support for fuse3
Signed-off-by: Scott Parlane <scott.parlane at alliedtelesis.co.nz>
---
configure.ac | 4 ++-
src/bindings.c | 9 ++++++-
src/cgroup_fuse.c | 20 ++++++++++-----
src/cgroups/cgfsng.c | 9 ++++++-
src/cgroups/cgroup.c | 9 ++++++-
src/cgroups/cgroup2_devices.c | 9 ++++++-
src/cgroups/cgroup_utils.c | 9 ++++++-
src/cpuset_parse.c | 9 ++++++-
src/lxcfs.c | 47 ++++++++++++++++++++++++++++++-----
src/proc_cpuview.c | 9 ++++++-
src/proc_fuse.c | 28 +++++++++++++--------
src/proc_loadavg.c | 9 ++++++-
src/sysfs_fuse.c | 34 +++++++++++++++----------
src/utils.c | 9 ++++++-
14 files changed, 169 insertions(+), 45 deletions(-)
diff --git a/configure.ac b/configure.ac
index 4092883..90bcd8d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -60,7 +60,9 @@ AC_CONFIG_FILES([
AC_CHECK_LIB(pthread, main)
-PKG_CHECK_MODULES(FUSE, fuse)
+PKG_CHECK_MODULES(FUSE, fuse, [], [
+ PKG_CHECK_MODULES(FUSE, fuse3, [AC_DEFINE([HAVE_FUSE3], [1], [Use fuse3])])
+])
AC_PATH_PROG(HELP2MAN, help2man, false // No help2man //)
AM_CONDITIONAL([HAVE_HELP2MAN], [test "x$HELP2MAN" != "xfalse // No help2man //" ])
diff --git a/src/bindings.c b/src/bindings.c
index 74716d1..6f395fb 100644
--- a/src/bindings.c
+++ b/src/bindings.c
@@ -4,9 +4,17 @@
#define _GNU_SOURCE
#endif
+#include "config.h"
+
+#ifdef HAVE_FUSE3
+#ifndef FUSE_USE_VERSION
+#define FUSE_USE_VERSION 30
+#endif
+#else
#ifndef FUSE_USE_VERSION
#define FUSE_USE_VERSION 26
#endif
+#endif
#define _FILE_OFFSET_BITS 64
@@ -43,7 +51,6 @@
#include "cgroup_fuse.h"
#include "cgroups/cgroup.h"
#include "cgroups/cgroup_utils.h"
-#include "config.h"
#include "memory_utils.h"
#include "proc_cpuview.h"
#include "syscall_numbers.h"
diff --git a/src/cgroup_fuse.c b/src/cgroup_fuse.c
index d4bdac1..b9d09f9 100644
--- a/src/cgroup_fuse.c
+++ b/src/cgroup_fuse.c
@@ -4,9 +4,17 @@
#define _GNU_SOURCE
#endif
+#include "config.h"
+
+#ifdef HAVE_FUSE3
+#ifndef FUSE_USE_VERSION
+#define FUSE_USE_VERSION 30
+#endif
+#else
#ifndef FUSE_USE_VERSION
#define FUSE_USE_VERSION 26
#endif
+#endif
#define _FILE_OFFSET_BITS 64
@@ -40,9 +48,9 @@
#include <sys/vfs.h>
#include "bindings.h"
-#include "config.h"
#include "cgroups/cgroup.h"
#include "cgroups/cgroup_utils.h"
+#include "fuse_compat.h"
#include "memory_utils.h"
#include "utils.h"
@@ -1953,7 +1961,7 @@ __lxcfs_fuse_ops int cg_readdir(const char *path, void *buf,
if (!fc || !cgroup_ops || pure_unified_layout(cgroup_ops))
return -EIO;
- if (filler(buf, ".", NULL, 0) != 0 || filler(buf, "..", NULL, 0) != 0)
+ if (DIR_FILLER(filler, buf, ".", NULL, 0) != 0 || DIR_FILLER(filler, buf, "..", NULL, 0) != 0)
return -EIO;
if (d->type != LXC_TYPE_CGDIR) {
@@ -1969,7 +1977,7 @@ __lxcfs_fuse_ops int cg_readdir(const char *path, void *buf,
if (is_unified_hierarchy(*h))
continue;
- if ((*h)->__controllers && filler(buf, (*h)->__controllers, NULL, 0))
+ if ((*h)->__controllers && DIR_FILLER(filler, buf, (*h)->__controllers, NULL, 0))
return -EIO;
}
@@ -1987,7 +1995,7 @@ __lxcfs_fuse_ops int cg_readdir(const char *path, void *buf,
initpid = fc->pid;
if (!caller_is_in_ancestor(initpid, d->controller, d->cgroup, &nextcg)) {
if (nextcg) {
- ret = filler(buf, nextcg, NULL, 0);
+ ret = DIR_FILLER(filler, buf, nextcg, NULL, 0);
free(nextcg);
if (ret != 0) {
ret = -EIO;
@@ -1999,7 +2007,7 @@ __lxcfs_fuse_ops int cg_readdir(const char *path, void *buf,
}
for (i = 0; list && list[i]; i++) {
- if (filler(buf, list[i]->name, NULL, 0) != 0) {
+ if (DIR_FILLER(filler, buf, list[i]->name, NULL, 0) != 0) {
ret = -EIO;
goto out;
}
@@ -2013,7 +2021,7 @@ __lxcfs_fuse_ops int cg_readdir(const char *path, void *buf,
}
if (clist) {
for (i = 0; clist[i]; i++) {
- if (filler(buf, clist[i], NULL, 0) != 0) {
+ if (DIR_FILLER(filler, buf, clist[i], NULL, 0) != 0) {
ret = -EIO;
goto out;
}
diff --git a/src/cgroups/cgfsng.c b/src/cgroups/cgfsng.c
index cf891b3..824b0e7 100644
--- a/src/cgroups/cgfsng.c
+++ b/src/cgroups/cgfsng.c
@@ -16,9 +16,17 @@
#define _GNU_SOURCE
#endif
+#include "../config.h"
+
+#ifdef HAVE_FUSE3
+#ifndef FUSE_USE_VERSION
+#define FUSE_USE_VERSION 30
+#endif
+#else
#ifndef FUSE_USE_VERSION
#define FUSE_USE_VERSION 26
#endif
+#endif
#define _FILE_OFFSET_BITS 64
@@ -38,7 +46,6 @@
#include <sys/types.h>
#include <unistd.h>
-#include "../config.h"
#include "../macro.h"
#include "../memory_utils.h"
#include "../utils.h"
diff --git a/src/cgroups/cgroup.c b/src/cgroups/cgroup.c
index 6fe1902..26c87ae 100644
--- a/src/cgroups/cgroup.c
+++ b/src/cgroups/cgroup.c
@@ -4,9 +4,17 @@
#define _GNU_SOURCE
#endif
+#include "../config.h"
+
+#ifdef HAVE_FUSE3
+#ifndef FUSE_USE_VERSION
+#define FUSE_USE_VERSION 30
+#endif
+#else
#ifndef FUSE_USE_VERSION
#define FUSE_USE_VERSION 26
#endif
+#endif
#define _FILE_OFFSET_BITS 64
@@ -30,7 +38,6 @@
#include <sys/vfs.h>
#include <unistd.h>
-#include "../config.h"
#include "../macro.h"
#include "../memory_utils.h"
#include "cgroup.h"
diff --git a/src/cgroups/cgroup2_devices.c b/src/cgroups/cgroup2_devices.c
index 30e2e46..c40b087 100644
--- a/src/cgroups/cgroup2_devices.c
+++ b/src/cgroups/cgroup2_devices.c
@@ -6,9 +6,17 @@
#define _GNU_SOURCE
#endif
+#include "../config.h"
+
+#ifdef HAVE_FUSE3
+#ifndef FUSE_USE_VERSION
+#define FUSE_USE_VERSION 30
+#endif
+#else
#ifndef FUSE_USE_VERSION
#define FUSE_USE_VERSION 26
#endif
+#endif
#define _FILE_OFFSET_BITS 64
@@ -22,7 +30,6 @@
#include <sys/types.h>
#include <unistd.h>
-#include "../config.h"
#include "../macro.h"
#include "../memory_utils.h"
#include "cgroup2_devices.h"
diff --git a/src/cgroups/cgroup_utils.c b/src/cgroups/cgroup_utils.c
index 078f864..5165a09 100644
--- a/src/cgroups/cgroup_utils.c
+++ b/src/cgroups/cgroup_utils.c
@@ -4,9 +4,17 @@
#define _GNU_SOURCE
#endif
+#include "../config.h"
+
+#ifdef HAVE_FUSE3
+#ifndef FUSE_USE_VERSION
+#define FUSE_USE_VERSION 30
+#endif
+#else
#ifndef FUSE_USE_VERSION
#define FUSE_USE_VERSION 26
#endif
+#endif
#define _FILE_OFFSET_BITS 64
@@ -22,7 +30,6 @@
#include <sys/vfs.h>
#include <unistd.h>
-#include "../config.h"
#include "../macro.h"
#include "../memory_utils.h"
#include "cgroup.h"
diff --git a/src/cpuset_parse.c b/src/cpuset_parse.c
index 55534d6..58453f0 100644
--- a/src/cpuset_parse.c
+++ b/src/cpuset_parse.c
@@ -4,9 +4,17 @@
#define _GNU_SOURCE
#endif
+#include "config.h"
+
+#ifdef HAVE_FUSE3
+#ifndef FUSE_USE_VERSION
+#define FUSE_USE_VERSION 30
+#endif
+#else
#ifndef FUSE_USE_VERSION
#define FUSE_USE_VERSION 26
#endif
+#endif
#define _FILE_OFFSET_BITS 64
@@ -20,7 +28,6 @@
#include "bindings.h"
#include "cgroups/cgroup.h"
#include "cgroups/cgroup_utils.h"
-#include "config.h"
#include "memory_utils.h"
#include "proc_loadavg.h"
#include "utils.h"
diff --git a/src/lxcfs.c b/src/lxcfs.c
index 94256d4..cde5f4a 100644
--- a/src/lxcfs.c
+++ b/src/lxcfs.c
@@ -4,9 +4,17 @@
#define _GNU_SOURCE
#endif
+#include "config.h"
+
+#ifdef HAVE_FUSE3
+#ifndef FUSE_USE_VERSION
+#define FUSE_USE_VERSION 30
+#endif
+#else
#ifndef FUSE_USE_VERSION
#define FUSE_USE_VERSION 26
#endif
+#endif
#define _FILE_OFFSET_BITS 64
@@ -33,7 +41,7 @@
#include <linux/limits.h>
#include "bindings.h"
-#include "config.h"
+#include "fuse_compat.h"
#include "macro.h"
#include "memory_utils.h"
@@ -562,7 +570,11 @@ static int do_sys_releasedir(const char *path, struct fuse_file_info *fi)
return __sys_releasedir(path, fi);
}
+#ifdef HAVE_FUSE3
+static int lxcfs_getattr(const char *path, struct stat *sb, struct fuse_file_info *fi)
+#else
static int lxcfs_getattr(const char *path, struct stat *sb)
+#endif
{
int ret;
struct timespec now;
@@ -625,17 +637,22 @@ static int lxcfs_opendir(const char *path, struct fuse_file_info *fi)
return -ENOENT;
}
+#ifdef HAVE_FUSE3
+static int lxcfs_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
+ off_t offset, struct fuse_file_info *fi, enum fuse_readdir_flags flags)
+#else
static int lxcfs_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
off_t offset, struct fuse_file_info *fi)
+#endif
{
int ret;
if (strcmp(path, "/") == 0) {
- if (filler(buf, ".", NULL, 0) != 0 ||
- filler(buf, "..", NULL, 0) != 0 ||
- filler(buf, "proc", NULL, 0) != 0 ||
- filler(buf, "sys", NULL, 0) != 0 ||
- filler(buf, "cgroup", NULL, 0) != 0)
+ if (DIR_FILLER(filler, buf, ".", NULL, 0) != 0 ||
+ DIR_FILLER(filler, buf, "..", NULL, 0) != 0 ||
+ DIR_FILLER(filler, buf, "proc", NULL, 0) != 0 ||
+ DIR_FILLER(filler, buf, "sys", NULL, 0) != 0 ||
+ DIR_FILLER(filler, buf, "cgroup", NULL, 0) != 0)
return -ENOMEM;
return 0;
@@ -847,7 +864,11 @@ int lxcfs_mkdir(const char *path, mode_t mode)
return -EPERM;
}
+#ifdef HAVE_FUSE3
+int lxcfs_chown(const char *path, uid_t uid, gid_t gid, struct fuse_file_info *fi)
+#else
int lxcfs_chown(const char *path, uid_t uid, gid_t gid)
+#endif
{
int ret;
@@ -872,7 +893,11 @@ int lxcfs_chown(const char *path, uid_t uid, gid_t gid)
* really make sense for cgroups. So just return 0 always but do
* nothing.
*/
+#ifdef HAVE_FUSE3
+int lxcfs_truncate(const char *path, off_t newsize, struct fuse_file_info *fi)
+#else
int lxcfs_truncate(const char *path, off_t newsize)
+#endif
{
if (strncmp(path, "/cgroup", 7) == 0)
return 0;
@@ -894,7 +919,11 @@ int lxcfs_rmdir(const char *path)
return -EPERM;
}
+#ifdef HAVE_FUSE3
+int lxcfs_chmod(const char *path, mode_t mode, struct fuse_file_info *fi)
+#else
int lxcfs_chmod(const char *path, mode_t mode)
+#endif
{
int ret;
@@ -934,10 +963,14 @@ const struct fuse_operations lxcfs_ops = {
.create = NULL,
.destroy = NULL,
+#ifndef HAVE_FUSE3
.fgetattr = NULL,
+#endif
.fsyncdir = NULL,
+#ifndef HAVE_FUSE3
.ftruncate = NULL,
.getdir = NULL,
+#endif
.getxattr = NULL,
.init = NULL,
.link = NULL,
@@ -950,7 +983,9 @@ const struct fuse_operations lxcfs_ops = {
.statfs = NULL,
.symlink = NULL,
.unlink = NULL,
+#ifndef HAVE_FUSE3
.utime = NULL,
+#endif
};
static void usage()
diff --git a/src/proc_cpuview.c b/src/proc_cpuview.c
index 7d6c0bd..b004663 100644
--- a/src/proc_cpuview.c
+++ b/src/proc_cpuview.c
@@ -4,9 +4,17 @@
#define _GNU_SOURCE
#endif
+#include "config.h"
+
+#ifdef HAVE_FUSE3
+#ifndef FUSE_USE_VERSION
+#define FUSE_USE_VERSION 30
+#endif
+#else
#ifndef FUSE_USE_VERSION
#define FUSE_USE_VERSION 26
#endif
+#endif
#define _FILE_OFFSET_BITS 64
@@ -40,7 +48,6 @@
#include <sys/vfs.h>
#include "bindings.h"
-#include "config.h"
#include "cgroup_fuse.h"
#include "cpuset_parse.h"
#include "cgroups/cgroup.h"
diff --git a/src/proc_fuse.c b/src/proc_fuse.c
index a99162c..517c57e 100644
--- a/src/proc_fuse.c
+++ b/src/proc_fuse.c
@@ -4,9 +4,17 @@
#define _GNU_SOURCE
#endif
+#include "config.h"
+
+#ifdef HAVE_FUSE3
+#ifndef FUSE_USE_VERSION
+#define FUSE_USE_VERSION 30
+#endif
+#else
#ifndef FUSE_USE_VERSION
#define FUSE_USE_VERSION 26
#endif
+#endif
#define _FILE_OFFSET_BITS 64
@@ -40,11 +48,11 @@
#include <sys/vfs.h>
#include "bindings.h"
-#include "config.h"
#include "cgroup_fuse.h"
#include "cgroups/cgroup.h"
#include "cgroups/cgroup_utils.h"
#include "cpuset_parse.h"
+#include "fuse_compat.h"
#include "memory_utils.h"
#include "proc_loadavg.h"
#include "proc_cpuview.h"
@@ -108,15 +116,15 @@ __lxcfs_fuse_ops int proc_readdir(const char *path, void *buf,
fuse_fill_dir_t filler, off_t offset,
struct fuse_file_info *fi)
{
- if (filler(buf, ".", NULL, 0) != 0 ||
- filler(buf, "..", NULL, 0) != 0 ||
- filler(buf, "cpuinfo", NULL, 0) != 0 ||
- filler(buf, "meminfo", NULL, 0) != 0 ||
- filler(buf, "stat", NULL, 0) != 0 ||
- filler(buf, "uptime", NULL, 0) != 0 ||
- filler(buf, "diskstats", NULL, 0) != 0 ||
- filler(buf, "swaps", NULL, 0) != 0 ||
- filler(buf, "loadavg", NULL, 0) != 0)
+ if (DIR_FILLER(filler, buf, ".", NULL, 0) != 0 ||
+ DIR_FILLER(filler, buf, "..", NULL, 0) != 0 ||
+ DIR_FILLER(filler, buf, "cpuinfo", NULL, 0) != 0 ||
+ DIR_FILLER(filler, buf, "meminfo", NULL, 0) != 0 ||
+ DIR_FILLER(filler, buf, "stat", NULL, 0) != 0 ||
+ DIR_FILLER(filler, buf, "uptime", NULL, 0) != 0 ||
+ DIR_FILLER(filler, buf, "diskstats", NULL, 0) != 0 ||
+ DIR_FILLER(filler, buf, "swaps", NULL, 0) != 0 ||
+ DIR_FILLER(filler, buf, "loadavg", NULL, 0) != 0)
return -EINVAL;
return 0;
diff --git a/src/proc_loadavg.c b/src/proc_loadavg.c
index 7a7a39e..ca90b06 100644
--- a/src/proc_loadavg.c
+++ b/src/proc_loadavg.c
@@ -4,9 +4,17 @@
#define _GNU_SOURCE
#endif
+#include "config.h"
+
+#ifdef HAVE_FUSE3
+#ifndef FUSE_USE_VERSION
+#define FUSE_USE_VERSION 30
+#endif
+#else
#ifndef FUSE_USE_VERSION
#define FUSE_USE_VERSION 26
#endif
+#endif
#define _FILE_OFFSET_BITS 64
@@ -40,7 +48,6 @@
#include <sys/vfs.h>
#include "bindings.h"
-#include "config.h"
#include "cgroup_fuse.h"
#include "cgroups/cgroup.h"
#include "cgroups/cgroup_utils.h"
diff --git a/src/sysfs_fuse.c b/src/sysfs_fuse.c
index d6f7876..575e932 100644
--- a/src/sysfs_fuse.c
+++ b/src/sysfs_fuse.c
@@ -4,9 +4,17 @@
#define _GNU_SOURCE
#endif
+#include "config.h"
+
+#ifdef HAVE_FUSE3
+#ifndef FUSE_USE_VERSION
+#define FUSE_USE_VERSION 30
+#endif
+#else
#ifndef FUSE_USE_VERSION
#define FUSE_USE_VERSION 26
#endif
+#endif
#define _FILE_OFFSET_BITS 64
@@ -41,7 +49,7 @@
#include "bindings.h"
#include "memory_utils.h"
#include "cgroups/cgroup.h"
-#include "config.h"
+#include "fuse_compat.h"
#include "sysfs_fuse.h"
#include "utils.h"
@@ -184,33 +192,33 @@ __lxcfs_fuse_ops int sys_readdir(const char *path, void *buf,
struct fuse_file_info *fi)
{
if (strcmp(path, "/sys") == 0) {
- if (filler(buf, ".", NULL, 0) != 0 ||
- filler(buf, "..", NULL, 0) != 0 ||
- filler(buf, "devices", NULL, 0) != 0)
+ if (DIR_FILLER(filler, buf, ".", NULL, 0) != 0 ||
+ DIR_FILLER(filler, buf, "..", NULL, 0) != 0 ||
+ DIR_FILLER(filler, buf, "devices", NULL, 0) != 0)
return -ENOENT;
return 0;
}
if (strcmp(path, "/sys/devices") == 0) {
- if (filler(buf, ".", NULL, 0) != 0 ||
- filler(buf, "..", NULL, 0) != 0 ||
- filler(buf, "system", NULL, 0) != 0)
+ if (DIR_FILLER(filler, buf, ".", NULL, 0) != 0 ||
+ DIR_FILLER(filler, buf, "..", NULL, 0) != 0 ||
+ DIR_FILLER(filler, buf, "system", NULL, 0) != 0)
return -ENOENT;
return 0;
}
if (strcmp(path, "/sys/devices/system") == 0) {
- if (filler(buf, ".", NULL, 0) != 0 ||
- filler(buf, "..", NULL, 0) != 0 ||
- filler(buf, "cpu", NULL, 0) != 0)
+ if (DIR_FILLER(filler, buf, ".", NULL, 0) != 0 ||
+ DIR_FILLER(filler, buf, "..", NULL, 0) != 0 ||
+ DIR_FILLER(filler, buf, "cpu", NULL, 0) != 0)
return -ENOENT;
return 0;
}
if (strcmp(path, "/sys/devices/system/cpu") == 0) {
- if (filler(buf, ".", NULL, 0) != 0 ||
- filler(buf, "..", NULL, 0) != 0 ||
- filler(buf, "online", NULL, 0) != 0)
+ if (DIR_FILLER(filler, buf, ".", NULL, 0) != 0 ||
+ DIR_FILLER(filler, buf, "..", NULL, 0) != 0 ||
+ DIR_FILLER(filler, buf, "online", NULL, 0) != 0)
return -ENOENT;
return 0;
diff --git a/src/utils.c b/src/utils.c
index fcb7d61..65629eb 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -4,9 +4,17 @@
#define _GNU_SOURCE
#endif
+#include "config.h"
+
+#ifdef HAVE_FUSE3
+#ifndef FUSE_USE_VERSION
+#define FUSE_USE_VERSION 30
+#endif
+#else
#ifndef FUSE_USE_VERSION
#define FUSE_USE_VERSION 26
#endif
+#endif
#define _FILE_OFFSET_BITS 64
@@ -29,7 +37,6 @@
#include <unistd.h>
#include "bindings.h"
-#include "config.h"
#include "macro.h"
#include "memory_utils.h"
#include "utils.h"
More information about the lxc-devel
mailing list