aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--include/fuse.h2
-rw-r--r--include/fuse_common_compat.h8
-rw-r--r--include/fuse_compat.h28
-rw-r--r--include/fuse_lowlevel.h9
-rw-r--r--include/fuse_lowlevel_compat.h59
-rw-r--r--lib/fuse.c5
-rw-r--r--lib/fuse_lowlevel.c8
-rw-r--r--lib/fuse_session.c1
9 files changed, 90 insertions, 37 deletions
diff --git a/ChangeLog b/ChangeLog
index eedd12d..7cd5023 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2006-09-22 Miklos Szeredi <miklos@szeredi.hu>
+
+ * Fix compatibility bugs in low level interface. Reported by
+ Ricardo Correia
+
+ * Add workaround for ARM caching bug
+
2006-09-16 Miklos Szeredi <miklos@szeredi.hu>
* 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 <sys/statfs.h>
-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 <sys/statfs.h>
-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 <stdio.h>