Date: Mon, 18 Jul 2011 07:45:29 GMT From: Ilya Putsikau <ilya@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 196335 for review Message-ID: <201107180745.p6I7jTqw035401@skunkworks.freebsd.org>
index | next in thread | raw e-mail
http://p4web.freebsd.org/@@196335?ac=10 Change 196335 by ilya@ilya_triton2011 on 2011/07/18 07:44:59 Check vnode_extend return code and if dead in bio backend read and write Return ENXIO if file system is dead. Remove DONT_TRY_HARD_PREVENT_IO_IN_VAIN hack Don't kill file system if handler not found for response Affected files ... .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_device.c#12 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_internal.h#18 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_io.c#18 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_ipc.c#12 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_ipc.h#13 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#41 edit Differences ... ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_device.c#12 (text+ko) ==== @@ -395,9 +395,7 @@ } else { /* no callback at all! */ DEBUG("erhm, no handler for this response\n"); - - fdata_set_dead(data); - return (EINVAL); + err = EINVAL; } return (err); ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_internal.h#18 (text+ko) ==== @@ -105,33 +105,17 @@ /* miscellaneous */ -#define fuse_isdeadfs_nop(vp) 0 - static __inline__ int -fuse_isdeadfs_mp(struct mount *mp) +fuse_isdeadfs(struct vnode *vp) { - struct fuse_data *data = fuse_get_mpdata(mp); + struct fuse_data *data = fuse_get_mpdata(vnode_mount(vp)); return (data->dataflags & FSESS_DEAD); } static __inline__ int -fuse_isdeadfs(struct vnode *vp) -{ - return fuse_isdeadfs_mp(vnode_mount(vp)); -} - -static __inline__ -int -fuse_isdeadfs_fs(struct vnode *vp) -{ - return fuse_isdeadfs_mp(vnode_mount(vp)); -} - -static __inline__ -int fuse_iosize(struct vnode *vp) { return vp->v_mount->mnt_stat.f_iosize; ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_io.c#18 (text+ko) ==== @@ -137,6 +137,11 @@ filesize = VTOFUD(vp)->filesize; do { + if (fuse_isdeadfs(vp)) { + err = ENXIO; + break; + } + lbn = uio->uio_offset / biosize; on = uio->uio_offset & (biosize - 1); @@ -337,6 +342,11 @@ * no point optimizing for something that really won't ever happen. */ do { + if (fuse_isdeadfs(vp)) { + err = ENXIO; + break; + } + lbn = uio->uio_offset / biosize; on = uio->uio_offset & (biosize-1); n = MIN((unsigned)(biosize - on), uio->uio_resid); @@ -363,7 +373,11 @@ if (bp != NULL) { long save; - fuse_vnode_extend(vp, cred, uio->uio_offset + n); + err = fuse_vnode_extend(vp, cred, uio->uio_offset + n); + if (err) { + brelse(bp); + break; + } save = bp->b_flags & B_CACHE; bcount += n; @@ -384,8 +398,12 @@ } DEBUG("getting block from OS, bcount %d\n", bcount); bp = getblk(vp, lbn, bcount, PCATCH, 0, 0); - if (uio->uio_offset + n > fvdat->filesize) { - fuse_vnode_extend(vp, cred, uio->uio_offset + n); + if (bp && uio->uio_offset + n > fvdat->filesize) { + err = fuse_vnode_extend(vp, cred, uio->uio_offset + n); + if (err) { + brelse(bp); + break; + } } } ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_ipc.c#12 (text+ko) ==== @@ -355,14 +355,6 @@ free(data,M_FUSEMSG); } -int -fdata_get_dead(struct fuse_data *data) -{ - debug_printf("data=%p\n", data); - - return (data->dataflags & FSESS_DEAD); -} - void fdata_set_dead(struct fuse_data *data) { @@ -863,11 +855,6 @@ if ((err = fticket_wait_answer(fdip->tick))) { // interrupted -#ifndef DONT_TRY_HARD_PREVENT_IO_IN_VAIN - struct fuse_ticket *tick; - unsigned age; -#endif - debug_printf("IPC: interrupted, err = %d\n", err); fuse_lck_mtx_lock(fdip->tick->tk_aw_mtx); @@ -888,31 +875,8 @@ * to drop the ticket. */ debug_printf("IPC: setting to answered\n"); - age = fdip->tick->tk_age; fticket_set_answered(fdip->tick); fuse_lck_mtx_unlock(fdip->tick->tk_aw_mtx); -#ifndef DONT_TRY_HARD_PREVENT_IO_IN_VAIN - /* - * If we are willing to pay with one more locking, we - * can save on I/O by getting the device write handler - * to drop the ticket. That is, if we are fast enough, - * the standard handler -- who does the uiomove -- - * won't even be called. (No guarantee though for - * being fast.) - */ - fuse_lck_mtx_lock(fdip->tick->tk_data->aw_mtx); - TAILQ_FOREACH(tick, &fdip->tick->tk_data->aw_head, tk_aw_link) { - if (tick == fdip->tick) { - if (fdip->tick->tk_age == age) { - debug_printf("IPC: preventing io in vain succeeded\n"); - fdip->tick->tk_aw_handler = NULL; - } - break; - } - } - - fuse_lck_mtx_unlock(fdip->tick->tk_data->aw_mtx); -#endif return err; } } ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_ipc.h#13 (text+ko) ==== @@ -268,9 +268,15 @@ struct fuse_data *fdata_alloc(struct cdev *dev, struct ucred *cred); void fdata_destroy(struct fuse_data *data); -int fdata_get_dead(struct fuse_data *data); void fdata_set_dead(struct fuse_data *data); +static __inline__ +int +fdata_get_dead(struct fuse_data *data) +{ + return (data->dataflags & FSESS_DEAD); +} + struct fuse_dispatcher { struct fuse_ticket *tick; ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#41 (text+ko) ==== @@ -172,7 +172,7 @@ if (vnode_isvroot(vp)) { return 0; } - return EBADF; + return ENXIO; } if (!(data->dataflags & FSESS_INITED)) { @@ -274,7 +274,7 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_fs(dvp)) { + if (fuse_isdeadfs(dvp)) { panic("FUSE: fuse_vnop_create(): called on a dead file system"); } @@ -591,7 +591,7 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_fs(vp)) { + if (fuse_isdeadfs(vp)) { panic("FUSE: fuse_vnop_link(): called on a dead file system"); } @@ -1069,7 +1069,7 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_fs(dvp)) { + if (fuse_isdeadfs(dvp)) { panic("FUSE: fuse_vnop_mkdir(): called on a dead file system"); } @@ -1107,8 +1107,8 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_fs(dvp)) { - panic("fuse_vnop_mknod(): called on a dead file system"); + if (fuse_isdeadfs(dvp)) { + panic("FUSE: fuse_vnop_mknod(): called on a dead file system"); } fmni.mode = MAKEIMODE(vap->va_type, vap->va_mode); @@ -1195,7 +1195,7 @@ VTOI(vp), uio->uio_offset, uio->uio_resid); if (fuse_isdeadfs(vp)) { - return EIO; + return ENXIO; } return fuse_io_dispatch(vp, uio, ioflag, cred); @@ -1228,7 +1228,7 @@ DEBUG2G("inode=%jd\n", VTOI(vp)); if (fuse_isdeadfs(vp)) { - return EBADF; + return ENXIO; } if ( /* XXXIP ((uio_iovcnt(uio) > 1)) || */ @@ -1285,7 +1285,7 @@ DEBUG2G("inode=%jd\n", VTOI(vp)); if (fuse_isdeadfs(vp)) { - return EBADF; + return ENXIO; } if (!vnode_islnk(vp)) { @@ -1378,7 +1378,7 @@ DEBUG2G("inode=%jd name=%*s\n", VTOI(vp), (int)cnp->cn_namelen, cnp->cn_nameptr); - if (fuse_isdeadfs_fs(vp)) { + if (fuse_isdeadfs(vp)) { panic("FUSE: fuse_vnop_remove(): called on a dead file system"); } @@ -1425,7 +1425,7 @@ (tvp == NULL ? (intmax_t)-1 : VTOI(tvp)), (int)tcnp->cn_namelen, tcnp->cn_nameptr); - if (fuse_isdeadfs_fs(fdvp)) { + if (fuse_isdeadfs(fdvp)) { panic("FUSE: fuse_vnop_rename(): called on a dead file system"); } @@ -1497,7 +1497,7 @@ DEBUG2G("inode=%jd\n", VTOI(vp)); - if (fuse_isdeadfs_fs(vp)) { + if (fuse_isdeadfs(vp)) { panic("FUSE: fuse_vnop_rmdir(): called on a dead file system"); } @@ -1543,7 +1543,7 @@ DEBUG2G("inode=%jd\n", VTOI(vp)); if (fuse_isdeadfs(vp)) { - return EBADF; + return ENXIO; } fdisp_init(&fdi, sizeof(*fsai)); @@ -1688,9 +1688,9 @@ if (!vp || fuse_isdeadfs(vp)) { bp->b_ioflags |= BIO_ERROR; - bp->b_error = EIO; + bp->b_error = ENXIO; bufdone(bp); - return EIO; + return ENXIO; } if (bp->b_iocmd == BIO_WRITE) @@ -1735,7 +1735,7 @@ DEBUG2G("inode=%jd name=%*s\n", VTOI(dvp), (int)cnp->cn_namelen, cnp->cn_nameptr); - if (fuse_isdeadfs_fs(dvp)) { + if (fuse_isdeadfs(dvp)) { panic("FUSE: fuse_vnop_symlink(): called on a dead file system"); } @@ -1783,7 +1783,7 @@ fuse_trace_printf_vnop(); if (fuse_isdeadfs(vp)) { - return EIO; + return ENXIO; } fuse_vnode_refreshsize(vp, cred);help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201107180745.p6I7jTqw035401>
