devrd: bring up to match current I/O layer
authorAlan Cox <alan@linux.intel.com>
Wed, 8 Nov 2017 15:50:32 +0000 (15:50 +0000)
committerAlan Cox <alan@linux.intel.com>
Wed, 8 Nov 2017 15:50:32 +0000 (15:50 +0000)
Makes it a lot shorter and to the point.

Kernel/dev/devrd.c

index b25310d..85c5358 100644 (file)
@@ -23,45 +23,35 @@ static const uint32_t dev_start[NUM_DEV_RD] = {
     DEV_RD_RAM_START, /* /dev/rd1: RAM */
 };
 
-int rd_transfer(uint8_t minor, uint8_t rawflag, uint8_t flag) /* implements both rd_read and rd_write */
+/* implements both rd_read and rd_write */
+int rd_transfer(uint8_t minor, uint8_t rawflag, uint8_t flag)
 {
-    bool error = false;
-
     used(flag);
 
     /* check device exists; do not allow writes to ROM */
-    if(minor >= NUM_DEV_RD || (minor == RD_MINOR_ROM && rd_reverse)){
-        error = true;
-    }else{
+    if (minor == RD_MINOR_ROM && rd_reverse) {
+        udata.u_error = EROFS;
+        return -1;
+    } else {
         rd_src_address = dev_start[minor];
 
-        if(rawflag){
+        if (rawflag) {
+            if (d_blkoff(9))
+                return -1;
             /* rawflag == 1, userspace transfer */
-            rd_dst_userspace = true;
-            rd_dst_address = (uint16_t)udata.u_base;
-            rd_src_address += udata.u_offset;
-            rd_cpy_count = udata.u_count;
-        }else{
-            /* rawflag == 0, kernel transfer */
-            rd_dst_userspace = false;
-            rd_dst_address = (uint16_t)&udata.u_buf->bf_data;
-            rd_src_address += ((uint32_t)udata.u_buf->bf_blk << 9);
-            rd_cpy_count = 512;
         }
+        rd_dst_userspace = rawflag;
 
-        if(rd_src_address >= dev_limit[minor]){
-            error = true;
-        }
-    }
+        rd_dst_address = (uint16_t)udata.u_dptr;
+        rd_src_address += ((uint32_t)udata.u_block) << BLKSHIFT;
 
-    if(error){
-        udata.u_error = EIO;
-        return -1;
+        if (rd_src_address >= dev_limit[minor]) {
+           udata.u_error = EIO;
+           return -1;
+        }
     }
-
     rd_platform_copy();
-
-    return rd_cpy_count >> 9;
+    return rd_cpy_count;
 }
 
 int rd_open(uint8_t minor, uint16_t flags)