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

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/zfs/vdev_file.c
          +++ new/usr/src/uts/common/fs/zfs/vdev_file.c
↓ open down ↓ 13 lines elided ↑ open up ↑
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  /*
  22   22   * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  23   23   * Copyright (c) 2011, 2015 by Delphix. All rights reserved.
       24 + * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
  24   25   */
  25   26  
  26   27  #include <sys/zfs_context.h>
  27   28  #include <sys/spa.h>
  28   29  #include <sys/spa_impl.h>
  29   30  #include <sys/vdev_file.h>
  30   31  #include <sys/vdev_impl.h>
  31   32  #include <sys/zio.h>
  32   33  #include <sys/fs/zfs.h>
  33   34  #include <sys/fm/fs/zfs.h>
       35 +#include <sys/fcntl.h>
       36 +#include <sys/vnode.h>
       37 +#include <sys/dkioc_free_util.h>
  34   38  #include <sys/abd.h>
  35   39  
  36   40  /*
  37   41   * Virtual device vector for files.
  38   42   */
  39   43  
  40   44  static void
  41   45  vdev_file_hold(vdev_t *vd)
  42   46  {
  43   47          ASSERT(vd->vdev_path != NULL);
↓ open down ↓ 75 lines elided ↑ open up ↑
 119  123          *max_psize = *psize = vattr.va_size;
 120  124          *ashift = SPA_MINBLOCKSHIFT;
 121  125  
 122  126          return (0);
 123  127  }
 124  128  
 125  129  static void
 126  130  vdev_file_close(vdev_t *vd)
 127  131  {
 128  132          vdev_file_t *vf = vd->vdev_tsd;
      133 +        caller_context_t ct = {0};
 129  134  
 130  135          if (vd->vdev_reopening || vf == NULL)
 131  136                  return;
 132  137  
 133  138          if (vf->vf_vnode != NULL) {
 134  139                  (void) VOP_PUTPAGE(vf->vf_vnode, 0, 0, B_INVAL, kcred, NULL);
      140 +                /*
      141 +                 * We need to supply caller context with PID zero to fop_close
      142 +                 * in order to clean properly a share reservation which might
      143 +                 * have been created by vdev_file_open if nbmand was "on" for
      144 +                 * underlaying filesystem. Mismatched PIDs in create and delete
      145 +                 * reservation calls would lead to orphaned reservation.
      146 +                 */
 135  147                  (void) VOP_CLOSE(vf->vf_vnode, spa_mode(vd->vdev_spa), 1, 0,
 136      -                    kcred, NULL);
      148 +                    kcred, &ct);
 137  149                  VN_RELE(vf->vf_vnode);
 138  150          }
 139  151  
 140  152          vd->vdev_delayed_close = B_FALSE;
 141  153          kmem_free(vf, sizeof (vdev_file_t));
 142  154          vd->vdev_tsd = NULL;
 143  155  }
 144  156  
 145  157  /*
 146  158   * Implements the interrupt side for file vdev types. This routine will be
↓ open down ↓ 56 lines elided ↑ open up ↑
 203  215                          zio->io_error = SET_ERROR(ENXIO);
 204  216                          zio_interrupt(zio);
 205  217                          return;
 206  218                  }
 207  219  
 208  220                  switch (zio->io_cmd) {
 209  221                  case DKIOCFLUSHWRITECACHE:
 210  222                          zio->io_error = VOP_FSYNC(vf->vf_vnode, FSYNC | FDSYNC,
 211  223                              kcred, NULL);
 212  224                          break;
      225 +                case DKIOCFREE:
      226 +                {
      227 +                        dkioc_free_list_t *dfl = zio->io_private;
      228 +
      229 +                        ASSERT(dfl != NULL);
      230 +                        for (int i = 0; i < dfl->dfl_num_exts; i++) {
      231 +                                struct flock64 flck;
      232 +                                int error;
      233 +
      234 +                                if (dfl->dfl_exts[i].dfle_length == 0)
      235 +                                        continue;
      236 +
      237 +                                bzero(&flck, sizeof (flck));
      238 +                                flck.l_type = F_FREESP;
      239 +                                flck.l_start = dfl->dfl_exts[i].dfle_start +
      240 +                                    dfl->dfl_offset;
      241 +                                flck.l_len = dfl->dfl_exts[i].dfle_length;
      242 +
      243 +                                error = VOP_SPACE(vf->vf_vnode,
      244 +                                    F_FREESP, &flck, 0, 0, kcred, NULL);
      245 +                                if (error != 0) {
      246 +                                        zio->io_error = SET_ERROR(error);
      247 +                                        break;
      248 +                                }
      249 +                        }
      250 +                        break;
      251 +                }
 213  252                  default:
 214  253                          zio->io_error = SET_ERROR(ENOTSUP);
 215  254                  }
 216  255  
 217  256                  zio_execute(zio);
 218  257                  return;
 219  258          }
 220  259  
 221  260          ASSERT(zio->io_type == ZIO_TYPE_READ || zio->io_type == ZIO_TYPE_WRITE);
 222  261          zio->io_target_timestamp = zio_handle_io_delay(zio);
↓ open down ↓ 67 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX