mirror of
https://github.com/trapexit/mergerfs.git
synced 2025-02-21 15:18:54 +08:00
commit
66fdcc4ef7
@ -19,8 +19,8 @@
|
||||
#include <fuse.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "fs_fallocate.hpp"
|
||||
#include "fileinfo.hpp"
|
||||
|
||||
static
|
||||
@ -32,22 +32,7 @@ _fallocate(const int fd,
|
||||
{
|
||||
int rv;
|
||||
|
||||
#ifdef _GNU_SOURCE
|
||||
rv = ::fallocate(fd,mode,offset,len);
|
||||
#elif defined _XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L
|
||||
if(mode)
|
||||
{
|
||||
rv = -1;
|
||||
errno = EOPNOTSUPP;
|
||||
}
|
||||
else
|
||||
{
|
||||
rv = ::posix_fallocate(fd,offset,len);
|
||||
}
|
||||
#else
|
||||
rv = -1;
|
||||
errno = EOPNOTSUPP;
|
||||
#endif
|
||||
rv = fs::fallocate(fd,mode,offset,len);
|
||||
|
||||
return ((rv == -1) ? -errno : 0);
|
||||
}
|
||||
@ -65,6 +50,7 @@ namespace mergerfs
|
||||
{
|
||||
FileInfo *fi = reinterpret_cast<FileInfo*>(ffi->fh);
|
||||
|
||||
|
||||
return _fallocate(fi->fd,
|
||||
mode,
|
||||
offset,
|
||||
|
@ -14,20 +14,19 @@
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#ifdef __linux__
|
||||
#include <sys/sendfile.h>
|
||||
#endif
|
||||
#include <fcntl.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "fs_attr.hpp"
|
||||
#include "fs_fallocate.hpp"
|
||||
#include "fs_sendfile.hpp"
|
||||
#include "fs_xattr.hpp"
|
||||
|
||||
using std::string;
|
||||
@ -35,20 +34,6 @@ using std::vector;
|
||||
|
||||
namespace fs
|
||||
{
|
||||
static
|
||||
ssize_t
|
||||
sendfile(const int fdin,
|
||||
const int fdout,
|
||||
const size_t count)
|
||||
{
|
||||
#if defined __linux__
|
||||
off_t offset = 0;
|
||||
return ::sendfile(fdout,fdin,&offset,count);
|
||||
#else
|
||||
return (errno=EINVAL,-1);
|
||||
#endif
|
||||
}
|
||||
|
||||
int
|
||||
writen(const int fd,
|
||||
const char *buf,
|
||||
@ -69,7 +54,7 @@ namespace fs
|
||||
}
|
||||
|
||||
nleft -= nwritten;
|
||||
buf += nwritten;
|
||||
buf += nwritten;
|
||||
}
|
||||
|
||||
return count;
|
||||
@ -91,6 +76,8 @@ namespace fs
|
||||
bufsize = (blocksize * 16);
|
||||
buf.resize(bufsize);
|
||||
|
||||
::lseek(fdin,0,SEEK_SET);
|
||||
|
||||
totalwritten = 0;
|
||||
while(totalwritten < count)
|
||||
{
|
||||
@ -99,8 +86,7 @@ namespace fs
|
||||
{
|
||||
if(errno == EINTR)
|
||||
continue;
|
||||
else
|
||||
return -1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
nw = writen(fdout,&buf[0],nr);
|
||||
@ -125,7 +111,7 @@ namespace fs
|
||||
::posix_fadvise(fdin,0,count,POSIX_FADV_WILLNEED);
|
||||
::posix_fadvise(fdin,0,count,POSIX_FADV_SEQUENTIAL);
|
||||
|
||||
::posix_fallocate(fdout,0,count);
|
||||
fs::fallocate(fdout,0,0,count);
|
||||
|
||||
rv = fs::sendfile(fdin,fdout,count);
|
||||
if((rv == -1) && ((errno == EINVAL) || (errno == ENOSYS)))
|
||||
|
44
src/fs_fallocate.cpp
Normal file
44
src/fs_fallocate.cpp
Normal file
@ -0,0 +1,44 @@
|
||||
/*
|
||||
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.
|
||||
*/
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "fs_fallocate.hpp"
|
||||
|
||||
namespace fs
|
||||
{
|
||||
int
|
||||
fallocate(const int fd,
|
||||
const int mode,
|
||||
const off_t offset,
|
||||
const off_t len)
|
||||
{
|
||||
int rv;
|
||||
|
||||
#ifdef __linux__
|
||||
rv = ::fallocate(fd,mode,offset,len);
|
||||
#elif _XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L
|
||||
rv = (mode ?
|
||||
(errno=EOPNOTSUPP,-1) :
|
||||
(::posix_fallocate(fd,offset,len)));
|
||||
#else
|
||||
rv = (errno=EOPNOTSUPP,-1);
|
||||
#endif
|
||||
|
||||
return rv;
|
||||
}
|
||||
}
|
29
src/fs_fallocate.hpp
Normal file
29
src/fs_fallocate.hpp
Normal file
@ -0,0 +1,29 @@
|
||||
/*
|
||||
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.
|
||||
*/
|
||||
|
||||
#ifndef __FS_FALLOCATE_HPP__
|
||||
#define __FS_FALLOCATE_HPP__
|
||||
|
||||
namespace fs
|
||||
{
|
||||
int
|
||||
fallocate(const int fd,
|
||||
const int mode,
|
||||
const off_t offset,
|
||||
const off_t len);
|
||||
}
|
||||
|
||||
#endif // __FS_FALLOCATE_HPP__
|
40
src/fs_sendfile.cpp
Normal file
40
src/fs_sendfile.cpp
Normal file
@ -0,0 +1,40 @@
|
||||
/*
|
||||
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.
|
||||
*/
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#if defined __linux__
|
||||
#include <sys/sendfile.h>
|
||||
#endif
|
||||
|
||||
#include "fs_sendfile.hpp"
|
||||
|
||||
namespace fs
|
||||
{
|
||||
ssize_t
|
||||
sendfile(const int fdin,
|
||||
const int fdout,
|
||||
const size_t count)
|
||||
{
|
||||
#if defined __linux__
|
||||
off_t offset = 0;
|
||||
|
||||
return ::sendfile(fdout,fdin,&offset,count);
|
||||
#else
|
||||
return (errno=EINVAL,-1);
|
||||
#endif
|
||||
}
|
||||
}
|
28
src/fs_sendfile.hpp
Normal file
28
src/fs_sendfile.hpp
Normal file
@ -0,0 +1,28 @@
|
||||
/*
|
||||
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.
|
||||
*/
|
||||
|
||||
#ifndef __FS_SENDFILE_HPP__
|
||||
#define __FS_SENDFILE_HPP__
|
||||
|
||||
namespace fs
|
||||
{
|
||||
ssize_t
|
||||
sendfile(const int fdin,
|
||||
const int fdout,
|
||||
const size_t count);
|
||||
}
|
||||
|
||||
#endif // __FS_SENDFILE_HPP__
|
Loading…
x
Reference in New Issue
Block a user