devio: add helpers to start rationalising the I/O paths
authorAlan Cox <alan@linux.intel.com>
Mon, 25 Jul 2016 16:34:00 +0000 (17:34 +0100)
committerAlan Cox <alan@linux.intel.com>
Mon, 25 Jul 2016 16:34:00 +0000 (17:34 +0100)
Kernel/devio.c
Kernel/include/kernel.h

index ae82ec4..e7dd531 100644 (file)
@@ -234,24 +234,28 @@ Any device other than a disk will have only raw access.
    out some scheme to do a bank call here - do we need a dev_tab bank
    entry perhaps ? */
 
+static void bdsetup(bufptr bp)
+{
+       udata.u_buf = bp;
+       udata.u_block = bp->bf_blk;
+       udata.u_blkoff = 0;
+       udata.u_nblock = 1;
+       udata.u_dptr = bp->bf_data;
+}
+
 int bdread(bufptr bp)
 {
        uint16_t dev = bp->bf_dev;
-
        validchk(dev, PANIC_BDR);
-
-       udata.u_buf = bp;
+       bdsetup(bp);
        return ((*dev_tab[major(dev)].dev_read) (minor(dev), 0, 0));
 }
 
-
 int bdwrite(bufptr bp)
 {
        uint16_t dev = bp->bf_dev;
-
        validchk(dev, PANIC_BDW);
-
-       udata.u_buf = bp;
+       bdsetup(bp);
        return ((*dev_tab[major(dev)].dev_write) (minor(dev), 0, 0));
 }
 
@@ -310,6 +314,23 @@ int d_flush(uint16_t dev)
        return r;
 }
 
+/* 128, 256, 512 supported for now */
+static uint16_t masks[] = { 0x7F, 0xFF, 0x1FF };
+
+/* This is not a commonly used path so can be slower */
+int d_blkoff(uint8_t shift)
+{
+       uint16_t m = masks[shift - 7];
+       udata.u_block = udata.u_offset >> shift;
+       if (udata.u_offset & m) {
+               udata.u_error = EIO;
+               return -1;
+       }
+       udata.u_nblock = (udata.u_count + m) >> shift;
+       udata.u_dptr = udata.u_base;
+       return 0;
+}
+
 /*
  *     No such device handler
  */
index ef0f878..c9a000e 100644 (file)
@@ -447,6 +447,13 @@ typedef struct u_data {
     inoptr     u_root;         /* Index into inode table of / */
     inoptr     u_rename;       /* Used in n_open for rename() checking */
     inoptr     u_ctty;         /* Controlling tty */
+
+    /* Temporaries used for block I/O */
+    blkno_t    u_block;        /* Block number */
+    uint16_t   u_blkoff;       /* Offset in block */
+    uint16_t   u_nblock;       /* Number of blocks */
+    uint8_t    *u_dptr;        /* Address for I/O */
+
 #ifdef CONFIG_LEVEL_2
     uint16_t    u_groups[NGROUP]; /* Group list */
     uint8_t    u_ngroup;
@@ -735,6 +742,7 @@ extern int d_open(uint16_t dev, uint8_t flag);
 extern int d_close(uint16_t dev);
 extern int d_ioctl(uint16_t dev, uint16_t request, char *data);
 extern int d_flush(uint16_t dev);
+extern int d_blkoff(uint8_t bits);
 extern int cdwrite(uint16_t dev, uint8_t flag);
 extern bool insq(struct s_queue *q, unsigned char c);
 extern bool remq(struct s_queue *q, unsigned char *cp);
@@ -843,9 +851,6 @@ extern int _select(void);
 
 /* swap.c */
 extern uint16_t swappage;
-extern uint8_t *swapbase;
-extern unsigned int swapcnt;
-extern blkno_t swapblk;
 
 extern int swapread(uint16_t dev, blkno_t blkno, unsigned int nbytes,
                     uint16_t buf, uint16_t page);