#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
#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
#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)
{
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;
((*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 */