Print this page
NEX-1142 move rwlock to vdev to protect vdev_tsd
not just ldi handle.
This way we serialize open/close, yet allow parallel I/O.
NEX-1065 Added serialization to avoid race
between ldi notification and I/O path.
Also fixes OS-124, NEX-1051, NEX-1062.

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/zfs/sys/vdev_disk.h
          +++ new/usr/src/uts/common/fs/zfs/sys/vdev_disk.h
↓ open down ↓ 14 lines elided ↑ open up ↑
  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 2008 Sun Microsystems, Inc.  All rights reserved.
  23   23   * Use is subject to license terms.
  24   24   * Copyright (c) 2013 Joyent, Inc. All rights reserved.
  25      - * Copyright 2012 Nexenta Systems, Inc.  All rights reserved.
       25 + * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
  26   26   */
  27   27  
  28   28  #ifndef _SYS_VDEV_DISK_H
  29   29  #define _SYS_VDEV_DISK_H
  30   30  
  31   31  #include <sys/vdev.h>
  32   32  #ifdef _KERNEL
  33   33  #include <sys/buf.h>
  34   34  #include <sys/ddi.h>
  35   35  #include <sys/sunldi.h>
↓ open down ↓ 3 lines elided ↑ open up ↑
  39   39  #ifdef  __cplusplus
  40   40  extern "C" {
  41   41  #endif
  42   42  
  43   43  #ifdef _KERNEL
  44   44  typedef struct vdev_disk {
  45   45          ddi_devid_t     vd_devid;
  46   46          char            *vd_minor;
  47   47          ldi_handle_t    vd_lh;
  48   48          list_t          vd_ldi_cbs;
  49      -        boolean_t       vd_ldi_offline;
  50   49  } vdev_disk_t;
  51   50  #endif
  52   51  
  53   52  extern int vdev_disk_physio(vdev_t *,
  54   53      caddr_t, size_t, uint64_t, int, boolean_t);
  55   54  
  56   55  /*
  57   56   * Since vdev_disk.c is not compiled into libzpool, this function should only be
  58   57   * defined in the zfs kernel module.
  59   58   */
  60   59  #ifdef _KERNEL
  61   60  extern int vdev_disk_ldi_physio(ldi_handle_t, caddr_t, size_t, uint64_t, int);
  62   61  #endif
  63   62  #ifdef  __cplusplus
  64   63  }
  65   64  #endif
  66   65  
  67   66  #endif  /* _SYS_VDEV_DISK_H */
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX