From: Miklos Szeredi Date: Fri, 22 Sep 2006 19:30:17 +0000 (+0000) Subject: fix compat bugs in lowlevel interface X-Git-Tag: fuse_2_6_0_rc2~12 X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=eafdf42a69455f49fc8f935270fec7550bbc4e7c;p=qemu-gpiodev%2Flibfuse.git fix compat bugs in lowlevel interface --- diff --git a/ChangeLog b/ChangeLog index eedd12d..7cd5023 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2006-09-22 Miklos Szeredi + + * Fix compatibility bugs in low level interface. Reported by + Ricardo Correia + + * Add workaround for ARM caching bug + 2006-09-16 Miklos Szeredi * Rename new utimes() method to more logical utimens() diff --git a/include/fuse.h b/include/fuse.h index 1e0bd3c..8237422 100644 --- a/include/fuse.h +++ b/include/fuse.h @@ -617,7 +617,7 @@ struct fuse_session *fuse_get_session(struct fuse *f); # define fuse_new fuse_new_compat22 # define fuse_setup fuse_setup_compat22 # define fuse_operations fuse_operations_compat22 -# define fuse_file_info fuse_file_info_compat22 +# define fuse_file_info fuse_file_info_compat # elif FUSE_USE_VERSION == 24 # error Compatibility with high-level API version 24 not supported # else diff --git a/include/fuse_common_compat.h b/include/fuse_common_compat.h index 6b6bf32..60ca944 100644 --- a/include/fuse_common_compat.h +++ b/include/fuse_common_compat.h @@ -9,6 +9,14 @@ /* these definitions provide source compatibility to prior versions. Do not include this file directly! */ +struct fuse_file_info_compat { + int flags; + unsigned long fh; + int writepage; + unsigned int direct_io : 1; + unsigned int keep_cache : 1; +}; + int fuse_mount_compat25(const char *mountpoint, struct fuse_args *args); int fuse_mount_compat22(const char *mountpoint, const char *opts); diff --git a/include/fuse_compat.h b/include/fuse_compat.h index c896373..c8393e4 100644 --- a/include/fuse_compat.h +++ b/include/fuse_compat.h @@ -67,14 +67,6 @@ void fuse_teardown_compat25(struct fuse *fuse, int fd, char *mountpoint); #ifndef __FreeBSD__ #include -struct fuse_file_info_compat22 { - int flags; - unsigned long fh; - int writepage; - unsigned int direct_io : 1; - unsigned int keep_cache : 1; -}; - struct fuse_operations_compat22 { int (*getattr) (const char *, struct stat *); int (*readlink) (const char *, char *, size_t); @@ -90,24 +82,24 @@ struct fuse_operations_compat22 { int (*chown) (const char *, uid_t, gid_t); int (*truncate) (const char *, off_t); int (*utime) (const char *, struct utimbuf *); - int (*open) (const char *, struct fuse_file_info_compat22 *); + int (*open) (const char *, struct fuse_file_info_compat *); int (*read) (const char *, char *, size_t, off_t, - struct fuse_file_info_compat22 *); + struct fuse_file_info_compat *); int (*write) (const char *, const char *, size_t, off_t, - struct fuse_file_info_compat22 *); + struct fuse_file_info_compat *); int (*statfs) (const char *, struct statfs *); - int (*flush) (const char *, struct fuse_file_info_compat22 *); - int (*release) (const char *, struct fuse_file_info_compat22 *); - int (*fsync) (const char *, int, struct fuse_file_info_compat22 *); + int (*flush) (const char *, struct fuse_file_info_compat *); + int (*release) (const char *, struct fuse_file_info_compat *); + int (*fsync) (const char *, int, struct fuse_file_info_compat *); int (*setxattr) (const char *, const char *, const char *, size_t, int); int (*getxattr) (const char *, const char *, char *, size_t); int (*listxattr) (const char *, char *, size_t); int (*removexattr) (const char *, const char *); - int (*opendir) (const char *, struct fuse_file_info_compat22 *); + int (*opendir) (const char *, struct fuse_file_info_compat *); int (*readdir) (const char *, void *, fuse_fill_dir_t, off_t, - struct fuse_file_info_compat22 *); - int (*releasedir) (const char *, struct fuse_file_info_compat22 *); - int (*fsyncdir) (const char *, int, struct fuse_file_info_compat22 *); + struct fuse_file_info_compat *); + int (*releasedir) (const char *, struct fuse_file_info_compat *); + int (*fsyncdir) (const char *, int, struct fuse_file_info_compat *); void *(*init) (void); void (*destroy) (void *); }; diff --git a/include/fuse_lowlevel.h b/include/fuse_lowlevel.h index 58f568c..00b22bc 100644 --- a/include/fuse_lowlevel.h +++ b/include/fuse_lowlevel.h @@ -1304,17 +1304,18 @@ void fuse_chan_destroy(struct fuse_chan *ch); #if FUSE_USE_VERSION < 26 # include "fuse_lowlevel_compat.h" -# undef FUSE_MINOR_VERSION +# define fuse_chan_ops fuse_chan_ops_compat24 +# define fuse_chan_new fuse_chan_new_compat24 # if FUSE_USE_VERSION == 25 # define fuse_lowlevel_ops fuse_lowlevel_ops_compat25 # define fuse_lowlevel_new fuse_lowlevel_new_compat25 -# define fuse_chan_ops fuse_chan_ops_compat25 -# define fuse_chan_new fuse_chan_new_compat25 # elif FUSE_USE_VERSION == 24 +# define fuse_lowlevel_ops fuse_lowlevel_ops_compat +# define fuse_lowlevel_new fuse_lowlevel_new_compat # define fuse_file_info fuse_file_info_compat # define fuse_reply_statfs fuse_reply_statfs_compat # define fuse_reply_open fuse_reply_open_compat -# else +# else # error Compatibility with low-level API version < 24 not supported # endif #endif diff --git a/include/fuse_lowlevel_compat.h b/include/fuse_lowlevel_compat.h index c8e7673..285239c 100644 --- a/include/fuse_lowlevel_compat.h +++ b/include/fuse_lowlevel_compat.h @@ -71,12 +71,53 @@ char *fuse_add_dirent(char *buf, const char *name, const struct stat *stbuf, #include -struct fuse_file_info_compat { - int flags; - unsigned long fh; - int writepage; - unsigned int direct_io : 1; - unsigned int keep_cache : 1; +struct fuse_lowlevel_ops_compat { + void (*init) (void *userdata); + void (*destroy) (void *userdata); + void (*lookup) (fuse_req_t req, fuse_ino_t parent, const char *name); + void (*forget) (fuse_req_t req, fuse_ino_t ino, unsigned long nlookup); + void (*getattr) (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info_compat *fi); + void (*setattr) (fuse_req_t req, fuse_ino_t ino, struct stat *attr, + int to_set, struct fuse_file_info_compat *fi); + void (*readlink) (fuse_req_t req, fuse_ino_t ino); + void (*mknod) (fuse_req_t req, fuse_ino_t parent, const char *name, + mode_t mode, dev_t rdev); + void (*mkdir) (fuse_req_t req, fuse_ino_t parent, const char *name, + mode_t mode); + void (*unlink) (fuse_req_t req, fuse_ino_t parent, const char *name); + void (*rmdir) (fuse_req_t req, fuse_ino_t parent, const char *name); + void (*symlink) (fuse_req_t req, const char *link, fuse_ino_t parent, + const char *name); + void (*rename) (fuse_req_t req, fuse_ino_t parent, const char *name, + fuse_ino_t newparent, const char *newname); + void (*link) (fuse_req_t req, fuse_ino_t ino, fuse_ino_t newparent, + const char *newname); + void (*open) (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info_compat *fi); + void (*read) (fuse_req_t req, fuse_ino_t ino, size_t size, off_t off, + struct fuse_file_info_compat *fi); + void (*write) (fuse_req_t req, fuse_ino_t ino, const char *buf, + size_t size, off_t off, struct fuse_file_info_compat *fi); + void (*flush) (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info_compat *fi); + void (*release) (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info_compat *fi); + void (*fsync) (fuse_req_t req, fuse_ino_t ino, int datasync, + struct fuse_file_info_compat *fi); + void (*opendir) (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info_compat *fi); + void (*readdir) (fuse_req_t req, fuse_ino_t ino, size_t size, off_t off, + struct fuse_file_info_compat *fi); + void (*releasedir) (fuse_req_t req, fuse_ino_t ino, + struct fuse_file_info_compat *fi); + void (*fsyncdir) (fuse_req_t req, fuse_ino_t ino, int datasync, + struct fuse_file_info_compat *fi); + void (*statfs) (fuse_req_t req); + void (*setxattr) (fuse_req_t req, fuse_ino_t ino, const char *name, + const char *value, size_t size, int flags); + void (*getxattr) (fuse_req_t req, fuse_ino_t ino, const char *name, + size_t size); + void (*listxattr) (fuse_req_t req, fuse_ino_t ino, size_t size); + void (*removexattr) (fuse_req_t req, fuse_ino_t ino, const char *name); + void (*access) (fuse_req_t req, fuse_ino_t ino, int mask); + void (*create) (fuse_req_t req, fuse_ino_t parent, const char *name, + mode_t mode, struct fuse_file_info_compat *fi); }; int fuse_reply_statfs_compat(fuse_req_t req, const struct statfs *stbuf); @@ -85,8 +126,8 @@ int fuse_reply_open_compat(fuse_req_t req, const struct fuse_file_info_compat *fi); struct fuse_session *fuse_lowlevel_new_compat(const char *opts, - const struct fuse_lowlevel_ops *op, - size_t op_size, void *userdata); + const struct fuse_lowlevel_ops_compat *op, + size_t op_size, void *userdata); #endif /* __FreeBSD__ */ @@ -100,4 +141,4 @@ struct fuse_chan *fuse_chan_new_compat24(struct fuse_chan_ops_compat24 *op, int fd, size_t bufsize, void *data); int fuse_chan_receive(struct fuse_chan *ch, char *buf, size_t size); - +struct fuse_chan *fuse_kern_chan_new(int fd); diff --git a/lib/fuse.c b/lib/fuse.c index 8c507d9..16eb7ad 100644 --- a/lib/fuse.c +++ b/lib/fuse.c @@ -2777,6 +2777,7 @@ void fuse_destroy(struct fuse *f) fuse_delete_context_key(); } +#include "fuse_common_compat.h" #include "fuse_compat.h" static struct fuse *fuse_new_common_compat25(int fd, struct fuse_args *args, @@ -2802,7 +2803,7 @@ static int fuse_compat_open(struct fuse *f, fuse_req_t req, char *path, if (!f->compat || f->compat >= 25) err = fuse_do_open(f, req, path, fi); else if (f->compat == 22) { - struct fuse_file_info_compat22 tmp; + struct fuse_file_info_compat tmp; memcpy(&tmp, fi, sizeof(tmp)); fuse_prepare_interrupt(f, req, &d); err = ((struct fuse_operations_compat22 *) &f->op)->open(path, &tmp); @@ -2838,7 +2839,7 @@ static int fuse_compat_opendir(struct fuse *f, fuse_req_t req, char *path, return fuse_do_opendir(f, req, path, fi); } else { int err; - struct fuse_file_info_compat22 tmp; + struct fuse_file_info_compat tmp; struct fuse_intr_data d; memcpy(&tmp, fi, sizeof(tmp)); fuse_prepare_interrupt(f, req, &d); diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c index e7044d3..27a3d20 100644 --- a/lib/fuse_lowlevel.c +++ b/lib/fuse_lowlevel.c @@ -1243,6 +1243,7 @@ struct fuse_session *fuse_lowlevel_new(struct fuse_args *args, } +#include "fuse_common_compat.h" #include "fuse_lowlevel_compat.h" #ifndef __FreeBSD__ @@ -1290,8 +1291,8 @@ int fuse_reply_statfs_compat(fuse_req_t req, const struct statfs *stbuf) } struct fuse_session *fuse_lowlevel_new_compat(const char *opts, - const struct fuse_lowlevel_ops *op, - size_t op_size, void *userdata) + const struct fuse_lowlevel_ops_compat *op, + size_t op_size, void *userdata) { struct fuse_session *se; struct fuse_args args = FUSE_ARGS_INIT(0, NULL); @@ -1303,7 +1304,8 @@ struct fuse_session *fuse_lowlevel_new_compat(const char *opts, fuse_opt_free_args(&args); return NULL; } - se = fuse_lowlevel_new(&args, op, op_size, userdata); + se = fuse_lowlevel_new(&args, (const struct fuse_lowlevel_ops *) op, + op_size, userdata); fuse_opt_free_args(&args); return se; diff --git a/lib/fuse_session.c b/lib/fuse_session.c index 6cfd462..73f5f57 100644 --- a/lib/fuse_session.c +++ b/lib/fuse_session.c @@ -7,6 +7,7 @@ */ #include "fuse_lowlevel.h" +#include "fuse_common_compat.h" #include "fuse_lowlevel_compat.h" #include