fix
diff --git a/lib/fuse.c b/lib/fuse.c
index ec5ace9..82e0e44 100644
--- a/lib/fuse.c
+++ b/lib/fuse.c
@@ -617,6 +617,7 @@
 
     memset(c, 0, sizeof(*c));
     c->fuse = f;
+    c->private_data = f->user_data;
 
     if (f->op.init)
         f->user_data = f->op.init(conn);
@@ -1998,11 +1999,10 @@
         fuse_opt_match(fuse_lib_opts, opt);
 }
 
-struct fuse *fuse_new_common(int fd, struct fuse_args *args,
+struct fuse *fuse_new_common(struct fuse_chan *ch, struct fuse_args *args,
                              const struct fuse_operations *op,
-                             size_t op_size, int compat)
+                             size_t op_size, void *user_data, int compat)
 {
-    struct fuse_chan *ch;
     struct fuse *f;
     struct node *root;
 
@@ -2017,6 +2017,7 @@
         goto out;
     }
 
+    f->user_data = user_data;
     f->conf.entry_timeout = 1.0;
     f->conf.attr_timeout = 1.0;
     f->conf.negative_timeout = 0.0;
@@ -2045,10 +2046,6 @@
     if (f->se == NULL)
         goto out_free;
 
-    ch = fuse_kern_chan_new(fd);
-    if (ch == NULL)
-        goto out_free_session;
-
     fuse_session_add_chan(f->se, ch);
 
     f->ctr = 0;
@@ -2109,10 +2106,11 @@
     return NULL;
 }
 
-struct fuse *fuse_new(int fd, struct fuse_args *args,
-                      const struct fuse_operations *op, size_t op_size)
+struct fuse *fuse_new(struct fuse_chan *ch, struct fuse_args *args,
+                      const struct fuse_operations *op, size_t op_size,
+                      void *user_data)
 {
-    return fuse_new_common(fd, args, op, op_size, 0);
+    return fuse_new_common(ch, args, op, op_size, user_data, 0);
 }
 
 void fuse_destroy(struct fuse *f)
@@ -2149,6 +2147,19 @@
 
 #include "fuse_compat.h"
 
+static struct fuse *fuse_new_common_compat25(int fd, struct fuse_args *args,
+                                             const struct fuse_operations *op,
+                                             size_t op_size, int compat)
+{
+    struct fuse *f = NULL;
+    struct fuse_chan *ch = fuse_kern_chan_new(fd);
+
+    if (ch)
+        f = fuse_new_common(ch, args, op, op_size, NULL, compat);
+
+    return f;
+}
+
 #ifndef __FreeBSD__
 
 static int fuse_do_open(struct fuse *f, char *path, struct fuse_file_info *fi)
@@ -2251,7 +2262,7 @@
         fuse_opt_free_args(&args);
         return NULL;
     }
-    f = fuse_new_common(fd, &args, op, op_size, compat);
+    f = fuse_new_common_compat25(fd, &args, op, op_size, compat);
     fuse_opt_free_args(&args);
 
     return f;
@@ -2319,8 +2330,8 @@
                                const struct fuse_operations_compat25 *op,
                                size_t op_size)
 {
-    return fuse_new_common(fd, args, (struct fuse_operations *) op,
-                           op_size, 25);
+    return fuse_new_common_compat25(fd, args, (struct fuse_operations *) op,
+                                    op_size, 25);
 }
 
 __asm__(".symver fuse_new_compat25,fuse_new@FUSE_2.5");