inode: allow O_DIRECT reads building from Will's direct change
authorAlan Cox <alan@linux.intel.com>
Fri, 13 Feb 2015 18:17:27 +0000 (18:17 +0000)
committerAlan Cox <alan@linux.intel.com>
Fri, 13 Feb 2015 18:17:27 +0000 (18:17 +0000)
Kernel/include/kernel.h
Kernel/inode.c

index adc1b91..8f764c2 100644 (file)
@@ -444,6 +444,7 @@ struct s_argblk {
 #define O_APPEND       4
 #define O_SYNC         8
 #define O_NDELAY       16
+#define O_DIRECT       32
 #define O_FLOCK                128             /* Cannot be user set */
 #define O_CREAT                256
 #define O_EXCL         512
@@ -451,7 +452,7 @@ struct s_argblk {
 #define O_NOCTTY       2048
 #define O_CLOEXEC      4096
 
-#define O_BADBITS      (32 | 64 | O_FLOCK | 8192 | 16384 | 32768U)
+#define O_BADBITS      (64 | O_FLOCK | 8192 | 16384 | 32768U)
 
 #define F_GETFL                0
 #define F_SETFL                1
index d64195e..cc9dee7 100644 (file)
@@ -2,6 +2,12 @@
 #include <kdata.h>
 #include <printf.h>
 
+#if defined(CONFIG_LARGE_IO_DIRECT)
+#define read_policy_direct(dev, pblk, flag)    (!udata.u_sysio)
+#elif (NBUFS >= 32)
+#define read_policy_direct(dev, pblk, flag)    (flag & O_DIRECT)
+#endif
+
 /* Writei (and readi) need more i/o error handling */
 void readi(inoptr ino, uint8_t flag)
 {
@@ -54,8 +60,8 @@ void readi(inoptr ino, uint8_t flag)
                        amount = min(toread, BLKSIZE - (udata.u_offset&BLKMASK));
                        pblk = bmap(ino, udata.u_offset >> BLKSHIFT, 1);
 
-#ifdef CONFIG_LARGE_IO_DIRECT
-                       if(!ispipe && amount == BLKSIZE && !udata.u_sysio && bfind(dev, pblk) == 0){
+#if defined(read_policy_direct)
+                       if (!ispipe && amount == BLKSIZE && read_direct(flag) && bfind(dev, pblk) == 0) {
                                /* we can transfer direct from disk to the userspace buffer */
                                off_t uostash;
                                usize_t ucstash;
@@ -66,7 +72,7 @@ void readi(inoptr ino, uint8_t flag)
                                ((*dev_tab[major(dev)].dev_read) (minor(dev), 1, 0)); /* read */
                                udata.u_offset = uostash;                   /* restore file offset */
                                udata.u_count = ucstash;                    /* restore byte count */
-                       }else
+                       } else
 #endif
                        {
                                /* we transfer through the buffer pool */