Print this page
6494 ASSERT supported zio_types for file and disk vdevs
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Approved by: Albert Lee <trisk@omniti.com>
NEX-4229 Panic destroying the pool using file backing store on FS with nbmand=on
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
NEX-3958 CLONE - Port NEX-3957 TRIM on file-backed vdevs is broken
Reviewed by: Alek Pinchuk <alek@nexenta.com>
Reviewed by: Josef 'Jeff' Sipek <josef.sipek@nexenta.com>
NEX-3508 CLONE - Port NEX-2946 Add UNMAP/TRIM functionality to ZFS and illumos
Reviewed by: Josef Sipek <josef.sipek@nexenta.com>
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>
Conflicts:
    usr/src/uts/common/io/scsi/targets/sd.c
    usr/src/uts/common/sys/scsi/targets/sddef.h

*** 19,28 **** --- 19,29 ---- * CDDL HEADER END */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2015 by Delphix. All rights reserved. + * Copyright 2015 Nexenta Systems, Inc. All rights reserved. */ #include <sys/zfs_context.h> #include <sys/spa.h> #include <sys/spa_impl.h>
*** 29,38 **** --- 30,42 ---- #include <sys/vdev_file.h> #include <sys/vdev_impl.h> #include <sys/zio.h> #include <sys/fs/zfs.h> #include <sys/fm/fs/zfs.h> + #include <sys/fcntl.h> + #include <sys/vnode.h> + #include <sys/dkioc_free_util.h> #include <sys/abd.h> /* * Virtual device vector for files. */
*** 124,141 **** static void vdev_file_close(vdev_t *vd) { vdev_file_t *vf = vd->vdev_tsd; if (vd->vdev_reopening || vf == NULL) return; if (vf->vf_vnode != NULL) { (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; kmem_free(vf, sizeof (vdev_file_t)); --- 128,153 ---- static void vdev_file_close(vdev_t *vd) { vdev_file_t *vf = vd->vdev_tsd; + caller_context_t ct = {0}; if (vd->vdev_reopening || vf == NULL) return; if (vf->vf_vnode != NULL) { (void) VOP_PUTPAGE(vf->vf_vnode, 0, 0, B_INVAL, kcred, NULL); + /* + * We need to supply caller context with PID zero to fop_close + * in order to clean properly a share reservation which might + * have been created by vdev_file_open if nbmand was "on" for + * underlaying filesystem. Mismatched PIDs in create and delete + * reservation calls would lead to orphaned reservation. + */ (void) VOP_CLOSE(vf->vf_vnode, spa_mode(vd->vdev_spa), 1, 0, ! kcred, &ct); VN_RELE(vf->vf_vnode); } vd->vdev_delayed_close = B_FALSE; kmem_free(vf, sizeof (vdev_file_t));
*** 208,217 **** --- 220,256 ---- switch (zio->io_cmd) { case DKIOCFLUSHWRITECACHE: zio->io_error = VOP_FSYNC(vf->vf_vnode, FSYNC | FDSYNC, kcred, NULL); break; + case DKIOCFREE: + { + dkioc_free_list_t *dfl = zio->io_private; + + ASSERT(dfl != NULL); + for (int i = 0; i < dfl->dfl_num_exts; i++) { + struct flock64 flck; + int error; + + if (dfl->dfl_exts[i].dfle_length == 0) + continue; + + bzero(&flck, sizeof (flck)); + flck.l_type = F_FREESP; + flck.l_start = dfl->dfl_exts[i].dfle_start + + dfl->dfl_offset; + flck.l_len = dfl->dfl_exts[i].dfle_length; + + error = VOP_SPACE(vf->vf_vnode, + F_FREESP, &flck, 0, 0, kcred, NULL); + if (error != 0) { + zio->io_error = SET_ERROR(error); + break; + } + } + break; + } default: zio->io_error = SET_ERROR(ENOTSUP); } zio_execute(zio);