X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Ffb-param.c;h=854ba78a78632e950ea6a5efe518a16a2d96ccaf;hb=c4bf633211b0424492b5a3937d6a6d2e0d79a4cf;hp=db99e2556a04b70fbb74dc3746f79128b95f5c3b;hpb=b20998a1656dafd2cf694b7f4d5807d8321db43a;p=libucw.git diff --git a/lib/fb-param.c b/lib/fb-param.c index db99e255..854ba78a 100644 --- a/lib/fb-param.c +++ b/lib/fb-param.c @@ -20,11 +20,22 @@ struct fb_params fbpar_def = { .buffer_size = 65536, .read_ahead = 1, .write_back = 1, -}; +}; + +static char * +fbpar_cf_commit(struct fb_params *p UNUSED) +{ +#ifndef CONFIG_UCW_THREADS + if (p->type == FB_DIRECT) + return "Direct I/O is supported only with CONFIG_UCW_THREADS"; +#endif + return NULL; +} struct cf_section fbpar_cf = { # define F(x) PTR_TO(struct fb_params, x) CF_TYPE(struct fb_params), + CF_COMMIT(fbpar_cf_commit), CF_ITEMS { CF_LOOKUP("Type", (int *)F(type), ((char *[]){"std", "direct", "mmap", NULL})), CF_UNS("BufSize", F(buffer_size)), @@ -61,12 +72,7 @@ bopen_fd_internal(int fd, struct fb_params *params, uns mode, const char *name) struct fastbuf *fb; switch (params->type) { - case FB_STD: - fb = bfdopen_internal(fd, name, - params->buffer_size ? : fbpar_def.buffer_size); - if (params->keep_back_buf) - bconfig(fb, BCONFIG_KEEP_BACK_BUF, 1); - return fb; +#ifdef CONFIG_UCW_THREADS case FB_DIRECT: fb = fbdir_open_fd_internal(fd, name, params->asio, params->buffer_size ? : fbpar_def.buffer_size, @@ -75,6 +81,13 @@ bopen_fd_internal(int fd, struct fb_params *params, uns mode, const char *name) if (!~mode && !fbdir_cheat && ((int)(mode = fcntl(fd, F_GETFL)) < 0 || fcntl(fd, F_SETFL, mode | O_DIRECT)) < 0) msg(L_WARN, "Cannot set O_DIRECT on fd %d: %m", fd); return fb; +#endif + case FB_STD: + fb = bfdopen_internal(fd, name, + params->buffer_size ? : fbpar_def.buffer_size); + if (params->keep_back_buf) + bconfig(fb, BCONFIG_KEEP_BACK_BUF, 1); + return fb; case FB_MMAP: if (!~mode && (int)(mode = fcntl(fd, F_GETFL)) < 0) die("Cannot get flags of fd %d: %m", fd); @@ -89,8 +102,10 @@ bopen_file_internal(const char *name, int mode, struct fb_params *params, int tr { if (!params) params = &fbpar_def; +#ifdef CONFIG_UCW_THREADS if (params->type == FB_DIRECT && !fbdir_cheat) mode |= O_DIRECT; +#endif if (params->type == FB_MMAP && (mode & O_ACCMODE) == O_WRONLY) mode = (mode & ~O_ACCMODE) | O_RDWR; int fd = sh_open(name, mode, 0666);