From: Fabrice B. <li...@gm...> - 2013-10-08 15:17:12
|
Hello, Here is the patch which fixes the use of .so fusemods. Thanks! Best regards Fabrice --- include/fuse.h | 11 +++----- lib/fuse.c | 82 +++++++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 67 insertions(+), 26 deletions(-) diff --git a/include/fuse.h b/include/fuse.h index b8a9307..bfcb8c5 100644 --- a/include/fuse.h +++ b/include/fuse.h @@ -918,13 +918,10 @@ void fuse_register_module(struct fuse_module *mod); * For the parameters, see description of the fields in 'struct * fuse_module' */ -#define FUSE_REGISTER_MODULE(name_, factory_) \ - static __attribute__((constructor)) void name_ ## _register(void) \ - { \ - static struct fuse_module mod = \ - { #name_, factory_, NULL, NULL, 0 }; \ - fuse_register_module(&mod); \ - } +#define FUSE_REGISTER_MODULE(name_, factory_) \ + struct fuse_module fuse_fusemod_ ## name_ ## _module = { \ + #name_, factory_, NULL, NULL, 0 \ + }; /** Get session from fuse object */ struct fuse_session *fuse_get_session(struct fuse *f); diff --git a/lib/fuse.c b/lib/fuse.c index 7508c54..1534d04 100644 --- a/lib/fuse.c +++ b/lib/fuse.c @@ -208,41 +208,76 @@ struct fuse_context_i { fuse_req_t req; }; +/* Defined by FUSE_REGISTER_MODULE() in lib/modules/subdir.c and iconv.c. */ +extern struct fuse_module fuse_fusemod_subdir_module; +extern struct fuse_module fuse_fusemod_iconv_module; + static pthread_key_t fuse_context_key; static pthread_mutex_t fuse_context_lock = PTHREAD_MUTEX_INITIALIZER; static int fuse_context_ref; static struct fusemod_so *fuse_current_so; -static struct fuse_module *fuse_modules; +static struct fuse_module *fuse_modules = NULL; -static int fuse_load_so_name(const char *soname) +static int fuse_load_so_name(const char *soname, const char *module_name) { struct fusemod_so *so; + int ret = 0; so = calloc(1, sizeof(struct fusemod_so)); if (!so) { fprintf(stderr, "fuse: memory allocation failed\n"); - return -1; + ret = -1; + goto end; } fuse_current_so = so; - so->handle = dlopen(soname, RTLD_NOW); + + so->handle = dlopen (soname, RTLD_NOW); + if (so->handle == NULL) { + fprintf (stderr, "fuse: dlopen() failed: %s\n", dlerror ()); + ret = -1; + goto freeso_end; + } + + const size_t module_len = strlen (module_name); + char *symbol = malloc (64 + module_len); + if (symbol == NULL) { + perror ("fuse"); + ret = -1; + goto dlopen_end; + } + + sprintf (symbol, "fuse_fusemod_%s_module", module_name); + + struct fuse_module *module; + module = dlsym (so->handle, symbol); + if (module != NULL) { + fuse_register_module (module); + } + fuse_current_so = NULL; - if (!so->handle) { - fprintf(stderr, "fuse: %s\n", dlerror()); - goto err; - } + if (!so->ctr) { fprintf(stderr, "fuse: %s did not register any modules\n", soname); - goto err; - } - return 0; - -err: - if (so->handle) - dlclose(so->handle); - free(so); - return -1; + ret = -1; + goto freesym_end; + } + +freesym_end: + free (symbol); +dlopen_end: + if (ret != 0) { + /* dlclose() only on error, otherwise we won't have + * access to the .so anymore. */ + if (dlclose (so->handle)) { + fprintf (stderr, "fuse: dlclose() failed: %s\n", dlerror ()); + } + } +freeso_end: + free (so); +end: + return ret; } static int fuse_load_so_module(const char *module) @@ -254,14 +289,14 @@ static int fuse_load_so_module(const char *module) return -1; } sprintf(soname, "libfusemod_%s.so", module); - res = fuse_load_so_name(soname); + res = fuse_load_so_name(soname, module); free(soname); return res; } static struct fuse_module *fuse_find_module(const char *module) { - struct fuse_module *m; + struct fuse_module *m; for (m = fuse_modules; m; m = m->next) { if (strcmp(module, m->name) == 0) { m->ctr++; @@ -4342,6 +4377,15 @@ struct fuse *fuse_new(struct fuse_chan *ch, struct fuse_args *args, struct fuse_fs *fs; struct fuse_lowlevel_ops llop = fuse_path_ops; + /* Boolean: have the builtin modules already been registered? */ + static int builtin_modules_registered_p = 0; + if (builtin_modules_registered_p == 0) { + /* If not, register them. */ + fuse_register_module (&fuse_fusemod_subdir_module); + fuse_register_module (&fuse_fusemod_iconv_module); + builtin_modules_registered_p = 1; + } + if (fuse_create_context_key() == -1) goto out; -- 1.7.10.4 |
From: Fabrice B. <li...@gm...> - 2013-12-09 14:48:50
|
Hello, Is this patch okay? Should I change some things? It fixes the problem of .so fusemods that do not load properly when FUSE is compiled with an optimizing compiler (e.g. gcc -O2). Thanks! Best regards 2013/10/8 Fabrice Bauzac <li...@gm...>: > Hello, > > Here is the patch which fixes the use of .so fusemods. > > Thanks! > > Best regards > Fabrice > > --- > include/fuse.h | 11 +++----- > lib/fuse.c | 82 +++++++++++++++++++++++++++++++++++++++++++------------- > 2 files changed, 67 insertions(+), 26 deletions(-) > > diff --git a/include/fuse.h b/include/fuse.h > index b8a9307..bfcb8c5 100644 > --- a/include/fuse.h > +++ b/include/fuse.h > @@ -918,13 +918,10 @@ void fuse_register_module(struct fuse_module *mod); > * For the parameters, see description of the fields in 'struct > * fuse_module' > */ > -#define FUSE_REGISTER_MODULE(name_, factory_) \ > - static __attribute__((constructor)) void name_ ## _register(void) \ > - { \ > - static struct fuse_module mod = \ > - { #name_, factory_, NULL, NULL, 0 }; \ > - fuse_register_module(&mod); \ > - } > +#define FUSE_REGISTER_MODULE(name_, factory_) \ > + struct fuse_module fuse_fusemod_ ## name_ ## _module = { \ > + #name_, factory_, NULL, NULL, 0 \ > + }; > > /** Get session from fuse object */ > struct fuse_session *fuse_get_session(struct fuse *f); > diff --git a/lib/fuse.c b/lib/fuse.c > index 7508c54..1534d04 100644 > --- a/lib/fuse.c > +++ b/lib/fuse.c > @@ -208,41 +208,76 @@ struct fuse_context_i { > fuse_req_t req; > }; > > +/* Defined by FUSE_REGISTER_MODULE() in lib/modules/subdir.c and iconv.c. */ > +extern struct fuse_module fuse_fusemod_subdir_module; > +extern struct fuse_module fuse_fusemod_iconv_module; > + > static pthread_key_t fuse_context_key; > static pthread_mutex_t fuse_context_lock = PTHREAD_MUTEX_INITIALIZER; > static int fuse_context_ref; > static struct fusemod_so *fuse_current_so; > -static struct fuse_module *fuse_modules; > +static struct fuse_module *fuse_modules = NULL; > > -static int fuse_load_so_name(const char *soname) > +static int fuse_load_so_name(const char *soname, const char *module_name) > { > struct fusemod_so *so; > + int ret = 0; > > so = calloc(1, sizeof(struct fusemod_so)); > if (!so) { > fprintf(stderr, "fuse: memory allocation failed\n"); > - return -1; > + ret = -1; > + goto end; > } > > fuse_current_so = so; > - so->handle = dlopen(soname, RTLD_NOW); > + > + so->handle = dlopen (soname, RTLD_NOW); > + if (so->handle == NULL) { > + fprintf (stderr, "fuse: dlopen() failed: %s\n", dlerror ()); > + ret = -1; > + goto freeso_end; > + } > + > + const size_t module_len = strlen (module_name); > + char *symbol = malloc (64 + module_len); > + if (symbol == NULL) { > + perror ("fuse"); > + ret = -1; > + goto dlopen_end; > + } > + > + sprintf (symbol, "fuse_fusemod_%s_module", module_name); > + > + struct fuse_module *module; > + module = dlsym (so->handle, symbol); > + if (module != NULL) { > + fuse_register_module (module); > + } > + > fuse_current_so = NULL; > - if (!so->handle) { > - fprintf(stderr, "fuse: %s\n", dlerror()); > - goto err; > - } > + > if (!so->ctr) { > fprintf(stderr, "fuse: %s did not register any modules\n", > soname); > - goto err; > - } > - return 0; > - > -err: > - if (so->handle) > - dlclose(so->handle); > - free(so); > - return -1; > + ret = -1; > + goto freesym_end; > + } > + > +freesym_end: > + free (symbol); > +dlopen_end: > + if (ret != 0) { > + /* dlclose() only on error, otherwise we won't have > + * access to the .so anymore. */ > + if (dlclose (so->handle)) { > + fprintf (stderr, "fuse: dlclose() failed: > %s\n", dlerror ()); > + } > + } > +freeso_end: > + free (so); > +end: > + return ret; > } > > static int fuse_load_so_module(const char *module) > @@ -254,14 +289,14 @@ static int fuse_load_so_module(const char *module) > return -1; > } > sprintf(soname, "libfusemod_%s.so", module); > - res = fuse_load_so_name(soname); > + res = fuse_load_so_name(soname, module); > free(soname); > return res; > } > > static struct fuse_module *fuse_find_module(const char *module) > { > - struct fuse_module *m; > + struct fuse_module *m; > for (m = fuse_modules; m; m = m->next) { > if (strcmp(module, m->name) == 0) { > m->ctr++; > @@ -4342,6 +4377,15 @@ struct fuse *fuse_new(struct fuse_chan *ch, > struct fuse_args *args, > struct fuse_fs *fs; > struct fuse_lowlevel_ops llop = fuse_path_ops; > > + /* Boolean: have the builtin modules already been registered? */ > + static int builtin_modules_registered_p = 0; > + if (builtin_modules_registered_p == 0) { > + /* If not, register them. */ > + fuse_register_module (&fuse_fusemod_subdir_module); > + fuse_register_module (&fuse_fusemod_iconv_module); > + builtin_modules_registered_p = 1; > + } > + > if (fuse_create_context_key() == -1) > goto out; > > -- > 1.7.10.4 |
From: Miklos S. <mi...@sz...> - 2013-12-11 12:25:17
|
On Mon, Dec 9, 2013 at 3:48 PM, Fabrice Bauzac <li...@gm...> wrote: > Hello, > > Is this patch okay? Should I change some things? The patch has whitespace issues. Please check your mailer options or send the patch as an attachment. As a follow-on the 'struct fuse_module' could be completely hidden and the module would only need to export the factory function. But that should probably be a separate patch. Thanks, Miklos |
From: Fabrice B. <li...@gm...> - 2013-12-12 08:55:41
|
2013/12/11 Miklos Szeredi <mi...@sz...>: > The patch has whitespace issues. Please check your mailer options or > send the patch as an attachment. OK, please find the patch as an attachment. Thanks! Best regards Fabrice |
From: Goswin v. B. <gos...@we...> - 2014-02-03 15:23:33
|
On Thu, Dec 12, 2013 at 09:55:34AM +0100, Fabrice Bauzac wrote: > 2013/12/11 Miklos Szeredi <mi...@sz...>: > > > The patch has whitespace issues. Please check your mailer options or > > send the patch as an attachment. > > OK, please find the patch as an attachment. > > Thanks! > > Best regards > Fabrice So what is the status of this now? I'm getting bitten by this too. MfG Goswin |
From: Miklos S. <mi...@sz...> - 2014-02-04 17:22:56
|
On Mon, Feb 3, 2014 at 4:23 PM, Goswin von Brederlow <gos...@we...> wrote: > On Thu, Dec 12, 2013 at 09:55:34AM +0100, Fabrice Bauzac wrote: >> 2013/12/11 Miklos Szeredi <mi...@sz...>: >> >> > The patch has whitespace issues. Please check your mailer options or >> > send the patch as an attachment. >> >> OK, please find the patch as an attachment. >> >> Thanks! >> >> Best regards >> Fabrice > > So what is the status of this now? I'm getting bitten by this too. Heavily modified one pushed to git. Please test! Thanks, Miklos |
From: Goswin v. B. <gos...@we...> - 2014-02-06 11:04:35
|
On Tue, Feb 04, 2014 at 06:22:47PM +0100, Miklos Szeredi wrote: > On Mon, Feb 3, 2014 at 4:23 PM, Goswin von Brederlow <gos...@we...> wrote: > > On Thu, Dec 12, 2013 at 09:55:34AM +0100, Fabrice Bauzac wrote: > >> 2013/12/11 Miklos Szeredi <mi...@sz...>: > >> > >> > The patch has whitespace issues. Please check your mailer options or > >> > send the patch as an attachment. > >> > >> OK, please find the patch as an attachment. > >> > >> Thanks! > >> > >> Best regards > >> Fabrice > > > > So what is the status of this now? I'm getting bitten by this too. > > Heavily modified one pushed to git. > > Please test! > > Thanks, > Miklos Do you happen to know the git commit ID for easy cherry picking? MfG Goswin |
From: Miklos S. <mi...@sz...> - 2014-02-06 11:23:05
|
On Thu, Feb 6, 2014 at 12:04 PM, Goswin von Brederlow <gos...@we...> wrote: > Do you happen to know the git commit ID for easy cherry picking? d4e294b7995a fuse: use dlsym() instead of relying on ld.so constructor functions Thanks, Miklos |
From: Goswin v. B. <gos...@we...> - 2014-02-13 08:25:23
|
On Thu, Feb 06, 2014 at 12:22:57PM +0100, Miklos Szeredi wrote: > On Thu, Feb 6, 2014 at 12:04 PM, Goswin von Brederlow <gos...@we...> wrote: > > > Do you happen to know the git commit ID for easy cherry picking? > > d4e294b7995a fuse: use dlsym() instead of relying on ld.so > constructor functions > > Thanks, > Miklos Thanks. MfG Goswin |