From e852ee1f19cc813317c9e3a376e34a2735e6323f Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Fri, 13 Feb 2015 18:17:27 +0000 Subject: [PATCH] inode: allow O_DIRECT reads building from Will's direct change --- Kernel/include/kernel.h | 3 ++- Kernel/inode.c | 12 +++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Kernel/include/kernel.h b/Kernel/include/kernel.h index adc1b912..8f764c27 100644 --- a/Kernel/include/kernel.h +++ b/Kernel/include/kernel.h @@ -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 diff --git a/Kernel/inode.c b/Kernel/inode.c index d64195ed..cc9dee7f 100644 --- a/Kernel/inode.c +++ b/Kernel/inode.c @@ -2,6 +2,12 @@ #include #include +#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 */ -- 2.34.1