mirror of
https://github.com/trapexit/mergerfs.git
synced 2025-06-24 06:39:55 +08:00
use different read and write functions when using direct_io
This commit is contained in:
@ -39,6 +39,7 @@ namespace mergerfs
|
|||||||
srcmountslock(),
|
srcmountslock(),
|
||||||
minfreespace(MINFREESPACE_DEFAULT),
|
minfreespace(MINFREESPACE_DEFAULT),
|
||||||
moveonenospc(false),
|
moveonenospc(false),
|
||||||
|
direct_io(false),
|
||||||
POLICYINIT(access),
|
POLICYINIT(access),
|
||||||
POLICYINIT(chmod),
|
POLICYINIT(chmod),
|
||||||
POLICYINIT(chown),
|
POLICYINIT(chown),
|
||||||
|
@ -47,6 +47,7 @@ namespace mergerfs
|
|||||||
mutable pthread_rwlock_t srcmountslock;
|
mutable pthread_rwlock_t srcmountslock;
|
||||||
uint64_t minfreespace;
|
uint64_t minfreespace;
|
||||||
bool moveonenospc;
|
bool moveonenospc;
|
||||||
|
bool direct_io;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
const Policy *policies[FuseFunc::Enum::END];
|
const Policy *policies[FuseFunc::Enum::END];
|
||||||
|
@ -78,7 +78,8 @@ namespace local
|
|||||||
|
|
||||||
static
|
static
|
||||||
void
|
void
|
||||||
get_fuse_operations(struct fuse_operations &ops)
|
get_fuse_operations(struct fuse_operations &ops,
|
||||||
|
const bool direct_io)
|
||||||
{
|
{
|
||||||
#if FLAG_NOPATH
|
#if FLAG_NOPATH
|
||||||
ops.flag_nopath = false;
|
ops.flag_nopath = false;
|
||||||
@ -115,7 +116,9 @@ namespace local
|
|||||||
ops.open = mergerfs::fuse::open;
|
ops.open = mergerfs::fuse::open;
|
||||||
ops.opendir = mergerfs::fuse::opendir;
|
ops.opendir = mergerfs::fuse::opendir;
|
||||||
ops.poll = NULL;
|
ops.poll = NULL;
|
||||||
ops.read = mergerfs::fuse::read;
|
ops.read = direct_io ?
|
||||||
|
mergerfs::fuse::read_direct_io :
|
||||||
|
mergerfs::fuse::read;
|
||||||
#if READ_BUF
|
#if READ_BUF
|
||||||
ops.read_buf = mergerfs::fuse::read_buf;
|
ops.read_buf = mergerfs::fuse::read_buf;
|
||||||
#endif
|
#endif
|
||||||
@ -133,7 +136,9 @@ namespace local
|
|||||||
ops.unlink = mergerfs::fuse::unlink;
|
ops.unlink = mergerfs::fuse::unlink;
|
||||||
ops.utime = NULL; /* deprecated; use utimens() */
|
ops.utime = NULL; /* deprecated; use utimens() */
|
||||||
ops.utimens = mergerfs::fuse::utimens;
|
ops.utimens = mergerfs::fuse::utimens;
|
||||||
ops.write = mergerfs::fuse::write;
|
ops.write = direct_io ?
|
||||||
|
mergerfs::fuse::write_direct_io :
|
||||||
|
mergerfs::fuse::write;
|
||||||
#if WRITE_BUF
|
#if WRITE_BUF
|
||||||
ops.write_buf = mergerfs::fuse::write_buf;
|
ops.write_buf = mergerfs::fuse::write_buf;
|
||||||
#endif
|
#endif
|
||||||
@ -172,7 +177,7 @@ namespace mergerfs
|
|||||||
mergerfs::options::parse(args,config);
|
mergerfs::options::parse(args,config);
|
||||||
|
|
||||||
local::setup_resources();
|
local::setup_resources();
|
||||||
local::get_fuse_operations(ops);
|
local::get_fuse_operations(ops,config.direct_io);
|
||||||
|
|
||||||
return fuse_main(args.argc,
|
return fuse_main(args.argc,
|
||||||
args.argv,
|
args.argv,
|
||||||
|
@ -140,10 +140,9 @@ parse_and_process_arg(Config &config,
|
|||||||
fuse_args *outargs)
|
fuse_args *outargs)
|
||||||
{
|
{
|
||||||
if(arg == "defaults")
|
if(arg == "defaults")
|
||||||
{
|
return (set_default_options(*outargs),0);
|
||||||
set_default_options(*outargs);
|
else if(arg == "direct_io")
|
||||||
return 0;
|
return (config.direct_io=true,1);
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
41
src/read.cpp
41
src/read.cpp
@ -25,6 +25,7 @@
|
|||||||
#include "fs_base_read.hpp"
|
#include "fs_base_read.hpp"
|
||||||
|
|
||||||
static
|
static
|
||||||
|
inline
|
||||||
int
|
int
|
||||||
_read(const int fd,
|
_read(const int fd,
|
||||||
void *buf,
|
void *buf,
|
||||||
@ -34,8 +35,29 @@ _read(const int fd,
|
|||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
rv = fs::pread(fd,buf,count,offset);
|
rv = fs::pread(fd,buf,count,offset);
|
||||||
|
if(rv == -1)
|
||||||
|
return -errno;
|
||||||
|
if(rv == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
return ((rv == -1) ? -errno : rv);
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
inline
|
||||||
|
int
|
||||||
|
_read_direct_io(const int fd,
|
||||||
|
void *buf,
|
||||||
|
const size_t count,
|
||||||
|
const off_t offset)
|
||||||
|
{
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
rv = fs::pread(fd,buf,count,offset);
|
||||||
|
if(rv == -1)
|
||||||
|
return -errno;
|
||||||
|
|
||||||
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace mergerfs
|
namespace mergerfs
|
||||||
@ -51,10 +73,19 @@ namespace mergerfs
|
|||||||
{
|
{
|
||||||
FileInfo *fi = reinterpret_cast<FileInfo*>(ffi->fh);
|
FileInfo *fi = reinterpret_cast<FileInfo*>(ffi->fh);
|
||||||
|
|
||||||
return _read(fi->fd,
|
return _read(fi->fd,buf,count,offset);
|
||||||
buf,
|
}
|
||||||
count,
|
|
||||||
offset);
|
int
|
||||||
|
read_direct_io(const char *fusepath,
|
||||||
|
char *buf,
|
||||||
|
size_t count,
|
||||||
|
off_t offset,
|
||||||
|
fuse_file_info *ffi)
|
||||||
|
{
|
||||||
|
FileInfo *fi = reinterpret_cast<FileInfo*>(ffi->fh);
|
||||||
|
|
||||||
|
return _read_direct_io(fi->fd,buf,count,offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,5 +24,12 @@ namespace mergerfs
|
|||||||
size_t count,
|
size_t count,
|
||||||
off_t offset,
|
off_t offset,
|
||||||
fuse_file_info *fi);
|
fuse_file_info *fi);
|
||||||
|
|
||||||
|
int
|
||||||
|
read_direct_io(const char *fusepath,
|
||||||
|
char *buf,
|
||||||
|
size_t count,
|
||||||
|
off_t offset,
|
||||||
|
fuse_file_info *fi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,10 @@
|
|||||||
#include "rwlock.hpp"
|
#include "rwlock.hpp"
|
||||||
#include "ugid.hpp"
|
#include "ugid.hpp"
|
||||||
|
|
||||||
|
using namespace mergerfs;
|
||||||
|
|
||||||
|
typedef int (*WriteFunc)(const int,const void*,const size_t,const off_t);
|
||||||
|
|
||||||
static
|
static
|
||||||
bool
|
bool
|
||||||
_out_of_space(const int error)
|
_out_of_space(const int error)
|
||||||
@ -33,6 +37,7 @@ _out_of_space(const int error)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
|
inline
|
||||||
int
|
int
|
||||||
_write(const int fd,
|
_write(const int fd,
|
||||||
const void *buf,
|
const void *buf,
|
||||||
@ -42,25 +47,52 @@ _write(const int fd,
|
|||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
rv = fs::pwrite(fd,buf,count,offset);
|
rv = fs::pwrite(fd,buf,count,offset);
|
||||||
|
if(rv == -1)
|
||||||
|
return -errno;
|
||||||
|
if(rv == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
return ((rv == -1) ? -errno : rv);
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
inline
|
||||||
|
int
|
||||||
|
_write_direct_io(const int fd,
|
||||||
|
const void *buf,
|
||||||
|
const size_t count,
|
||||||
|
const off_t offset)
|
||||||
|
{
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
rv = fs::pwrite(fd,buf,count,offset);
|
||||||
|
if(rv == -1)
|
||||||
|
return -errno;
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace mergerfs
|
namespace mergerfs
|
||||||
{
|
{
|
||||||
namespace fuse
|
namespace fuse
|
||||||
{
|
{
|
||||||
|
static
|
||||||
|
inline
|
||||||
int
|
int
|
||||||
write(const char *fusepath,
|
write(WriteFunc func,
|
||||||
|
const char *fusepath,
|
||||||
const char *buf,
|
const char *buf,
|
||||||
size_t count,
|
const size_t count,
|
||||||
off_t offset,
|
const off_t offset,
|
||||||
fuse_file_info *ffi)
|
fuse_file_info *ffi)
|
||||||
{
|
{
|
||||||
int rv;
|
int rv;
|
||||||
FileInfo* fi = reinterpret_cast<FileInfo*>(ffi->fh);
|
FileInfo* fi = reinterpret_cast<FileInfo*>(ffi->fh);
|
||||||
|
|
||||||
rv = _write(fi->fd,buf,count,offset);
|
rv = func(fi->fd,buf,count,offset);
|
||||||
if(_out_of_space(-rv))
|
if(_out_of_space(-rv))
|
||||||
{
|
{
|
||||||
const fuse_context *fc = fuse_get_context();
|
const fuse_context *fc = fuse_get_context();
|
||||||
@ -75,11 +107,31 @@ namespace mergerfs
|
|||||||
if(rv == -1)
|
if(rv == -1)
|
||||||
return -ENOSPC;
|
return -ENOSPC;
|
||||||
|
|
||||||
rv = _write(fi->fd,buf,count,offset);
|
rv = func(fi->fd,buf,count,offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
write(const char *fusepath,
|
||||||
|
const char *buf,
|
||||||
|
size_t count,
|
||||||
|
off_t offset,
|
||||||
|
fuse_file_info *ffi)
|
||||||
|
{
|
||||||
|
return write(_write,fusepath,buf,count,offset,ffi);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
write_direct_io(const char *fusepath,
|
||||||
|
const char *buf,
|
||||||
|
size_t count,
|
||||||
|
off_t offset,
|
||||||
|
fuse_file_info *ffi)
|
||||||
|
{
|
||||||
|
return write(_write_direct_io,fusepath,buf,count,offset,ffi);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,5 +24,12 @@ namespace mergerfs
|
|||||||
size_t count,
|
size_t count,
|
||||||
off_t offset,
|
off_t offset,
|
||||||
fuse_file_info *fi);
|
fuse_file_info *fi);
|
||||||
|
|
||||||
|
int
|
||||||
|
write_direct_io(const char *fusepath,
|
||||||
|
const char *buf,
|
||||||
|
size_t count,
|
||||||
|
off_t offset,
|
||||||
|
fuse_file_info *fi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user