510
621
fuse_do_prepare_interrupt(req, d);
513
static int fuse_do_getattr(struct fuse *f, fuse_req_t req, const char *path,
517
struct fuse_intr_data d;
518
fuse_prepare_interrupt(f, req, &d);
519
res = f->op.getattr(path, buf);
520
fuse_finish_interrupt(f, req, &d);
524
static int fuse_do_fgetattr(struct fuse *f, fuse_req_t req, const char *path,
525
struct stat *buf, struct fuse_file_info *fi)
528
struct fuse_intr_data d;
529
fuse_prepare_interrupt(f, req, &d);
530
res = f->op.fgetattr(path, buf, fi);
531
fuse_finish_interrupt(f, req, &d);
535
static int fuse_do_rename(struct fuse *f, fuse_req_t req, const char *oldpath,
539
struct fuse_intr_data d;
540
fuse_prepare_interrupt(f, req, &d);
541
res = f->op.rename(oldpath, newpath);
542
fuse_finish_interrupt(f, req, &d);
546
static int fuse_do_unlink(struct fuse *f, fuse_req_t req, const char *path)
549
struct fuse_intr_data d;
550
fuse_prepare_interrupt(f, req, &d);
551
res = f->op.unlink(path);
552
fuse_finish_interrupt(f, req, &d);
556
static void fuse_do_release(struct fuse *f, fuse_req_t req, const char *path,
626
static int fuse_compat_open(struct fuse_fs *fs, const char *path,
557
627
struct fuse_file_info *fi)
559
struct fuse_intr_data d;
560
fuse_prepare_interrupt(f, req, &d);
561
f->op.release(path, fi);
562
fuse_finish_interrupt(f, req, &d);
565
static int fuse_do_opendir(struct fuse *f, fuse_req_t req, char *path,
566
struct fuse_file_info *fi)
569
struct fuse_intr_data d;
570
fuse_prepare_interrupt(f, req, &d);
571
res = f->op.opendir(path, fi);
572
fuse_finish_interrupt(f, req, &d);
576
static int fuse_do_open(struct fuse *f, fuse_req_t req, char *path,
577
struct fuse_file_info *fi)
580
struct fuse_intr_data d;
581
fuse_prepare_interrupt(f, req, &d);
582
res = f->op.open(path, fi);
583
fuse_finish_interrupt(f, req, &d);
587
static int fuse_do_flush(struct fuse *f, fuse_req_t req, const char *path,
588
struct fuse_file_info *fi)
591
struct fuse_intr_data d;
592
fuse_prepare_interrupt(f, req, &d);
593
res = f->op.flush(path, fi);
594
fuse_finish_interrupt(f, req, &d);
598
static int fuse_do_statfs(struct fuse *f, fuse_req_t req, const char *path,
602
struct fuse_intr_data d;
603
fuse_prepare_interrupt(f, req, &d);
604
res = f->op.statfs(path, buf);
605
fuse_finish_interrupt(f, req, &d);
609
static void fuse_do_releasedir(struct fuse *f, fuse_req_t req,
610
const char *path, struct fuse_file_info *fi)
612
struct fuse_intr_data d;
613
fuse_prepare_interrupt(f, req, &d);
614
f->op.releasedir(path, fi);
615
fuse_finish_interrupt(f, req, &d);
618
static int fuse_do_create(struct fuse *f, fuse_req_t req, const char *path,
619
mode_t mode, struct fuse_file_info *fi)
622
struct fuse_intr_data d;
623
fuse_prepare_interrupt(f, req, &d);
624
res = f->op.create(path, mode, fi);
625
fuse_finish_interrupt(f, req, &d);
629
static int fuse_do_lock(struct fuse *f, fuse_req_t req, const char *path,
630
struct fuse_file_info *fi, int cmd, struct flock *lock)
633
struct fuse_intr_data d;
634
fuse_prepare_interrupt(f, req, &d);
635
res = f->op.lock(path, fi, cmd, lock);
636
fuse_finish_interrupt(f, req, &d);
630
if (!fs->compat || fs->compat >= 25)
631
err = fs->op.open(path, fi);
632
else if (fs->compat == 22) {
633
struct fuse_file_info_compat tmp;
634
memcpy(&tmp, fi, sizeof(tmp));
635
err = ((struct fuse_operations_compat22 *) &fs->op)->open(path, &tmp);
636
memcpy(fi, &tmp, sizeof(tmp));
639
err = ((struct fuse_operations_compat2 *) &fs->op)
640
->open(path, fi->flags);
644
static int fuse_compat_release(struct fuse_fs *fs, const char *path,
645
struct fuse_file_info *fi)
647
if (!fs->compat || fs->compat >= 22)
648
return fs->op.release(path, fi);
650
return ((struct fuse_operations_compat2 *) &fs->op)
651
->release(path, fi->flags);
654
static int fuse_compat_opendir(struct fuse_fs *fs, const char *path,
655
struct fuse_file_info *fi)
657
if (!fs->compat || fs->compat >= 25)
658
return fs->op.opendir(path, fi);
661
struct fuse_file_info_compat tmp;
662
memcpy(&tmp, fi, sizeof(tmp));
663
err = ((struct fuse_operations_compat22 *) &fs->op)
664
->opendir(path, &tmp);
665
memcpy(fi, &tmp, sizeof(tmp));
671
static void convert_statfs_compat(struct fuse_statfs_compat1 *compatbuf,
672
struct statvfs *stbuf)
674
stbuf->f_bsize = compatbuf->block_size;
675
stbuf->f_blocks = compatbuf->blocks;
676
stbuf->f_bfree = compatbuf->blocks_free;
677
stbuf->f_bavail = compatbuf->blocks_free;
678
stbuf->f_files = compatbuf->files;
679
stbuf->f_ffree = compatbuf->files_free;
680
stbuf->f_namemax = compatbuf->namelen;
683
static void convert_statfs_old(struct statfs *oldbuf, struct statvfs *stbuf)
685
stbuf->f_bsize = oldbuf->f_bsize;
686
stbuf->f_blocks = oldbuf->f_blocks;
687
stbuf->f_bfree = oldbuf->f_bfree;
688
stbuf->f_bavail = oldbuf->f_bavail;
689
stbuf->f_files = oldbuf->f_files;
690
stbuf->f_ffree = oldbuf->f_ffree;
691
stbuf->f_namemax = oldbuf->f_namelen;
694
static int fuse_compat_statfs(struct fuse_fs *fs, const char *path,
699
if (!fs->compat || fs->compat >= 25) {
700
err = fs->op.statfs(fs->compat == 25 ? "/" : path, buf);
701
} else if (fs->compat > 11) {
702
struct statfs oldbuf;
703
err = ((struct fuse_operations_compat22 *) &fs->op)
704
->statfs("/", &oldbuf);
706
convert_statfs_old(&oldbuf, buf);
708
struct fuse_statfs_compat1 compatbuf;
709
memset(&compatbuf, 0, sizeof(struct fuse_statfs_compat1));
710
err = ((struct fuse_operations_compat1 *) &fs->op)->statfs(&compatbuf);
712
convert_statfs_compat(&compatbuf, buf);
717
#else /* __FreeBSD__ */
719
static inline int fuse_compat_open(struct fuse_fs *fs, char *path,
720
struct fuse_file_info *fi)
722
return fs->op.open(path, fi);
725
static inline int fuse_compat_release(struct fuse_fs *fs, const char *path,
726
struct fuse_file_info *fi)
728
return fs->op.release(path, fi);
731
static inline int fuse_compat_opendir(struct fuse_fs *fs, const char *path,
732
struct fuse_file_info *fi)
734
return fs->op.opendir(path, fi);
737
static inline int fuse_compat_statfs(struct fuse_fs *fs, const char *path,
740
return fs->op.statfs(fs->compat == 25 ? "/" : path, buf);
743
#endif /* __FreeBSD__ */
745
int fuse_fs_getattr(struct fuse_fs *fs, const char *path, struct stat *buf)
747
fuse_get_context()->private_data = fs->user_data;
749
return fs->op.getattr(path, buf);
754
int fuse_fs_fgetattr(struct fuse_fs *fs, const char *path, struct stat *buf,
755
struct fuse_file_info *fi)
757
fuse_get_context()->private_data = fs->user_data;
759
return fs->op.fgetattr(path, buf, fi);
760
else if (fs->op.getattr)
761
return fs->op.getattr(path, buf);
766
int fuse_fs_rename(struct fuse_fs *fs, const char *oldpath,
769
fuse_get_context()->private_data = fs->user_data;
771
return fs->op.rename(oldpath, newpath);
776
int fuse_fs_unlink(struct fuse_fs *fs, const char *path)
778
fuse_get_context()->private_data = fs->user_data;
780
return fs->op.unlink(path);
785
int fuse_fs_rmdir(struct fuse_fs *fs, const char *path)
787
fuse_get_context()->private_data = fs->user_data;
789
return fs->op.rmdir(path);
794
int fuse_fs_symlink(struct fuse_fs *fs, const char *linkname, const char *path)
796
fuse_get_context()->private_data = fs->user_data;
798
return fs->op.symlink(linkname, path);
803
int fuse_fs_link(struct fuse_fs *fs, const char *oldpath, const char *newpath)
805
fuse_get_context()->private_data = fs->user_data;
807
return fs->op.link(oldpath, newpath);
812
int fuse_fs_release(struct fuse_fs *fs, const char *path,
813
struct fuse_file_info *fi)
815
fuse_get_context()->private_data = fs->user_data;
817
return fuse_compat_release(fs, path, fi);
822
int fuse_fs_opendir(struct fuse_fs *fs, const char *path,
823
struct fuse_file_info *fi)
825
fuse_get_context()->private_data = fs->user_data;
827
return fuse_compat_opendir(fs, path, fi);
832
int fuse_fs_open(struct fuse_fs *fs, const char *path,
833
struct fuse_file_info *fi)
835
fuse_get_context()->private_data = fs->user_data;
837
return fuse_compat_open(fs, path, fi);
842
int fuse_fs_read(struct fuse_fs *fs, const char *path, char *buf, size_t size,
843
off_t off, struct fuse_file_info *fi)
845
fuse_get_context()->private_data = fs->user_data;
847
return fs->op.read(path, buf, size, off, fi);
852
int fuse_fs_write(struct fuse_fs *fs, const char *path, const char *buf,
853
size_t size, off_t off, struct fuse_file_info *fi)
855
fuse_get_context()->private_data = fs->user_data;
857
return fs->op.write(path, buf, size, off, fi);
862
int fuse_fs_fsync(struct fuse_fs *fs, const char *path, int datasync,
863
struct fuse_file_info *fi)
865
fuse_get_context()->private_data = fs->user_data;
867
return fs->op.fsync(path, datasync, fi);
872
int fuse_fs_fsyncdir(struct fuse_fs *fs, const char *path, int datasync,
873
struct fuse_file_info *fi)
875
fuse_get_context()->private_data = fs->user_data;
877
return fs->op.fsyncdir(path, datasync, fi);
882
int fuse_fs_flush(struct fuse_fs *fs, const char *path,
883
struct fuse_file_info *fi)
885
fuse_get_context()->private_data = fs->user_data;
887
return fs->op.flush(path, fi);
892
int fuse_fs_statfs(struct fuse_fs *fs, const char *path, struct statvfs *buf)
894
fuse_get_context()->private_data = fs->user_data;
896
return fuse_compat_statfs(fs, path, buf);
898
buf->f_namemax = 255;
904
int fuse_fs_releasedir(struct fuse_fs *fs, const char *path,
905
struct fuse_file_info *fi)
907
fuse_get_context()->private_data = fs->user_data;
908
if (fs->op.releasedir)
909
return fs->op.releasedir(path, fi);
914
static int fill_dir_old(struct fuse_dirhandle *dh, const char *name, int type,
920
memset(&stbuf, 0, sizeof(stbuf));
921
stbuf.st_mode = type << 12;
924
res = dh->filler(dh->buf, name, &stbuf, 0);
925
return res ? -ENOMEM : 0;
928
int fuse_fs_readdir(struct fuse_fs *fs, const char *path, void *buf,
929
fuse_fill_dir_t filler, off_t off,
930
struct fuse_file_info *fi)
932
fuse_get_context()->private_data = fs->user_data;
934
return fs->op.readdir(path, buf, filler, off, fi);
935
else if (fs->op.getdir) {
936
struct fuse_dirhandle dh;
939
return fs->op.getdir(path, &dh, fill_dir_old);
944
int fuse_fs_create(struct fuse_fs *fs, const char *path, mode_t mode,
945
struct fuse_file_info *fi)
947
fuse_get_context()->private_data = fs->user_data;
949
return fs->op.create(path, mode, fi);
954
int fuse_fs_lock(struct fuse_fs *fs, const char *path,
955
struct fuse_file_info *fi, int cmd, struct flock *lock)
957
fuse_get_context()->private_data = fs->user_data;
959
return fs->op.lock(path, fi, cmd, lock);
964
int fuse_fs_chown(struct fuse_fs *fs, const char *path, uid_t uid, gid_t gid)
966
fuse_get_context()->private_data = fs->user_data;
968
return fs->op.chown(path, uid, gid);
973
int fuse_fs_truncate(struct fuse_fs *fs, const char *path, off_t size)
975
fuse_get_context()->private_data = fs->user_data;
977
return fs->op.truncate(path, size);
982
int fuse_fs_ftruncate(struct fuse_fs *fs, const char *path, off_t size,
983
struct fuse_file_info *fi)
985
fuse_get_context()->private_data = fs->user_data;
986
if (fs->op.ftruncate)
987
return fs->op.ftruncate(path, size, fi);
988
else if (fs->op.truncate)
989
return fs->op.truncate(path, size);
994
int fuse_fs_utimens(struct fuse_fs *fs, const char *path,
995
const struct timespec tv[2])
997
fuse_get_context()->private_data = fs->user_data;
999
return fs->op.utimens(path, tv);
1000
else if(fs->op.utime) {
1002
buf.actime = tv[0].tv_sec;
1003
buf.modtime = tv[1].tv_sec;
1004
return fs->op.utime(path, &buf);
1009
int fuse_fs_access(struct fuse_fs *fs, const char *path, int mask)
1011
fuse_get_context()->private_data = fs->user_data;
1013
return fs->op.access(path, mask);
1018
int fuse_fs_readlink(struct fuse_fs *fs, const char *path, char *buf,
1021
fuse_get_context()->private_data = fs->user_data;
1022
if (fs->op.readlink)
1023
return fs->op.readlink(path, buf, len);
1028
int fuse_fs_mknod(struct fuse_fs *fs, const char *path, mode_t mode,
1031
fuse_get_context()->private_data = fs->user_data;
1033
return fs->op.mknod(path, mode, rdev);
1038
int fuse_fs_mkdir(struct fuse_fs *fs, const char *path, mode_t mode)
1040
fuse_get_context()->private_data = fs->user_data;
1042
return fs->op.mkdir(path, mode);
1047
int fuse_fs_setxattr(struct fuse_fs *fs, const char *path, const char *name,
1048
const char *value, size_t size, int flags)
1050
fuse_get_context()->private_data = fs->user_data;
1051
if (fs->op.setxattr)
1052
return fs->op.setxattr(path, name, value, size, flags);
1057
int fuse_fs_getxattr(struct fuse_fs *fs, const char *path, const char *name,
1058
char *value, size_t size)
1060
fuse_get_context()->private_data = fs->user_data;
1061
if (fs->op.getxattr)
1062
return fs->op.getxattr(path, name, value, size);
1067
int fuse_fs_listxattr(struct fuse_fs *fs, const char *path, char *list,
1070
fuse_get_context()->private_data = fs->user_data;
1071
if (fs->op.listxattr)
1072
return fs->op.listxattr(path, list, size);
1077
int fuse_fs_bmap(struct fuse_fs *fs, const char *path, size_t blocksize,
1080
fuse_get_context()->private_data = fs->user_data;
1082
return fs->op.bmap(path, blocksize, idx);
1087
int fuse_fs_removexattr(struct fuse_fs *fs, const char *path, const char *name)
1089
fuse_get_context()->private_data = fs->user_data;
1090
if (fs->op.removexattr)
1091
return fs->op.removexattr(path, name);
640
1096
static int is_open(struct fuse *f, fuse_ino_t dir, const char *name)
1212
1587
pthread_rwlock_rdlock(&f->tree_lock);
1213
1588
path = get_path_name(f, parent, name);
1214
1589
if (path != NULL) {
1215
if (f->conf.debug) {
1216
printf("MKDIR %s\n", path);
1220
if (f->op.mkdir && f->op.getattr) {
1221
struct fuse_intr_data d;
1222
fuse_prepare_interrupt(f, req, &d);
1223
err = f->op.mkdir(path, mode);
1224
fuse_finish_interrupt(f, req, &d);
1226
err = lookup_path(f, req, parent, name, path, &e, NULL);
1590
struct fuse_intr_data d;
1592
fprintf(stderr, "MKDIR %s\n", path);
1593
fuse_prepare_interrupt(f, req, &d);
1594
err = fuse_fs_mkdir(f->fs, path, mode);
1596
err = lookup_path(f, parent, name, path, &e, NULL);
1597
fuse_finish_interrupt(f, req, &d);
1230
1600
pthread_rwlock_unlock(&f->tree_lock);
1231
1601
reply_entry(req, &e, err);
1234
static void fuse_unlink(fuse_req_t req, fuse_ino_t parent, const char *name)
1236
struct fuse *f = req_fuse_prepare(req);
1241
pthread_rwlock_wrlock(&f->tree_lock);
1242
path = get_path_name(f, parent, name);
1244
if (f->conf.debug) {
1245
printf("UNLINK %s\n", path);
1250
if (!f->conf.hard_remove && is_open(f, parent, name))
1251
err = hide_node(f, req, path, parent, name);
1253
err = fuse_do_unlink(f, req, path);
1255
remove_node(f, parent, name);
1260
pthread_rwlock_unlock(&f->tree_lock);
1261
reply_err(req, err);
1264
static void fuse_rmdir(fuse_req_t req, fuse_ino_t parent, const char *name)
1266
struct fuse *f = req_fuse_prepare(req);
1271
pthread_rwlock_wrlock(&f->tree_lock);
1272
path = get_path_name(f, parent, name);
1274
if (f->conf.debug) {
1275
printf("RMDIR %s\n", path);
1280
struct fuse_intr_data d;
1281
fuse_prepare_interrupt(f, req, &d);
1282
err = f->op.rmdir(path);
1283
fuse_finish_interrupt(f, req, &d);
1604
static void fuse_lib_unlink(fuse_req_t req, fuse_ino_t parent,
1607
struct fuse *f = req_fuse_prepare(req);
1612
pthread_rwlock_wrlock(&f->tree_lock);
1613
path = get_path_name(f, parent, name);
1615
struct fuse_intr_data d;
1617
fprintf(stderr, "UNLINK %s\n", path);
1618
fuse_prepare_interrupt(f, req, &d);
1619
if (!f->conf.hard_remove && is_open(f, parent, name))
1620
err = hide_node(f, path, parent, name);
1622
err = fuse_fs_unlink(f->fs, path);
1285
1624
remove_node(f, parent, name);
1289
pthread_rwlock_unlock(&f->tree_lock);
1290
reply_err(req, err);
1293
static void fuse_symlink(fuse_req_t req, const char *linkname,
1294
fuse_ino_t parent, const char *name)
1626
fuse_finish_interrupt(f, req, &d);
1629
pthread_rwlock_unlock(&f->tree_lock);
1630
reply_err(req, err);
1633
static void fuse_lib_rmdir(fuse_req_t req, fuse_ino_t parent, const char *name)
1635
struct fuse *f = req_fuse_prepare(req);
1640
pthread_rwlock_wrlock(&f->tree_lock);
1641
path = get_path_name(f, parent, name);
1643
struct fuse_intr_data d;
1645
fprintf(stderr, "RMDIR %s\n", path);
1646
fuse_prepare_interrupt(f, req, &d);
1647
err = fuse_fs_rmdir(f->fs, path);
1648
fuse_finish_interrupt(f, req, &d);
1650
remove_node(f, parent, name);
1653
pthread_rwlock_unlock(&f->tree_lock);
1654
reply_err(req, err);
1657
static void fuse_lib_symlink(fuse_req_t req, const char *linkname,
1658
fuse_ino_t parent, const char *name)
1296
1660
struct fuse *f = req_fuse_prepare(req);
1297
1661
struct fuse_entry_param e;
3232
/* called with fuse_context_lock held or during initialization (before
3233
main() has been called) */
3234
void fuse_register_module(struct fuse_module *mod)
3237
mod->so = fuse_current_so;
3240
mod->next = fuse_modules;
2843
3244
#ifndef __FreeBSD__
2845
static int fuse_compat_open(struct fuse *f, fuse_req_t req, char *path,
2846
struct fuse_file_info *fi)
2849
struct fuse_intr_data d;
2850
if (!f->compat || f->compat >= 25)
2851
err = fuse_do_open(f, req, path, fi);
2852
else if (f->compat == 22) {
2853
struct fuse_file_info_compat tmp;
2854
memcpy(&tmp, fi, sizeof(tmp));
2855
fuse_prepare_interrupt(f, req, &d);
2856
err = ((struct fuse_operations_compat22 *) &f->op)->open(path, &tmp);
2857
fuse_finish_interrupt(f, req, &d);
2858
memcpy(fi, &tmp, sizeof(tmp));
2861
fuse_prepare_interrupt(f, req, &d);
2863
((struct fuse_operations_compat2 *) &f->op)->open(path, fi->flags);
2864
fuse_finish_interrupt(f, req, &d);
2869
static void fuse_compat_release(struct fuse *f, fuse_req_t req, char *path,
2870
struct fuse_file_info *fi)
2872
if (!f->compat || f->compat >= 22)
2873
fuse_do_release(f, req, path ? path : "-", fi);
2875
struct fuse_intr_data d;
2876
fuse_prepare_interrupt(f, req, &d);
2877
((struct fuse_operations_compat2 *) &f->op)->release(path, fi->flags);
2878
fuse_finish_interrupt(f, req, &d);
2882
static int fuse_compat_opendir(struct fuse *f, fuse_req_t req, char *path,
2883
struct fuse_file_info *fi)
2885
if (!f->compat || f->compat >= 25) {
2886
return fuse_do_opendir(f, req, path, fi);
2889
struct fuse_file_info_compat tmp;
2890
struct fuse_intr_data d;
2891
memcpy(&tmp, fi, sizeof(tmp));
2892
fuse_prepare_interrupt(f, req, &d);
2893
err = ((struct fuse_operations_compat22 *) &f->op)->opendir(path, &tmp);
2894
fuse_finish_interrupt(f, req, &d);
2895
memcpy(fi, &tmp, sizeof(tmp));
2901
static void convert_statfs_compat(struct fuse_statfs_compat1 *compatbuf,
2902
struct statvfs *stbuf)
2904
stbuf->f_bsize = compatbuf->block_size;
2905
stbuf->f_blocks = compatbuf->blocks;
2906
stbuf->f_bfree = compatbuf->blocks_free;
2907
stbuf->f_bavail = compatbuf->blocks_free;
2908
stbuf->f_files = compatbuf->files;
2909
stbuf->f_ffree = compatbuf->files_free;
2910
stbuf->f_namemax = compatbuf->namelen;
2913
static void convert_statfs_old(struct statfs *oldbuf, struct statvfs *stbuf)
2915
stbuf->f_bsize = oldbuf->f_bsize;
2916
stbuf->f_blocks = oldbuf->f_blocks;
2917
stbuf->f_bfree = oldbuf->f_bfree;
2918
stbuf->f_bavail = oldbuf->f_bavail;
2919
stbuf->f_files = oldbuf->f_files;
2920
stbuf->f_ffree = oldbuf->f_ffree;
2921
stbuf->f_namemax = oldbuf->f_namelen;
2924
static int fuse_compat_statfs(struct fuse *f, fuse_req_t req,
2925
struct statvfs *buf)
2928
struct fuse_intr_data d;
2930
if (!f->compat || f->compat >= 25) {
2931
err = fuse_do_statfs(f, req, "/", buf);
2932
} else if (f->compat > 11) {
2933
struct statfs oldbuf;
2934
fuse_prepare_interrupt(f, req, &d);
2935
err = ((struct fuse_operations_compat22 *) &f->op)->statfs("/", &oldbuf);
2936
fuse_finish_interrupt(f, req, &d);
2938
convert_statfs_old(&oldbuf, buf);
2940
struct fuse_statfs_compat1 compatbuf;
2941
memset(&compatbuf, 0, sizeof(struct fuse_statfs_compat1));
2942
fuse_prepare_interrupt(f, req, &d);
2943
err = ((struct fuse_operations_compat1 *) &f->op)->statfs(&compatbuf);
2944
fuse_finish_interrupt(f, req, &d);
2946
convert_statfs_compat(&compatbuf, buf);
2951
3246
static struct fuse *fuse_new_common_compat(int fd, const char *opts,
2952
3247
const struct fuse_operations *op,
2953
3248
size_t op_size, int compat)