summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPino Toscano <toscano.pino@tiscali.it>2013-03-24 16:46:37 +0100
committerPino Toscano <toscano.pino@tiscali.it>2013-03-24 16:46:37 +0100
commitcd50c0de1db93520000bfb907caf07e51aa6cec5 (patch)
tree255e199b8840d670293ef947e2e713920dd583dd
parent9483570dadbe5675dbae5c0e8447225e8e880825 (diff)
Fix context and user data handling at init time
Make sure, using an helper function, to have an existing context before calling the init fuse operation. Also, the USER_DATA arg of fuse_new must be set as new PRIVATE_DATA in the fuse context before calling the init fuse operation. * src/fuse_i.h (struct iouser): New forward declaration. (struct fuse): Remove field 'user_data'. (update_context_struct): New function. * src/main.c (fuse_new): Update LIBFUSE_CTX correctly before and after calling init. * src/netfs.c (refresh_context_struct): Call refresh_context_struct. (update_context_struct): New function, mostly derived from refresh_context_struct. Update CTX->FUSE and CTX->PRIVATE_DATA correctly.
-rw-r--r--src/fuse_i.h5
-rw-r--r--src/main.c7
-rw-r--r--src/netfs.c12
3 files changed, 18 insertions, 6 deletions
diff --git a/src/fuse_i.h b/src/fuse_i.h
index 49c4c0639..472bc6503 100644
--- a/src/fuse_i.h
+++ b/src/fuse_i.h
@@ -22,6 +22,8 @@
# include "fuse_compat.h"
#endif
+struct iouser;
+
/* write out message to stderr, that some routine is not yet implemented,
* thus misbehaviour must be accepted. */
#define NOT_IMPLEMENTED() \
@@ -36,7 +38,6 @@ struct fuse {
struct fuse_operations ops;
} op;
struct fuse_conn_info conn;
- void *user_data;
void *private_data;
};
@@ -58,6 +59,8 @@ extern struct fuse *libfuse_fuse;
extern __thread struct fuse_context *libfuse_ctx;
+extern void update_context_struct(struct iouser *cred, struct fuse *fuse);
+
/*****************************************************************************
*** netnodes (in memory representation of libfuse's files or directories) ***
*****************************************************************************/
diff --git a/src/main.c b/src/main.c
index 39d5f6acb..b8f25c8cd 100644
--- a/src/main.c
+++ b/src/main.c
@@ -314,8 +314,6 @@ fuse_new(struct fuse_chan *ch, struct fuse_args *args,
}
memcpy(&new->op, op, op_size);
- new->user_data = user_data;
-
/* FIXME: figure out better values for fuse_conn_info fields. */
new->conn.proto_major = FUSE_MAJOR_VERSION;
new->conn.proto_minor = FUSE_MINOR_VERSION;
@@ -323,6 +321,9 @@ fuse_new(struct fuse_chan *ch, struct fuse_args *args,
new->conn.max_write = UINT_MAX;
new->conn.max_readahead = UINT_MAX;
+ update_context_struct(NULL, new);
+ libfuse_ctx->private_data = user_data;
+
if(new->op.ops.init != NULL)
{
if (new->version >= 26)
@@ -331,6 +332,8 @@ fuse_new(struct fuse_chan *ch, struct fuse_args *args,
new->private_data = new->op.ops25.init();
}
+ update_context_struct(NULL, NULL);
+
return new;
}
diff --git a/src/netfs.c b/src/netfs.c
index 51de2ee12..a8718369c 100644
--- a/src/netfs.c
+++ b/src/netfs.c
@@ -54,6 +54,12 @@ struct fuse_dirhandle {
static inline void
refresh_context_struct(struct iouser *cred)
{
+ update_context_struct(cred, libfuse_fuse);
+}
+
+void
+update_context_struct(struct iouser *cred, struct fuse *fuse)
+{
FUNC_PROLOGUE("refresh_context_struct");
struct fuse_context *ctx = libfuse_ctx;
@@ -68,14 +74,14 @@ refresh_context_struct(struct iouser *cred)
libfuse_ctx = ctx;
- ctx->fuse = libfuse_fuse;
- ctx->private_data = libfuse_fuse->private_data;
-
/* FIXME, how to figure out the pid of the program asking for the
* filesystem operation? */
ctx->pid = 0;
}
+ ctx->fuse = fuse;
+ ctx->private_data = ctx->fuse ? ctx->fuse->private_data : NULL;
+
if(cred)
{
ctx->uid = cred->uids->num ? cred->uids->ids[0] :