use different read and write functions when using direct_io

This commit is contained in:
Antonio SJ Musumeci
2016-12-20 17:06:34 -05:00
parent 437067b5e0
commit 1aa76a54c2
8 changed files with 122 additions and 19 deletions

View File

@ -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),

View File

@ -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];

View File

@ -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,

View File

@ -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;
} }

View File

@ -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);
} }
} }
} }

View File

@ -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);
} }
} }

View File

@ -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);
}
} }
} }

View File

@ -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);
} }
} }