Print this page
*** NO COMMENTS ***

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/io/blkdev/blkdev.c
          +++ new/usr/src/uts/common/io/blkdev/blkdev.c
↓ open down ↓ 1119 lines elided ↑ open up ↑
1120 1120                  struct dk_callback *dkc = NULL;
1121 1121  
1122 1122                  if (flag & FKIOCTL)
1123 1123                          dkc = (void *)arg;
1124 1124  
1125 1125                  rv = bd_flush_write_cache(bd, dkc);
1126 1126                  return (rv);
1127 1127          }
1128 1128  
1129 1129          default:
1130      -                break;
1131      -
     1130 +                if (bd->d_ops.o_ioctl != NULL) {
     1131 +                        rv = bd->d_ops.o_ioctl(dev, cmd, arg, flag, credp,
     1132 +                            rvalp);
     1133 +                } else {
     1134 +                        /* Unsupported ioctl ==> return ENOTTY. */
     1135 +                        rv = ENOTTY;
     1136 +                }
     1137 +                /* FALLTHRU */
1132 1138          }
1133      -        return (ENOTTY);
     1139 +        return (rv);
1134 1140  }
1135 1141  
1136 1142  static int
1137 1143  bd_prop_op(dev_t dev, dev_info_t *dip, ddi_prop_op_t prop_op, int mod_flags,
1138 1144      char *name, caddr_t valuep, int *lengthp)
1139 1145  {
1140 1146          bd_t    *bd;
1141 1147  
1142 1148          bd = ddi_get_soft_state(bd_state, ddi_get_instance(dip));
1143 1149          if (bd == NULL)
↓ open down ↓ 375 lines elided ↑ open up ↑
1519 1525  
1520 1526  /*
1521 1527   * Functions for device drivers.
1522 1528   */
1523 1529  bd_handle_t
1524 1530  bd_alloc_handle(void *private, bd_ops_t *ops, ddi_dma_attr_t *dma, int kmflag)
1525 1531  {
1526 1532          bd_handle_t     hdl;
1527 1533  
1528 1534          hdl = kmem_zalloc(sizeof (*hdl), kmflag);
1529      -        if (hdl != NULL) {
     1535 +        if (hdl == NULL)
     1536 +                return (NULL);
     1537 +
     1538 +        /*
     1539 +         * Cheesy versioning handling.  We've only appended members into
     1540 +         * bd_ops as we grew from v0 to v1.  Since we zalloc hdl, the
     1541 +         * ioctl ops will be NULL anyway.  So for the old version, we
     1542 +         * copy over only the v0 elements.
     1543 +         */
     1544 +        switch (ops->o_version) {
     1545 +        case BD_OPS_VERSION_0:
     1546 +                /* Don't copy the last pointer in the structure. */
     1547 +                bcopy(ops, &hdl->h_ops, sizeof (*ops) - sizeof (void *));
     1548 +                break;
     1549 +        case BD_OPS_VERSION_1:
1530 1550                  hdl->h_ops = *ops;
1531      -                hdl->h_dma = dma;
1532      -                hdl->h_private = private;
     1551 +                break;
     1552 +        default:
     1553 +                kmem_free(hdl, sizeof (*hdl));
     1554 +                cmn_err(CE_WARN, "Unsupported blkdev ops version %d.\n",
     1555 +                    ops->o_version);
     1556 +                return (NULL);
     1557 +                /* NOTREACHED */
1533 1558          }
     1559 +        hdl->h_dma = dma;
     1560 +        hdl->h_private = private;
1534 1561  
1535 1562          return (hdl);
1536 1563  }
1537 1564  
1538 1565  void
1539 1566  bd_free_handle(bd_handle_t hdl)
1540 1567  {
1541 1568          kmem_free(hdl, sizeof (*hdl));
1542 1569  }
1543 1570  
↓ open down ↓ 199 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX