mirror of https://github.com/trapexit/mergerfs.git
Browse Source
Fix read/write behavior and return value depending on direct_io
Fix read/write behavior and return value depending on direct_io
Also add parallel direct write option for 6.2+ kernels.pull/1203/head
Antonio SJ Musumeci
2 years ago
19 changed files with 526 additions and 153 deletions
-
4README.md
-
2libfuse/include/fuse_common.h
-
61libfuse/include/fuse_kernel.h
-
29libfuse/lib/fuse_lowlevel.c
-
6man/mergerfs.1
-
2src/config.cpp
-
2src/config.hpp
-
12src/fileinfo.hpp
-
4src/fs_copydata_readwrite.cpp
-
38src/fs_dup2.hpp
-
2src/fs_movefile.cpp
-
59src/fs_preadn.hpp
-
42src/fs_pwrite.hpp
-
59src/fs_pwriten.hpp
-
11src/fs_write.hpp
-
35src/fuse_create.cpp
-
36src/fuse_open.cpp
-
26src/fuse_read.cpp
-
141src/fuse_write.cpp
@ -0,0 +1,38 @@ |
|||||
|
/*
|
||||
|
ISC License |
||||
|
|
||||
|
Copyright (c) 2023, Antonio SJ Musumeci <trapexit@spawn.link> |
||||
|
|
||||
|
Permission to use, copy, modify, and/or distribute this software for any |
||||
|
purpose with or without fee is hereby granted, provided that the above |
||||
|
copyright notice and this permission notice appear in all copies. |
||||
|
|
||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
||||
|
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
||||
|
*/ |
||||
|
|
||||
|
#pragma once
|
||||
|
|
||||
|
#include <unistd.h>
|
||||
|
|
||||
|
|
||||
|
namespace fs |
||||
|
{ |
||||
|
static |
||||
|
inline |
||||
|
int |
||||
|
dup2(int const oldfd_, |
||||
|
int const newfd_) |
||||
|
{ |
||||
|
int rv; |
||||
|
|
||||
|
rv = ::dup2(oldfd_,newfd_); |
||||
|
|
||||
|
return ((rv == -1) ? -errno : rv); |
||||
|
} |
||||
|
} |
@ -0,0 +1,59 @@ |
|||||
|
/*
|
||||
|
ISC License |
||||
|
|
||||
|
Copyright (c) 2023, Antonio SJ Musumeci <trapexit@spawn.link> |
||||
|
|
||||
|
Permission to use, copy, modify, and/or distribute this software for any |
||||
|
purpose with or without fee is hereby granted, provided that the above |
||||
|
copyright notice and this permission notice appear in all copies. |
||||
|
|
||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
||||
|
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
||||
|
*/ |
||||
|
|
||||
|
#pragma once
|
||||
|
|
||||
|
#include "fs_pread.hpp"
|
||||
|
|
||||
|
|
||||
|
namespace fs |
||||
|
{ |
||||
|
static |
||||
|
inline |
||||
|
ssize_t |
||||
|
preadn(int const fd_, |
||||
|
void *buf_, |
||||
|
size_t const count_, |
||||
|
off_t const offset_, |
||||
|
int *err_) |
||||
|
{ |
||||
|
ssize_t rv; |
||||
|
ssize_t count = count_; |
||||
|
off_t offset = offset_; |
||||
|
char const *buf = (char const *)buf_; |
||||
|
|
||||
|
*err_ = 0; |
||||
|
while(count > 0) |
||||
|
{ |
||||
|
rv = fs::pread(fd_,buf,count,offset); |
||||
|
if(rv == 0) |
||||
|
return (count_ - count); |
||||
|
if(rv < 0) |
||||
|
{ |
||||
|
*err_ = rv; |
||||
|
return (count_ - count); |
||||
|
} |
||||
|
|
||||
|
buf += rv; |
||||
|
count -= rv; |
||||
|
offset += rv; |
||||
|
} |
||||
|
|
||||
|
return count_; |
||||
|
} |
||||
|
} |
@ -0,0 +1,42 @@ |
|||||
|
/*
|
||||
|
ISC License |
||||
|
|
||||
|
Copyright (c) 2016, Antonio SJ Musumeci <trapexit@spawn.link> |
||||
|
|
||||
|
Permission to use, copy, modify, and/or distribute this software for any |
||||
|
purpose with or without fee is hereby granted, provided that the above |
||||
|
copyright notice and this permission notice appear in all copies. |
||||
|
|
||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
||||
|
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
||||
|
*/ |
||||
|
|
||||
|
#pragma once
|
||||
|
|
||||
|
#include <unistd.h>
|
||||
|
|
||||
|
|
||||
|
namespace fs |
||||
|
{ |
||||
|
static |
||||
|
inline |
||||
|
ssize_t |
||||
|
pwrite(int const fd_, |
||||
|
void const *buf_, |
||||
|
size_t const count_, |
||||
|
off_t const offset_) |
||||
|
{ |
||||
|
ssize_t rv; |
||||
|
|
||||
|
rv = ::pwrite(fd_,buf_,count_,offset_); |
||||
|
if(rv == -1) |
||||
|
return -errno; |
||||
|
|
||||
|
return rv; |
||||
|
} |
||||
|
} |
@ -0,0 +1,59 @@ |
|||||
|
/*
|
||||
|
ISC License |
||||
|
|
||||
|
Copyright (c) 2023, Antonio SJ Musumeci <trapexit@spawn.link> |
||||
|
|
||||
|
Permission to use, copy, modify, and/or distribute this software for any |
||||
|
purpose with or without fee is hereby granted, provided that the above |
||||
|
copyright notice and this permission notice appear in all copies. |
||||
|
|
||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
||||
|
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
||||
|
*/ |
||||
|
|
||||
|
#pragma once
|
||||
|
|
||||
|
#include "fs_pwrite.hpp"
|
||||
|
|
||||
|
|
||||
|
namespace fs |
||||
|
{ |
||||
|
static |
||||
|
inline |
||||
|
ssize_t |
||||
|
pwriten(const int fd_, |
||||
|
const void *buf_, |
||||
|
const size_t count_, |
||||
|
const off_t offset_, |
||||
|
int *err_) |
||||
|
{ |
||||
|
ssize_t rv; |
||||
|
ssize_t count = count_; |
||||
|
off_t offset = offset_; |
||||
|
char const *buf = (char const *)buf_; |
||||
|
|
||||
|
*err_ = 0; |
||||
|
while(count > 0) |
||||
|
{ |
||||
|
rv = fs::pwrite(fd_,buf,count,offset); |
||||
|
if(rv == 0) |
||||
|
return (count_ - count); |
||||
|
if(rv < 0) |
||||
|
{ |
||||
|
*err_ = rv; |
||||
|
return (count_ - count); |
||||
|
} |
||||
|
|
||||
|
buf += rv; |
||||
|
count -= rv; |
||||
|
offset += rv; |
||||
|
} |
||||
|
|
||||
|
return count_; |
||||
|
} |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue