#include <errno.h>
#include <fcntl.h>
#include <getopt.h>
+#include <inttypes.h>
#include <libgen.h>
#include <pthread.h>
#include <sched.h>
unlock_mutex(&user_count_mutex);
}
+/* Returns file info type of custom type declaration carried
+ * in fuse_file_info */
+static inline enum lxcfs_virt_t file_info_type(struct fuse_file_info *fi)
+{
+ struct file_info *f;
+
+ f = INTTYPE_TO_PTR(fi->fh);
+ if (!f)
+ return -1;
+
+ if (!LXCFS_TYPE_OK(f->type))
+ return -1;
+
+ return f->type;
+}
+
static pthread_t loadavg_pid = 0;
/* Returns zero on success */
static int lxcfs_releasedir(const char *path, struct fuse_file_info *fi)
{
int ret;
+ enum lxcfs_virt_t type;
- if (strcmp(path, "/") == 0)
- return 0;
+ type = file_info_type(fi);
- if (strncmp(path, "/cgroup", 7) == 0) {
+ if (LXCFS_TYPE_CGROUP(type)) {
up_users();
ret = do_cg_releasedir(path, fi);
down_users();
return ret;
}
- if (strcmp(path, "/proc") == 0)
- return 0;
-
- if (strncmp(path, "/sys", 4) == 0) {
+ if (LXCFS_TYPE_SYS(type)) {
up_users();
ret = do_sys_releasedir(path, fi);
down_users();
return ret;
}
+ if (path) {
+ if (strcmp(path, "/") == 0)
+ return 0;
+ if (strcmp(path, "/proc") == 0)
+ return 0;
+ }
+
+ lxcfs_error("unknown file type: path=%s, type=%d, fi->fh=%" PRIu64,
+ path, type, fi->fh);
+
return -EINVAL;
}
static int lxcfs_release(const char *path, struct fuse_file_info *fi)
{
int ret;
+ enum lxcfs_virt_t type;
- if (strncmp(path, "/cgroup", 7) == 0) {
+ type = file_info_type(fi);
+
+ if (LXCFS_TYPE_CGROUP(type)) {
up_users();
ret = do_cg_release(path, fi);
down_users();
return ret;
}
- if (strncmp(path, "/proc", 5) == 0) {
+ if (LXCFS_TYPE_PROC(type)) {
up_users();
ret = do_proc_release(path, fi);
down_users();
return ret;
}
- if (strncmp(path, "/sys", 4) == 0) {
+ if (LXCFS_TYPE_SYS(type)) {
up_users();
ret = do_sys_release(path, fi);
down_users();
return ret;
}
+ lxcfs_error("unknown file type: path=%s, type=%d, fi->fh=%" PRIu64,
+ path, type, fi->fh);
+
return -EINVAL;
}
if (lxcfs_init_library() < 0)
return NULL;
+#if HAVE_FUSE3
+ cfg->direct_io = 1;
+#endif
+
return fuse_get_context()->private_data;
}
}
if (append_comma_separate(&new_fuse_opts, "direct_io")) {
- lxcfs_error("Failed to copy fuse argument \"nonempty\"");
+ lxcfs_error("Failed to copy fuse argument \"direct_io\"");
goto out;
}
#endif