PERFORCE change 196335 for review
Ilya Putsikau
ilya at FreeBSD.org
Mon Jul 18 07:45:29 UTC 2011
http://p4web.freebsd.org/@@196335?ac=10
Change 196335 by ilya at 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);
More information about the p4-projects
mailing list