Date: Sun, 26 Jun 2011 09:51:16 GMT From: Ilya Putsikau <ilya@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 195351 for review Message-ID: <201106260951.p5Q9pGXl012514@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@195351?ac=10 Change 195351 by ilya@ilya_triton2011 on 2011/06/26 09:50:11 Reduce diffs against macfuse 2.0 Rename: fusedev_get_data -> fuse_get_devdata fusefs_get_data -> fuse_get_mpdata fdata_kick_set -> fdata_set_dead fdata_kick_get -> fdata_get_dead (macfuse uses fdata_dead_get) Affected files ... .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_device.c#7 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_file.c#5 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_file.h#3 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_internal.c#12 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_internal.h#13 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_io.c#11 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_ipc.c#7 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_ipc.h#9 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_node.c#7 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_node.h#9 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_param.h#2 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vfsops.c#16 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#24 edit Differences ... ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_device.c#7 (text+ko) ==== @@ -123,7 +123,7 @@ fdata = fdata_alloc(dev, td->td_ucred); FUSE_LOCK(); - if (fusedev_get_data(dev)) { + if (fuse_get_devdata(dev)) { FUSE_UNLOCK(); fdata_destroy(fdata); goto busy; @@ -131,7 +131,7 @@ #if ! (DO_GIANT_MANUALLY && USE_FUSE_LOCK) fuse_useco++; #endif - fdata->dataflag |= FSESS_OPENED; + fdata->dataflags |= FSESS_OPENED; dev->si_drv1 = fdata; } FUSE_UNLOCK(); @@ -163,13 +163,13 @@ mtx_lock(&Giant); #endif FUSE_LOCK(); - data = fusedev_get_data(dev); + data = fuse_get_devdata(dev); if (! data) panic("no fuse data upon fuse device close"); - KASSERT(data->dataflag | FSESS_OPENED, + KASSERT(data->dataflags | FSESS_OPENED, ("fuse device is already closed upon close")); - fdata_kick_set(data); - data->dataflag &= ~FSESS_OPENED; + fdata_set_dead(data); + data->dataflags &= ~FSESS_OPENED; mtx_lock(&data->aw_mtx); /* wakup poll()ers */ @@ -213,11 +213,11 @@ struct fuse_data *data; int revents = 0; - data = fusedev_get_data(dev); + data = fuse_get_devdata(dev); if (events & (POLLIN | POLLRDNORM)) { mtx_lock(&data->ms_mtx); - if (fdata_kick_get(data) || STAILQ_FIRST(&data->ms_head)) + if (fdata_get_dead(data) || STAILQ_FIRST(&data->ms_head)) revents |= events & (POLLIN | POLLRDNORM); else selrecord(td, &data->ks_rsel); @@ -246,13 +246,13 @@ int buflen[3]; int i; - data = fusedev_get_data(dev); + data = fuse_get_devdata(dev); DEBUG("fuse device being read on thread %d\n", uio->uio_td->td_tid); mtx_lock(&data->ms_mtx); again: - if (fdata_kick_get(data)) { + if (fdata_get_dead(data)) { DEBUG2G("we know early on that reader should be kicked so we don't wait for news\n"); mtx_unlock(&data->ms_mtx); return (ENODEV); @@ -269,7 +269,7 @@ err = msleep(data, &data->ms_mtx, PCATCH, "fu_msg", 0); if (err != 0) { mtx_unlock(&data->ms_mtx); - return (fdata_kick_get(data) ? ENODEV : err); + return (fdata_get_dead(data) ? ENODEV : err); } tick = fuse_ms_pop(data); } @@ -286,7 +286,7 @@ } mtx_unlock(&data->ms_mtx); - if (fdata_kick_get(data)) { + if (fdata_get_dead(data)) { /* * somebody somewhere -- eg., umount routine -- * wants this liaison finished off @@ -331,7 +331,7 @@ * fallacy as loud as possible... */ if (uio->uio_resid < buflen[i]) { - fdata_kick_set(data); + fdata_set_dead(data); DEBUG2G("daemon is stupid, kick it off...\n"); err = ENODEV; break; @@ -392,11 +392,11 @@ DEBUG("Fuse write -- resid: %zd, iovcnt: %d, thread: %d\n", uio->uio_resid, uio->uio_iovcnt, uio->uio_td->td_tid); - data = fusedev_get_data(dev); + data = fuse_get_devdata(dev); if (uio->uio_resid < sizeof(struct fuse_out_header)) { DEBUG("got less than a header!\n"); - fdata_kick_set(data); + fdata_set_dead(data); return (EINVAL); } @@ -411,7 +411,7 @@ * header. */ if ((err = fuse_ohead_audit(&ohead, uio))) { - fdata_kick_set(data); + fdata_set_dead(data); return (err); } @@ -473,7 +473,7 @@ */ DEBUG("erhm, no handler for this response\n"); - fdata_kick_set(data); + fdata_set_dead(data); return (EINVAL); } ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_file.c#5 (text+ko) ==== @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006 Google. All Rights Reserved. + * Copyright (C) 2006-2008 Google. All Rights Reserved. * Amit Singh <singh@> */ @@ -37,33 +37,38 @@ &fuse_fh_upcall_count, 0, ""); int -fuse_filehandle_get(struct vnode *vp, struct thread *td, struct ucred *cred, fufh_type_t fufh_type) +fuse_filehandle_get(struct vnode *vp, + struct thread *td, + struct ucred *cred, + fufh_type_t fufh_type) { - struct fuse_vnode_data *fvdat = VTOFUD(vp); struct fuse_dispatcher fdi; struct fuse_open_in *foi; struct fuse_open_out *foo; struct fuse_filehandle *fufh; + struct fuse_vnode_data *fvdat = VTOFUD(vp); - int err = 0; - int isdir = 0; - int op = FUSE_OPEN; + int err = 0; + int isdir = 0; int oflags = fuse_filehandle_xlate_to_oflags(fufh_type); + int op = FUSE_OPEN; fuse_trace_printf("fuse_filehandle_get(vp=%p, fufh_type=%d)\n", vp, fufh_type); fufh = &(fvdat->fufh[fufh_type]); + if (fufh->fufh_flags & FUFH_VALID) { - printf("the given fufh type is already valid ... called in vain\n"); + printf("FUSE: filehandle_get called despite valid fufh (type=%d)", + fufh_type); return 0; } - if (vnode_vtype(vp) == VDIR) { + if (vnode_isdir(vp)) { isdir = 1; op = FUSE_OPENDIR; if (fufh_type != FUFH_RDONLY) { - printf("non-rdonly fh requested for a directory?\n"); + printf("FUSE: non-rdonly fh requested for a directory?\n"); fufh_type = FUFH_RDONLY; } } @@ -82,12 +87,12 @@ foo = fdi.answ; + fufh->fh_id = foo->fh; fufh->fufh_flags |= (0 | FUFH_VALID); fufh->open_count = 1; fufh->open_flags = oflags; fufh->fuse_open_flags = foo->open_flags; fufh->type = fufh_type; - fufh->fh_id = foo->fh; fuse_ticket_drop(fdi.tick); @@ -101,11 +106,11 @@ struct fuse_dispatcher fdi; struct fuse_release_in *fri; struct fuse_vnode_data *fvdat = VTOFUD(vp); - struct fuse_filehandle *fufh = NULL; + struct fuse_filehandle *fufh = NULL; - int op = FUSE_RELEASE; - int err = 0; + int err = 0; int isdir = 0; + int op = FUSE_RELEASE; fuse_trace_printf("fuse_filehandle_put(vp=%p, fufh_type=%d)\n", vp, fufh_type); @@ -117,14 +122,16 @@ } if (fufh->open_count != 0) { - panic("trying to put fufh with open count %d\n", fufh->open_count); + panic("FUSE: filehandle_put called on a valid fufh (type=%d)", + fufh_type); + /* NOTREACHED */ } if (fufh->fufh_flags & FUFH_MAPPED) { panic("trying to put mapped fufh\n"); } - if (vnode_vtype(vp) == VDIR) { + if (vnode_isdir(vp)) { op = FUSE_RELEASEDIR; isdir = 1; } @@ -149,5 +156,5 @@ out: fufh->fufh_flags &= ~FUFH_VALID; - return (err); + return err; } ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_file.h#3 (text+ko) ==== @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006 Google. All Rights Reserved. + * Copyright (C) 2006-2008 Google. All Rights Reserved. * Amit Singh <singh@> */ @@ -25,16 +25,17 @@ #define FUFH_STRATEGY 0x00000004 struct fuse_filehandle { - uint64_t fh_id; + uint64_t fh_id; + int open_count; + int open_flags; + int fuse_open_flags; fufh_type_t type; - int fufh_flags; - int open_count; - int open_flags; - int fuse_open_flags; + int fufh_flags; }; typedef struct fuse_filehandle * fuse_filehandle_t; -static __inline__ fufh_type_t +static __inline__ +fufh_type_t fuse_filehandle_xlate_from_mmap(int fflags) { if (fflags & (PROT_READ | PROT_WRITE)) { @@ -48,7 +49,8 @@ } } -static __inline__ fufh_type_t +static __inline__ +fufh_type_t fuse_filehandle_xlate_from_fflags(int fflags) { if ((fflags & FREAD) && (fflags & FWRITE)) { @@ -58,25 +60,30 @@ } else if (fflags & (FREAD)) { return FUFH_RDONLY; } else { - panic("What kind of a flag is this?"); + panic("FUSE: What kind of a flag is this (%x)?", fflags); } } -static __inline__ int +static __inline__ +int fuse_filehandle_xlate_to_oflags(fufh_type_t type) { int oflags = -1; switch (type) { + case FUFH_RDONLY: oflags = O_RDONLY; break; + case FUFH_WRONLY: oflags = O_WRONLY; break; + case FUFH_RDWR: oflags = O_RDWR; break; + default: break; } ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_internal.c#12 (text+ko) ==== @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006 Google. All Rights Reserved. + * Copyright (C) 2006-2008 Google. All Rights Reserved. * Amit Singh <singh@> */ @@ -50,9 +50,6 @@ /* access */ -static __inline int fuse_match_cred(struct ucred *daemoncred, - struct ucred *usercred); - int fuse_internal_access(struct vnode *vp, mode_t mode, @@ -62,7 +59,7 @@ { int err = 0; uint32_t mask = 0; - int dataflag; + int dataflags; int vtype; struct mount *mp; struct fuse_dispatcher fdi; @@ -78,8 +75,8 @@ mp = vnode_mount(vp); vtype = vnode_vtype(vp); - data = fusefs_get_data(mp); - dataflag = data->dataflag; + data = fuse_get_mpdata(mp); + dataflags = data->dataflags; if ((mode & VWRITE) && vfs_isrdonly(mp)) { return EACCES; @@ -87,7 +84,7 @@ // Unless explicitly permitted, deny everyone except the fs owner. if (vnode_isvroot(vp) && !(facp->facc_flags & FACCESS_NOCHECKSPY)) { - if (!(dataflag & FSESS_DAEMON_CAN_SPY)) { + if (!(dataflags & FSESS_DAEMON_CAN_SPY)) { int denied = fuse_match_cred(data->daemoncred, cred); if (denied) { @@ -111,12 +108,12 @@ #endif } - if (fusefs_get_data(mp)->dataflag & FSESS_NOACCESS) { + if (fuse_get_mpdata(mp)->dataflags & FSESS_NOACCESS) { // Let the kernel handle this. return 0; } - if (dataflag & FSESS_DEFAULT_PERMISSIONS) { + if (dataflags & FSESS_DEFAULT_PERMISSIONS) { // Let the kernel handle this. return 0; } @@ -152,35 +149,13 @@ } if (err == ENOSYS) { - fusefs_get_data(mp)->dataflag |= FSESS_NOACCESS; + fuse_get_mpdata(mp)->dataflags |= FSESS_NOACCESS; err = 0; // ENOTSUP; } return err; } -/* - * An access check routine based on fuse_allow_task() of the Linux module. - * Now we use this one rather than the more permissive function we used to - * (and which seemed more logical to me), to ensure uniform behaviour on Linux - * and FreeBSD. - * - * Non-null return value indicates error (ie., "not allowed"). - */ -static __inline int -fuse_match_cred(struct ucred *basecred, struct ucred *usercred) -{ - if (basecred->cr_uid == usercred->cr_uid && - basecred->cr_uid == usercred->cr_ruid && - basecred->cr_uid == usercred->cr_svuid && - basecred->cr_groups[0] == usercred->cr_groups[0] && - basecred->cr_groups[0] == usercred->cr_rgid && - basecred->cr_groups[0] == usercred->cr_svgid) - return (0); - - return (EPERM); -} - /* fsync */ int @@ -189,7 +164,7 @@ fuse_trace_printf_func(); if (tick->tk_aw_ohead.error == ENOSYS) { - tick->tk_data->dataflag |= (fticket_opcode(tick) == FUSE_FSYNC) ? + tick->tk_data->dataflags |= (fticket_opcode(tick) == FUSE_FSYNC) ? FSESS_NOFSYNC : FSESS_NOFSYNCDIR; } @@ -213,7 +188,7 @@ fdip->iosize = sizeof(*ffsi); fdip->tick = NULL; - if (vnode_vtype(vp) == VDIR) { + if (vnode_isdir(vp)) { op = FUSE_FSYNCDIR; } @@ -221,7 +196,7 @@ ffsi = fdip->indata; ffsi->fh = fufh->fh_id; - ffsi->fsync_flags = 1; + ffsi->fsync_flags = 1; /* datasync */ fuse_insert_callback(fdip->tick, fuse_internal_fsync_callback); fuse_insert_message(fdip->tick); @@ -243,7 +218,7 @@ struct fuse_read_in *fri; if (uio_resid(uio) == 0) { - return (0); + return 0; } fdisp_init(&fdi, 0); @@ -293,7 +268,7 @@ struct fuse_iov *cookediov = param; if (bufsize < FUSE_NAME_OFFSET) { - return (-1); + return -1; } for (;;) { @@ -303,11 +278,11 @@ break; } - cou++; - fudge = (struct fuse_dirent *)buf; freclen = FUSE_DIRENT_SIZE(fudge); + cou++; + if (bufsize < freclen) { err = ((cou == 1) ? -1 : 0); break; @@ -336,9 +311,9 @@ fiov_adjust(cookediov, bytesavail); de = (struct dirent *)cookediov->base; - de->d_fileno = fudge->ino; /* XXX cast from 64 to 32 bits */ + de->d_fileno = fudge->ino; /* XXX: truncation */ de->d_reclen = bytesavail; - de->d_type = fudge->type; + de->d_type = fudge->type; de->d_namlen = fudge->namelen; memcpy((char *)cookediov->base + sizeof(struct dirent) - MAXNAMLEN - 1, (char *)buf + FUSE_NAME_OFFSET, fudge->namelen); @@ -354,14 +329,14 @@ uio_setoffset(uio, fudge->off); } - return (err); + return err; } /* remove */ #ifdef XXXIP static int -fuse_unlink_callback(struct vnode *vp, void *cargs) +fuse_internal_remove_callback(struct vnode *vp, void *cargs) { struct vattr *vap; uint64_t target_nlink; @@ -370,7 +345,8 @@ target_nlink = *(uint64_t *)cargs; - if ((vap->va_nlink == target_nlink) && (vnode_vtype(vp) == VREG)) { + /* somewhat lame "heuristics", but you got better ideas? */ + if ((vap->va_nlink == target_nlink) && vnode_isreg(vp)) { fuse_invalidate_attr(vp); } @@ -386,6 +362,7 @@ enum fuse_opcode op) { struct fuse_dispatcher fdi; + struct vattr *vap = VTOVA(vp); #if INVALIDATE_CACHED_VATTRS_UPON_UNLINK int need_invalidate = 0; @@ -415,16 +392,24 @@ fuse_invalidate_attr(dvp); fuse_invalidate_attr(vp); -#if INVALIDATE_CACHED_VATTRS_UPON_UNLINK #ifdef XXXIP + /* + * XXX: INVALIDATE_CACHED_VATTRS_UPON_UNLINK + * + * Consider the case where vap->va_nlink > 1 for the entity being + * removed. In our world, other in-memory vnodes that share a link + * count each with this one may not know right way that this one just + * got deleted. We should let them know, say, through a vnode_iterate() + * here and a callback that does fuse_invalidate_attr(vp) on each + * relevant vnode. + */ if (need_invalidate && !err) { - vnode_iterate(vnode_mount(vp), 0, fuse_unlink_callback, + vnode_iterate(vnode_mount(vp), 0, fuse_internal_remove_callback, (void *)&target_nlink); } #endif -#endif - return (err); + return err; } /* rename */ @@ -461,7 +446,7 @@ fuse_invalidate_attr(tdvp); } - return (err); + return err; } /* strategy */ @@ -500,10 +485,8 @@ struct fuse_entry_out *feo; struct mount *mp = vnode_mount(dvp); - debug_printf("fdip=%p\n", fdip); - if ((err = fdisp_wait_answ(fdip))) { - return (err); + return err; } feo = fdip->answ; @@ -512,8 +495,7 @@ goto out; } - err = fuse_vnode_get(mp, feo->nodeid, dvp, vpp, cnp, - vtyp, 0); + err = fuse_vnode_get(mp, feo->nodeid, dvp, vpp, cnp, vtyp, 0); if (err) { fuse_internal_forget_send(mp, cnp->cn_thread, cnp->cn_cred, feo->nodeid, 1, fdip); return err; @@ -534,33 +516,32 @@ enum fuse_opcode op, void *buf, size_t bufsize, - enum vtype vtyp) + enum vtype vtype) { int err; struct fuse_dispatcher fdi; + struct mount *mp = vnode_mount(dvp); fdisp_init(&fdi, 0); - fuse_internal_newentry_makerequest(vnode_mount(dvp), VTOI(dvp), cnp, - op, buf, bufsize, &fdi); - err = fuse_internal_newentry_core(dvp, vpp, cnp, vtyp, &fdi); + fuse_internal_newentry_makerequest(mp, VTOI(dvp), cnp, op, buf, + bufsize, &fdi); + err = fuse_internal_newentry_core(dvp, vpp, cnp, vtype, &fdi); fuse_invalidate_attr(dvp); - return (err); + return err; } /* entity destruction */ int -fuse_internal_forget_callback(struct fuse_ticket *tick, struct uio *uio) +fuse_internal_forget_callback(struct fuse_ticket *ftick, struct uio *uio) { struct fuse_dispatcher fdi; - debug_printf("tick=%p, uio=%p\n", tick, uio); + fdi.tick = ftick; - fdi.tick = tick; - fuse_internal_forget_send(tick->tk_data->mp, curthread, NULL, - ((struct fuse_in_header *)tick->tk_ms_fiov.base)->nodeid, - 1, &fdi); + fuse_internal_forget_send(ftick->tk_data->mp, curthread, NULL, + ((struct fuse_in_header *)ftick->tk_ms_fiov.base)->nodeid, 1, &fdi); return 0; } @@ -637,15 +618,15 @@ fuse_ticket_drop(tick); if (err) { - fdata_kick_set(data); + fdata_set_dead(data); } mtx_lock(&data->ticket_mtx); - data->dataflag |= FSESS_INITED; + data->dataflags |= FSESS_INITED; wakeup(&data->ticketer); mtx_unlock(&data->ticket_mtx); - return (0); + return 0; } void ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_internal.h#13 (text+ko) ==== @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006 Google. All Rights Reserved. + * Copyright (C) 2006-2008 Google. All Rights Reserved. * Amit Singh <singh@> */ @@ -86,6 +86,46 @@ uio->uio_resid = resid; } +/* time */ + +#define fuse_timespec_add(vvp, uvp) \ + do { \ + (vvp)->tv_sec += (uvp)->tv_sec; \ + (vvp)->tv_nsec += (uvp)->tv_nsec; \ + if ((vvp)->tv_nsec >= 1000000000) { \ + (vvp)->tv_sec++; \ + (vvp)->tv_nsec -= 1000000000; \ + } \ + } while (0) + +#define fuse_timespec_cmp(tvp, uvp, cmp) \ + (((tvp)->tv_sec == (uvp)->tv_sec) ? \ + ((tvp)->tv_nsec cmp (uvp)->tv_nsec) : \ + ((tvp)->tv_sec cmp (uvp)->tv_sec)) + +/* miscellaneous */ + +#define fuse_isdeadfs_nop(vp) 0 + +static __inline__ +int +fuse_isdeadfs(struct vnode *vp) +{ + struct mount *mp = vnode_mount(vp); + struct fuse_data *data = fuse_get_mpdata(mp); + + return (data->dataflags & FSESS_DEAD); +} + +static __inline__ +int +fuse_isdeadfs_mp(struct mount *mp) +{ + struct fuse_data *data = fuse_get_mpdata(mp); + + return (data->dataflags & FSESS_DEAD); +} + /* access */ #define FVP_ACCESS_NOOP 0x01 @@ -100,11 +140,25 @@ #define FACCESS_XQUERIES FACCESS_STICKY | FACCESS_CHOWN | FACCESS_SETGID struct fuse_access_param { - uid_t xuid; - gid_t xgid; - unsigned facc_flags; + uid_t xuid; + gid_t xgid; + uint32_t facc_flags; }; +static __inline int +fuse_match_cred(struct ucred *basecred, struct ucred *usercred) +{ + if (basecred->cr_uid == usercred->cr_uid && + basecred->cr_uid == usercred->cr_ruid && + basecred->cr_uid == usercred->cr_svuid && + basecred->cr_groups[0] == usercred->cr_groups[0] && + basecred->cr_groups[0] == usercred->cr_rgid && + basecred->cr_groups[0] == usercred->cr_svgid) + return 0; + + return EPERM; +} + int fuse_internal_access(struct vnode *vp, mode_t mode, @@ -152,15 +206,6 @@ vap->va_flags = 0; } -#define timespecadd(vvp, uvp) \ - do { \ - (vvp)->tv_sec += (uvp)->tv_sec; \ - (vvp)->tv_nsec += (uvp)->tv_nsec; \ - if ((vvp)->tv_nsec >= 1000000000) { \ - (vvp)->tv_sec++; \ - (vvp)->tv_nsec -= 1000000000; \ - } \ - } while (0) #define cache_attrs(vp, fuse_out) do { \ struct timespec uptsp_ ## __func__; \ @@ -169,7 +214,7 @@ VTOFUD(vp)->cached_attrs_valid.tv_nsec = (fuse_out)->attr_valid_nsec; \ nanouptime(&uptsp_ ## __func__); \ \ - timespecadd(&VTOFUD(vp)->cached_attrs_valid, &uptsp_ ## __func__); \ + fuse_timespec_add(&VTOFUD(vp)->cached_attrs_valid, &uptsp_ ## __func__); \ \ fuse_internal_attr_fat2vat(vnode_mount(vp), &(fuse_out)->attr, VTOVA(vp)); \ } while (0) @@ -235,22 +280,22 @@ if (vtyp != IFTOVT(feo->attr.mode)) { DEBUGX(FUSE_DEBUG_INTERNAL, "EINVAL -- %x != %x\n", vtyp, IFTOVT(feo->attr.mode)); - return (EINVAL); + return EINVAL; } if (feo->nodeid == FUSE_NULL_ID) { DEBUGX(FUSE_DEBUG_INTERNAL, "EINVAL -- feo->nodeid is NULL\n"); - return (EINVAL); + return EINVAL; } if (feo->nodeid == FUSE_ROOT_ID) { DEBUGX(FUSE_DEBUG_INTERNAL, "EINVAL -- feo->nodeid is FUSE_ROOT_ID\n"); - return (EINVAL); + return EINVAL; } - return (0); + return 0; } int @@ -296,27 +341,4 @@ int fuse_internal_init_callback(struct fuse_ticket *tick, struct uio *uio); void fuse_internal_send_init(struct fuse_data *data, struct thread *td); -/* miscellaneous */ - -#define fuse_isdeadfs_nop(vp) 0 - -static __inline__ -int -fuse_isdeadfs(struct vnode *vp) -{ - struct mount *mp = vnode_mount(vp); - struct fuse_data *data = fusefs_get_data(mp); - - return (data->dataflag & FSESS_KICK); -} - -static __inline__ -int -fuse_isdeadfs_mp(struct mount *mp) -{ - struct fuse_data *data = fusefs_get_data(mp); - - return (data->dataflag & FSESS_KICK); -} - #endif /* _FUSE_INTERNAL_H_ */ ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_io.c#11 (text+ko) ==== @@ -337,7 +337,7 @@ fri->fh = fufh->fh_id; fri->offset = uio->uio_offset; fri->size = MIN(uio->uio_resid, - fusefs_get_data(vp->v_mount)->max_read); + fuse_get_mpdata(vp->v_mount)->max_read); DEBUG2G("fri->fh %ju, fri->offset %ju, fri->size %ju\n", (uintmax_t)fri->fh, (uintmax_t)fri->offset, (uintmax_t)fri->size); @@ -373,8 +373,8 @@ int chunksize = 0; struct iovec *iov; int nmax = (uio->uio_rw == UIO_READ) ? - fusefs_get_data(vp->v_mount)->max_read : - fusefs_get_data(vp->v_mount)->max_write; + fuse_get_mpdata(vp->v_mount)->max_read : + fuse_get_mpdata(vp->v_mount)->max_write; op = fioda->opcode ?: ((uio->uio_rw == UIO_READ) ? FUSE_READ : FUSE_WRITE); @@ -487,7 +487,7 @@ while (uio->uio_resid > 0) { chunksize = MIN(uio->uio_resid, - fusefs_get_data(vp->v_mount)->max_write); + fuse_get_mpdata(vp->v_mount)->max_write); fdi.iosize = sizeof(*fwi) + chunksize; fdisp_make_vp(&fdi, FUSE_WRITE, vp, td, cred); @@ -808,7 +808,7 @@ while (bp->b_resid > 0) { DEBUG2G("starting bio with resid %ld\n", bp->b_resid); chunksize = MIN(bp->b_resid, - fusefs_get_data(vp->v_mount)->max_read); + fuse_get_mpdata(vp->v_mount)->max_read); fdi.iosize = sizeof(*fri); if (! op) op = vp->v_type == VDIR ? FUSE_READDIR : FUSE_READ; @@ -878,7 +878,7 @@ bufdat = bp->b_data + bp->b_dirtyoff; while (bp->b_dirtyend > bp->b_dirtyoff) { chunksize = MIN(bp->b_dirtyend - bp->b_dirtyoff, - fusefs_get_data(vp->v_mount)->max_write); + fuse_get_mpdata(vp->v_mount)->max_write); fdi.iosize = sizeof(*fwi); op = op ?: FUSE_WRITE; ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_ipc.c#7 (text+ko) ==== @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006 Google. All Rights Reserved. + * Copyright (C) 2006-2008 Google. All Rights Reserved. * Amit Singh <singh@> */ @@ -32,25 +32,30 @@ #include "fuse_debug.h" static struct fuse_ticket *fticket_alloc(struct fuse_data *data); -static void fticket_refresh(struct fuse_ticket *tick); -static void fticket_destroy(struct fuse_ticket *tick); -static int fticket_wait_answer(struct fuse_ticket *tick); -static __inline__ int fticket_aw_pull_uio(struct fuse_ticket *tick, struct uio *uio); -static __inline__ void fuse_push_freeticks(struct fuse_ticket *tick); +static void fticket_refresh(struct fuse_ticket *ftick); +static void fticket_destroy(struct fuse_ticket *ftick); +static int fticket_wait_answer(struct fuse_ticket *ftick); +static __inline__ int fticket_aw_pull_uio(struct fuse_ticket *ftick, + struct uio *uio); +static __inline__ void fuse_push_freeticks(struct fuse_ticket *ftick); static __inline__ struct fuse_ticket * fuse_pop_freeticks(struct fuse_data *data); -static __inline__ void fuse_push_allticks(struct fuse_ticket *tick); -static __inline__ void fuse_remove_allticks(struct fuse_ticket *tick); +static __inline__ void fuse_push_allticks(struct fuse_ticket *ftick); +static __inline__ void fuse_remove_allticks(struct fuse_ticket *ftick); static struct fuse_ticket *fuse_pop_allticks(struct fuse_data *data); -static int fuse_body_audit(struct fuse_ticket *tick, size_t blen); +static int fuse_body_audit(struct fuse_ticket *ftick, size_t blen); static __inline__ void fuse_setup_ihead(struct fuse_in_header *ihead, - struct fuse_ticket *tick, uint64_t nid, - enum fuse_opcode op, size_t blen, - pid_t pid, struct ucred *cred); -static fuse_handler_t fuse_standard_handler; + struct fuse_ticket *ftick, + uint64_t nid, + enum fuse_opcode op, + size_t blen, + pid_t pid, + struct ucred *cred); + +static fuse_handler_t fuse_standard_handler; SYSCTL_NODE(_vfs, OID_AUTO, fuse, CTLFLAG_RW, 0, "FUSE tunables"); SYSCTL_STRING(_vfs_fuse, OID_AUTO, fuse4bsd_version, CTLFLAG_RD, @@ -76,11 +81,15 @@ void fiov_init(struct fuse_iov *fiov, size_t size) { + uint32_t msize = FU_AT_LEAST(size); + debug_printf("fiov=%p, size=%zd\n", fiov, size); fiov->len = 0; - fiov->base = malloc(FU_AT_LEAST(size), M_FUSEMSG, M_WAITOK | M_ZERO); - fiov->allocated_size = FU_AT_LEAST(size); + + fiov->base = malloc(msize, M_FUSEMSG, M_WAITOK | M_ZERO); + + fiov->allocated_size = msize; fiov->credit = fuse_iov_credit; } @@ -124,172 +133,149 @@ fiov_adjust(fiov, 0); } -/* - * Tickets are carriers of communication with a fuse daemon. - * Tickets have a unique id, which should be kept unique - * among synchronously used tickets. The everyday routine: - * + Syscall handler gets one by fuse_ticket_fetch() - * (then, behind the scenes, either a fresh one is allocated - * or a cached old one is put into use again) - * + Sets up data to be passed to the daemon - * (there is a message node attached to the ticket) - * + If she knows that answer will come, sets up the callback node - * attached to the ticket, and enqueues it to the callback nodes' list - * + enqueues the message and kicks fusedev_read() - * + if daemon gives a proper answer, it will contain the unique id, by which - * fusedev_write() can pick the pre-prepared callback node and run it. - * There is the standard callback handler which just awakes the syscall - * handler who then waits for the response, deal with it by herself. - * Another option is to write a full-fledged callback handler which does all - * data processing within fusedev_write()'s thread (although we never do - * this). Or, if the answer is uninteresting, a NULL handler can be used. - * + After answer has been consumed, the handler or anyone to whom the control - * has been passed supposed to call ticket_drop() - * (then, behind the scenes, either the ticket is destroyed, or put into - * cache) - */ - static struct fuse_ticket * fticket_alloc(struct fuse_data *data) { - struct fuse_ticket *tick; + struct fuse_ticket *ftick; debug_printf("data=%p\n", data); - tick = malloc(sizeof(*tick), M_FUSEMSG, M_WAITOK | M_ZERO); + ftick = malloc(sizeof(*ftick), M_FUSEMSG, M_WAITOK | M_ZERO); >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201106260951.p5Q9pGXl012514>