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