# define F(x) PTR_TO(struct fb_params, x)
CF_TYPE(struct fb_params),
CF_ITEMS {
- CF_LOOKUP("Type", (int *)F(type), ((byte *[]){"std", "direct", "mmap", NULL})),
+ CF_LOOKUP("Type", (int *)F(type), ((char *[]){"std", "direct", "mmap", NULL})),
CF_UNS("BufSize", F(buffer_size)),
+ CF_UNS("KeepBackBuf", F(keep_back_buf)),
CF_UNS("ReadAhead", F(read_ahead)),
CF_UNS("WriteBack", F(write_back)),
CF_END
}
static struct fastbuf *
-bopen_fd_internal(int fd, struct fb_params *params, uns mode, byte *name)
+bopen_fd_internal(int fd, struct fb_params *params, uns mode, const byte *name)
{
byte buf[32];
if (!name)
- sprintf(name = buf, "fd%d", fd);
+ {
+ sprintf(buf, "fd%d", fd);
+ name = buf;
+ }
struct fastbuf *fb;
switch (params->type)
{
case FB_STD:
- return bfdopen_internal(fd, name,
+ 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_DIRECT:
fb = fbdir_open_fd_internal(fd, name, params->asio,
params->buffer_size ? : fbpar_def.buffer_size,
params->read_ahead ? : fbpar_def.read_ahead,
params->write_back ? : fbpar_def.write_back);
if (!~mode && !fbdir_cheat && ((int)(mode = fcntl(fd, F_GETFL)) < 0 || fcntl(fd, F_SETFL, mode | O_DIRECT)) < 0)
- log(L_WARN, "Cannot set O_DIRECT on fd %d: %m", fd);
+ msg(L_WARN, "Cannot set O_DIRECT on fd %d: %m", fd);
return fb;
case FB_MMAP:
if (!~mode && (int)(mode = fcntl(fd, F_GETFL)) < 0)
die("Cannot get flags of fd %d: %m", fd);
return bfmmopen_internal(fd, name, mode);
+ default:
+ ASSERT(0);
}
- ASSERT(0);
}
static struct fastbuf *
-bopen_file_internal(byte *name, int mode, struct fb_params *params, int try)
+bopen_file_internal(const byte *name, int mode, struct fb_params *params, int try)
{
if (params->type == FB_DIRECT && !fbdir_cheat)
mode |= O_DIRECT;
+ if (params->type == FB_MMAP && (mode & O_ACCMODE) == O_WRONLY)
+ mode = (mode & ~O_ACCMODE) | O_RDWR;
int fd = sh_open(name, mode, 0666);
if (fd < 0)
if (try)
}
struct fastbuf *
-bopen_file(byte *name, int mode, struct fb_params *params)
+bopen_file(const char *name, int mode, struct fb_params *params)
{
return bopen_file_internal(name, mode, params ? : &fbpar_def, 0);
}
struct fastbuf *
-bopen_file_try(byte *name, int mode, struct fb_params *params)
+bopen_file_try(const char *name, int mode, struct fb_params *params)
{
return bopen_file_internal(name, mode, params ? : &fbpar_def, 1);
}