Clear PG_writeback for sync I/O error case
[zfs.git] / module / zfs / vdev_file.c
index f31389a..25d0bad 100644 (file)
@@ -72,7 +72,7 @@ vdev_file_open(vdev_t *vd, uint64_t *psize, uint64_t *ashift)
                goto skip_open;
        }
 
-       vf = vd->vdev_tsd = kmem_zalloc(sizeof (vdev_file_t), KM_SLEEP);
+       vf = vd->vdev_tsd = kmem_zalloc(sizeof (vdev_file_t), KM_PUSHPAGE);
 
        /*
         * We always open the files from the root of the global zone, even if
@@ -130,7 +130,6 @@ vdev_file_close(vdev_t *vd)
                (void) VOP_PUTPAGE(vf->vf_vnode, 0, 0, B_INVAL, kcred, NULL);
                (void) VOP_CLOSE(vf->vf_vnode, spa_mode(vd->vdev_spa), 1, 0,
                    kcred, NULL);
-               VN_RELE(vf->vf_vnode);
        }
 
        vd->vdev_delayed_close = B_FALSE;
@@ -142,16 +141,17 @@ static int
 vdev_file_io_start(zio_t *zio)
 {
        vdev_t *vd = zio->io_vd;
-       vdev_file_t *vf = vd->vdev_tsd;
+       vdev_file_t *vf;
        ssize_t resid = 0;
 
-       if (zio->io_type == ZIO_TYPE_IOCTL) {
-               /* XXPOLICY */
-               if (!vdev_readable(vd)) {
-                       zio->io_error = ENXIO;
-                       return (ZIO_PIPELINE_CONTINUE);
-               }
+       if (!vdev_readable(vd)) {
+               zio->io_error = ENXIO;
+               return (ZIO_PIPELINE_CONTINUE);
+       }
 
+       vf = vd->vdev_tsd;
+
+       if (zio->io_type == ZIO_TYPE_IOCTL) {
                switch (zio->io_cmd) {
                case DKIOCFLUSHWRITECACHE:
                        zio->io_error = VOP_FSYNC(vf->vf_vnode, FSYNC | FDSYNC,