From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id A068B7C3A2 for ; Fri, 15 Jul 2022 09:47:53 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 8FB1C2538F for ; Fri, 15 Jul 2022 09:47:53 +0200 (CEST) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS for ; Fri, 15 Jul 2022 09:47:51 +0200 (CEST) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 9F6D642263 for ; Fri, 15 Jul 2022 09:47:51 +0200 (CEST) From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= To: pve-devel@lists.proxmox.com Date: Fri, 15 Jul 2022 09:47:42 +0200 Message-Id: <20220715074742.3387301-1-f.gruenbichler@proxmox.com> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL -0.081 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment KAM_NUMSUBJECT 0.5 Subject ends in numbers excluding current years SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record T_SCC_BODY_TEXT_LINE -0.01 - Subject: [pve-devel] [RFC cluster] switch to fuse3 X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 15 Jul 2022 07:47:53 -0000 the new file info and flag parameters can be ignored (for now), except for the rename flags, which must be handled. Signed-off-by: Fabian Grünbichler --- since I had it lying around from the double auth key rotation investigation.. there is some more things we could do like implementing the rename flags, using fi->fh to correlate opens and other operations on the opened file, or the big elephant, switching to low level fuse ;) I gave this a rough spin while doing the auth key tests (but reverted to stock when the invalidate cache via fuse3 approach turned out to be infeasible), so this likely needs some more exposure. data/src/Makefile | 4 ++-- data/src/cfs-plug.h | 2 +- data/src/loop.h | 2 +- data/src/cfs-plug-memdb.c | 6 +++--- data/src/cfs-plug.c | 11 ++++++----- data/src/pmxcfs.c | 39 +++++++++++++++++++++------------------ 6 files changed, 34 insertions(+), 30 deletions(-) diff --git a/data/src/Makefile b/data/src/Makefile index 1f39f67..87fedf8 100644 --- a/data/src/Makefile +++ b/data/src/Makefile @@ -1,8 +1,8 @@ -DEPENDENCIES=libcpg libcmap libquorum libqb glib-2.0 fuse sqlite3 librrd +DEPENDENCIES=libcpg libcmap libquorum libqb glib-2.0 fuse3 sqlite3 librrd CC = gcc -CFLAGS += -std=gnu99 +CFLAGS += -std=gnu11 CFLAGS += -Wall -Werror -Wno-unknown-pragmas -Wno-strict-aliasing CFLAGS += -Wpedantic CFLAGS += -g -O2 -Wl,-z,relro diff --git a/data/src/cfs-plug.h b/data/src/cfs-plug.h index 5837ca8..cf94122 100644 --- a/data/src/cfs-plug.h +++ b/data/src/cfs-plug.h @@ -23,7 +23,7 @@ #ifndef _PVE_CFS_PLUG_H_ #define _PVE_CFS_PLUG_H_ -#define FUSE_USE_VERSION 26 +#define FUSE_USE_VERSION 310 #include #include diff --git a/data/src/loop.h b/data/src/loop.h index 68b783c..b92da61 100644 --- a/data/src/loop.h +++ b/data/src/loop.h @@ -21,7 +21,7 @@ #ifndef _PVE_LOOP_H_ #define _PVE_LOOP_H_ -#define FUSE_USE_VERSION 26 +#define FUSE_USE_VERSION 310 #include #include diff --git a/data/src/cfs-plug-memdb.c b/data/src/cfs-plug-memdb.c index b7a5567..4e2ff7b 100644 --- a/data/src/cfs-plug-memdb.c +++ b/data/src/cfs-plug-memdb.c @@ -161,8 +161,8 @@ static int cfs_plug_memdb_readdir( if (dirlist) { - filler(buf, ".", NULL, 0); - filler(buf, "..", NULL, 0); + filler(buf, ".", NULL, 0, 0); + filler(buf, "..", NULL, 0, 0); struct stat stbuf; memset(&stbuf, 0, sizeof(struct stat)); @@ -172,7 +172,7 @@ static int cfs_plug_memdb_readdir( memdb_tree_entry_t *te = (memdb_tree_entry_t *)l->data; tree_entry_stat(te, &stbuf, 0); - filler(buf, te->name, &stbuf, 0); + filler(buf, te->name, &stbuf, 0, 0); l = g_list_next(l); } diff --git a/data/src/cfs-plug.c b/data/src/cfs-plug.c index 108ed6b..2e6efab 100644 --- a/data/src/cfs-plug.c +++ b/data/src/cfs-plug.c @@ -115,7 +115,8 @@ static int tmp_hash_filler ( void *buf, const char *name, const struct stat *stbuf, - off_t off) { + off_t off, + enum fuse_fill_dir_flags flags) { struct hash_filler *hf = (struct hash_filler *)buf; @@ -125,7 +126,7 @@ static int tmp_hash_filler ( if (name[0] == '.' && (name[1] == 0 || (name[1] == '.' && name[2] == 0))) return 0; - hf->filler(hf->buf, name, stbuf, off); + hf->filler(hf->buf, name, stbuf, off, flags); return 0; } @@ -148,8 +149,8 @@ static int cfs_plug_base_readdir(cfs_plug_t *plug, const char *path, void *buf, int ret = -EACCES; - filler(buf, ".", NULL, 0); - filler(buf, "..", NULL, 0); + filler(buf, ".", NULL, 0, 0); + filler(buf, "..", NULL, 0, 0); if (!path[0]) { GHashTableIter iter; @@ -158,7 +159,7 @@ static int cfs_plug_base_readdir(cfs_plug_t *plug, const char *path, void *buf, g_hash_table_iter_init (&iter, bplug->entries); while (g_hash_table_iter_next (&iter, &key, &value)) { - filler(buf, key, NULL, 0); + filler(buf, key, NULL, 0, 0); } } diff --git a/data/src/pmxcfs.c b/data/src/pmxcfs.c index d78a248..cd9dda0 100644 --- a/data/src/pmxcfs.c +++ b/data/src/pmxcfs.c @@ -117,12 +117,12 @@ static cfs_plug_t *find_plug(const char *path, char **sub) return plug; } -void *cfs_fuse_init(struct fuse_conn_info *conn) +void *cfs_fuse_init(struct fuse_conn_info *conn, struct fuse_config *config) { return NULL; } -static int cfs_fuse_getattr(const char *path, struct stat *stbuf) +static int cfs_fuse_getattr(const char *path, struct stat *stbuf, struct fuse_file_info *file_info) { cfs_debug("enter cfs_fuse_getattr %s", path); @@ -157,7 +157,7 @@ static int cfs_fuse_getattr(const char *path, struct stat *stbuf) } static int cfs_fuse_readdir(const char *path, void *buf, fuse_fill_dir_t filler, - off_t offset, struct fuse_file_info *fi) + off_t offset, struct fuse_file_info *fi, enum fuse_readdir_flags flags) { (void) offset; (void) fi; @@ -183,7 +183,7 @@ ret: return ret; } -static int cfs_fuse_chmod(const char *path, mode_t mode) +static int cfs_fuse_chmod(const char *path, mode_t mode, struct fuse_file_info *fi) { int ret = -EPERM; @@ -203,7 +203,7 @@ static int cfs_fuse_chmod(const char *path, mode_t mode) return ret; } -static int cfs_fuse_chown(const char *path, uid_t user, gid_t group) +static int cfs_fuse_chown(const char *path, uid_t user, gid_t group, struct fuse_file_info *fi) { int ret = -EPERM; @@ -266,12 +266,17 @@ static int cfs_fuse_rmdir(const char *path) return ret; } -static int cfs_fuse_rename(const char *from, const char *to) +static int cfs_fuse_rename(const char *from, const char *to, unsigned int flags) { cfs_debug("enter cfs_fuse_rename from %s to %s", from, to); int ret = -EACCES; + // TODO implement support for NOREPLACE and EXCHANGE? + if (flags) { + return -EINVAL; + } + char *sub_from = NULL; cfs_plug_t *plug_from = find_plug(from, &sub_from); @@ -373,7 +378,7 @@ static int cfs_fuse_write(const char *path, const char *buf, size_t size, return ret; } -static int cfs_fuse_truncate(const char *path, off_t size) +static int cfs_fuse_truncate(const char *path, off_t size, struct fuse_file_info *fi) { cfs_debug("enter cfs_fuse_truncate %s %jd", path, size); @@ -467,7 +472,7 @@ ret: return ret; } -static int cfs_fuse_utimens(const char *path, const struct timespec tv[2]) +static int cfs_fuse_utimens(const char *path, const struct timespec tv[2], struct fuse_file_info *fi) { cfs_debug("enter cfs_fuse_utimens %s", path); @@ -938,19 +943,13 @@ int main(int argc, char *argv[]) char *fa[] = { "-f", "-odefault_permissions", "-oallow_other", NULL}; struct fuse_args fuse_args = FUSE_ARGS_INIT(sizeof (fa)/sizeof(gpointer) - 1, fa); - - struct fuse_chan *fuse_chan = fuse_mount(CFSDIR, &fuse_args); - if (!fuse_chan) { - cfs_critical("fuse_mount error: %s", strerror(errno)); - goto err; - } - - if (!(fuse = fuse_new(fuse_chan, &fuse_args, &fuse_ops, sizeof(fuse_ops), NULL))) { + if (!(fuse = fuse_new(&fuse_args, &fuse_ops, sizeof(fuse_ops), NULL))) { cfs_critical("fuse_new error: %s", strerror(errno)); goto err; } fuse_set_signal_handlers(fuse_get_session(fuse)); + fuse_mount(fuse, CFSDIR); if (!foreground) { if (pipe(pipefd) == -1) { @@ -1049,7 +1048,9 @@ int main(int argc, char *argv[]) close(pipefd[1]); } - ret = fuse_loop_mt(fuse); + struct fuse_loop_config fuse_cfg; + + ret = fuse_loop_mt(fuse, &fuse_cfg); open(RESTART_FLAG_FILE, O_CREAT|O_NOCTTY|O_NONBLOCK, S_IRUSR | S_IRGRP); chown(RESTART_FLAG_FILE, 0, cfs.gid); @@ -1058,7 +1059,9 @@ int main(int argc, char *argv[]) server_stop(); - fuse_unmount(CFSDIR, fuse_chan); + fuse_remove_signal_handlers(fuse_get_session(fuse)); + + fuse_unmount(fuse); fuse_destroy(fuse); -- 2.30.2