]> Zhao Yanbai Git Server - minix.git/commitdiff
libblockdriver: allow for not handling partitions
authorDavid van Moolenbroek <david@minix3.org>
Fri, 25 Nov 2011 13:56:46 +0000 (14:56 +0100)
committerDavid van Moolenbroek <david@minix3.org>
Mon, 28 Nov 2011 15:42:35 +0000 (16:42 +0100)
Each block driver now gets to specify whether it is a disk block
driver, which implies it wants the library to handle getting and
setting partitions for it.

common/include/minix/blockdriver.h
drivers/ahci/ahci.c
drivers/at_wini/at_wini.c
drivers/bios_wini/bios_wini.c
drivers/floppy/floppy.c
drivers/memory/memory.c
lib/libblockdriver/driver.c

index efd5261a5b447dda7f80c1b4256914c9d8c304d1..ef0f00809e8260c9ce15f0336319e679e5491e62 100644 (file)
@@ -5,8 +5,15 @@
 
 typedef int thread_id_t;
 
+/* Types supported for the 'type' field of struct blockdriver. */
+typedef enum {
+  BLOCKDRIVER_TYPE_DISK,               /* handle partition requests */
+  BLOCKDRIVER_TYPE_OTHER               /* do not handle partition requests */
+} blockdriver_type_t;
+
 /* Entry points into the device dependent code of block drivers. */
 struct blockdriver {
+  blockdriver_type_t bdr_type;
   _PROTOTYPE( int (*bdr_open), (dev_t minor, int access) );
   _PROTOTYPE( int (*bdr_close), (dev_t minor) );
   _PROTOTYPE( ssize_t (*bdr_transfer), (dev_t minor, int do_write, u64_t pos,
index 2cc2d231027b2815f27b9ebeb2d68118a5b4530c..4b5833b75b06a4582856f0cc8dc97770754bbe4c 100644 (file)
@@ -208,6 +208,7 @@ PRIVATE struct port_state *ahci_get_port(dev_t minor);
 
 /* AHCI driver table. */
 PRIVATE struct blockdriver ahci_dtab = {
+       BLOCKDRIVER_TYPE_DISK,
        ahci_open,
        ahci_close,
        ahci_transfer,
index 400e801c6f5f51a598ca4afb860df4d62c26225d..c0293e6be852b6d46c0fd8ca8c453f6f82a94f1d 100644 (file)
@@ -200,6 +200,7 @@ FORWARD _PROTOTYPE( int at_in, (int line, u32_t port, unsigned long *value,
 
 /* Entry points to this driver. */
 PRIVATE struct blockdriver w_dtab = {
+  BLOCKDRIVER_TYPE_DISK,/* handle partition requests */
   w_do_open,           /* open or mount request, initialize device */
   w_do_close,          /* release device */
   w_transfer,          /* do the I/O */
index a9375e0a83b0cfc2ed64d66e439745ddd781a004..547431196f77dbd9c50d1c14e8365569027e4955 100644 (file)
@@ -70,6 +70,7 @@ FORWARD _PROTOTYPE( int w_ioctl, (dev_t minor, unsigned int request,
 
 /* Entry points to this driver. */
 PRIVATE struct blockdriver w_dtab = {
+  BLOCKDRIVER_TYPE_DISK,       /* handle partition requests */
   w_do_open,   /* open or mount request, initialize device */
   w_do_close,  /* release device */
   w_transfer,  /* do the I/O */
index 8bf2ba2b6d29c21d9a52eeffb8f4bdb4c33c4e4e..4347dab07fc37608795756d1c36d935ceadb0a6e 100644 (file)
@@ -267,6 +267,7 @@ FORWARD _PROTOTYPE( void f_geometry, (dev_t minor,
 
 /* Entry points to this driver. */
 PRIVATE struct blockdriver f_dtab = {
+  BLOCKDRIVER_TYPE_DISK,       /* handle partition requests */
   f_do_open,   /* open or mount request, sense type of diskette */
   f_do_close,  /* nothing on a close */
   f_transfer,  /* do the I/O */
index f6c39beed182f04aeddc25303492ad8a3edd69ef..e1433f15e8c09dad4b462691e1ffb4cc0f332961 100644 (file)
@@ -76,6 +76,7 @@ PRIVATE struct chardriver m_cdtab = {
 
 /* Entry points to the BLOCK part of this driver. */
 PRIVATE struct blockdriver m_bdtab = {
+  BLOCKDRIVER_TYPE_DISK,/* handle partition requests */
   m_block_open,                /* open or mount */
   m_block_close,       /* nothing on a close */
   m_block_transfer,    /* do the I/O */
index e7940cc4249844f75734d9db9fce05ab27e2233f..2f8aed7a2cef04fb73f678a6ff0d986984714030 100644 (file)
@@ -248,39 +248,20 @@ PRIVATE int do_vrdwt(struct blockdriver *bdp, message *mp, thread_id_t id)
 }
 
 /*===========================================================================*
- *                             do_ioctl                                     *
+ *                             do_dioctl                                    *
  *===========================================================================*/
-PRIVATE int do_ioctl(struct blockdriver *bdp, message *mp)
+PRIVATE int do_dioctl(struct blockdriver *bdp, dev_t minor,
+  unsigned int request, endpoint_t endpt, cp_grant_id_t grant)
 {
-/* Carry out an I/O control request. For now, we handle setting/getting
- * partitions here, forward block trace control requests to the tracing module,
- * and let the driver handle any other requests. In the future, a stricter
- * separation between block and disk I/O controls may become desirable, but we
- * do not have any non-"disk" block drivers at this time.
- */
+/* Carry out a disk-specific I/O control request. */
   struct device *dv;
   struct partition entry;
-  unsigned int request;
-  cp_grant_id_t grant;
-  dev_t minor;
-  int r;
-
-  minor = mp->BDEV_MINOR;
-  request = mp->BDEV_REQUEST;
-  grant = mp->BDEV_GRANT;
+  int r = EINVAL;
 
   switch (request) {
-  case BIOCTRACEBUF:
-  case BIOCTRACECTL:
-  case BIOCTRACEGET:
-       /* Block trace control. */
-       r = trace_ctl(minor, request, mp->m_source, grant);
-
-       break;
-
   case DIOCSETP:
        /* Copy just this one partition table entry. */
-       r = sys_safecopyfrom(mp->m_source, grant, 0, (vir_bytes) &entry,
+       r = sys_safecopyfrom(endpt, grant, 0, (vir_bytes) &entry,
                sizeof(entry), D);
        if (r != OK)
                return r;
@@ -307,11 +288,53 @@ PRIVATE int do_ioctl(struct blockdriver *bdp, message *mp)
                entry.sectors = 32;
        }
 
-       r = sys_safecopyto(mp->m_source, grant, 0, (vir_bytes) &entry,
-               sizeof(entry), D);
+       r = sys_safecopyto(endpt, grant, 0, (vir_bytes) &entry, sizeof(entry),
+               D);
 
        break;
+  }
+
+  return r;
+}
+
+/*===========================================================================*
+ *                             do_ioctl                                     *
+ *===========================================================================*/
+PRIVATE int do_ioctl(struct blockdriver *bdp, message *mp)
+{
+/* Carry out an I/O control request. We forward block trace control requests
+ * to the tracing module, and handle setting/getting partitions when the driver
+ * has specified that it is a disk driver.
+ */
+  dev_t minor;
+  unsigned int request;
+  cp_grant_id_t grant;
+  int r;
+
+  minor = mp->BDEV_MINOR;
+  request = mp->BDEV_REQUEST;
+  grant = mp->BDEV_GRANT;
+
+  switch (request) {
+  case BIOCTRACEBUF:
+  case BIOCTRACECTL:
+  case BIOCTRACEGET:
+       /* Block trace control. */
+       r = trace_ctl(minor, request, mp->m_source, grant);
+
+       break;
+
+  case DIOCSETP:
+  case DIOCGETP:
+       /* Handle disk-specific IOCTLs only for disk-type drivers. */
+       if (bdp->bdr_type == BLOCKDRIVER_TYPE_DISK) {
+               /* Disk partition control. */
+               r = do_dioctl(bdp, minor, request, mp->m_source, grant);
+
+               break;
+       }
 
+       /* fall-through */
   default:
        if (bdp->bdr_ioctl)
                r = (*bdp->bdr_ioctl)(minor, request, mp->m_source, grant);