Browse Source

Rework new `lup` policy to work on 32bit systems

__int128 is not available on 32bit platforms. Moved to extended
precision floats.
pull/1603/head
Antonio SJ Musumeci 4 days ago
parent
commit
1631d40857
  1. 24
      libfuse/include/base_types.h
  2. 2
      libfuse/include/fuse_cfg.hpp
  3. 2
      libfuse/include/fuse_msgbuf.hpp
  4. 13
      libfuse/include/int_types.h
  5. 2
      src/branch.hpp
  6. 2
      src/branches.cpp
  7. 2
      src/dirinfo.hpp
  8. 4
      src/fileinfo.hpp
  9. 2
      src/fs_attr.hpp
  10. 2
      src/fs_copydata.hpp
  11. 2
      src/fs_copydata_copy_file_range.cpp
  12. 2
      src/fs_copydata_copy_file_range.hpp
  13. 2
      src/fs_copydata_readwrite.hpp
  14. 2
      src/fs_copyfile.hpp
  15. 2
      src/fs_movefile_and_open.cpp
  16. 2
      src/fs_pread.hpp
  17. 9
      src/mergerfs_fsck.cpp
  18. 2
      src/mergerfs_ioctl.hpp
  19. 48
      src/policy_lup.cpp
  20. 3
      src/symlinkify.hpp

24
libfuse/include/base_types.h

@ -0,0 +1,24 @@
#pragma once
#include <stdint.h>
typedef uint32_t u32;
typedef int32_t s32;
typedef uint64_t u64;
typedef int64_t s64;
typedef const uint32_t cu32;
typedef const int32_t cs32;
typedef const uint64_t cu64;
typedef const int64_t cs64;
typedef float f32;
typedef double f64;
typedef long double f80;
typedef char assertion_f32_is_32bit[sizeof(f32) == 4 ? 1 : -1];
typedef char assertion_f64_is_64bit[sizeof(f64) == 8 ? 1 : -1];
typedef char assertion_f80_is_at_least_64bit[sizeof(f64) >= 8 ? 1 : -1];
typedef const float cf32;
typedef const double cf64;
typedef const long double cf80;

2
libfuse/include/fuse_cfg.hpp

@ -1,6 +1,6 @@
#pragma once
#include "int_types.h"
#include "base_types.h"
#include <climits>
#include <string>

2
libfuse/include/fuse_msgbuf.hpp

@ -18,7 +18,7 @@
#pragma once
#include "int_types.h"
#include "base_types.h"
#include "fuse_msgbuf_t.h"
u32 msgbuf_get_pagesize();

13
libfuse/include/int_types.h

@ -1,13 +0,0 @@
#pragma once
#include <stdint.h>
typedef uint64_t u32;
typedef int64_t s32;
typedef uint64_t u64;
typedef int64_t s64;
typedef const uint64_t cu32;
typedef const int64_t cs32;
typedef const uint64_t cu64;
typedef const int64_t cs64;

2
src/branch.hpp

@ -18,7 +18,7 @@
#pragma once
#include "int_types.h"
#include "base_types.h"
#include "strvec.hpp"
#include "tofrom_string.hpp"
#include "fs_path.hpp"

2
src/branches.cpp

@ -23,7 +23,7 @@
#include "fs_glob.hpp"
#include "fs_is_rofs.hpp"
#include "fs_realpathize.hpp"
#include "int_types.h"
#include "base_types.h"
#include "num.hpp"
#include "str.hpp"
#include "syslog.hpp"

2
src/dirinfo.hpp

@ -18,7 +18,7 @@
#include "fh.hpp"
#include "int_types.h"
#include "base_types.h"
class DirInfo : public FH

4
src/fileinfo.hpp

@ -20,9 +20,9 @@
#include "fh.hpp"
#include "fs_path.hpp"
#include <mutex>
#include "base_types.h"
#include "int_types.h"
#include <mutex>
class FileInfo : public FH

2
src/fs_attr.hpp

@ -18,7 +18,7 @@
#include <string>
#include "int_types.h"
#include "base_types.h"
#define FS_ATTR_NONE (0)
#define FS_ATTR_CLEAR_IMMUTABLE (1 << 0)

2
src/fs_copydata.hpp

@ -18,7 +18,7 @@
#pragma once
#include "int_types.h"
#include "base_types.h"
namespace fs

2
src/fs_copydata_copy_file_range.cpp

@ -20,7 +20,7 @@
#include "fs_copy_file_range.hpp"
#include "fs_fstat.hpp"
#include "int_types.h"
#include "base_types.h"
static

2
src/fs_copydata_copy_file_range.hpp

@ -16,7 +16,7 @@
#pragma once
#include "int_types.h"
#include "base_types.h"
namespace fs

2
src/fs_copydata_readwrite.hpp

@ -16,7 +16,7 @@
#pragma once
#include "int_types.h"
#include "base_types.h"
namespace fs
{

2
src/fs_copyfile.hpp

@ -1,6 +1,6 @@
#pragma once
#include "int_types.h"
#include "base_types.h"
#include "fs_path.hpp"
#include <sys/stat.h>

2
src/fs_movefile_and_open.cpp

@ -16,6 +16,7 @@
#include "fs_movefile_and_open.hpp"
#include "base_types.h"
#include "errno.hpp"
#include "fs_clonepath.hpp"
#include "fs_close.hpp"
@ -30,7 +31,6 @@
#include "fs_rename.hpp"
#include "fs_stat.hpp"
#include "fs_unlink.hpp"
#include "int_types.h"
#include "policy.hpp"
#include "ugid.hpp"

2
src/fs_pread.hpp

@ -18,7 +18,7 @@
#pragma once
#include "int_types.h"
#include "base_types.h"
#include "to_neg_errno.hpp"
#include <unistd.h>

9
src/mergerfs_fsck.cpp

@ -1,20 +1,21 @@
#include "mergerfs_fsck.hpp"
#include "fs_close.hpp"
#include "fs_copyfile.hpp"
#include "fs_lchmod.hpp"
#include "fs_lchown.hpp"
#include "fs_close.hpp"
#include "fs_lgetxattr.hpp"
#include "fs_lstat.hpp"
#include "fs_open.hpp"
#include "int_types.h"
#include "str.hpp"
#include "fs_copyfile.hpp"
#include "mergerfs_api.hpp"
#include "str.hpp"
#include "fmt/core.h"
#include "fmt/chrono.h"
#include "CLI11.hpp"
#include "base_types.h"
#include <filesystem>
namespace FS = std::filesystem;

2
src/mergerfs_ioctl.hpp

@ -1,6 +1,6 @@
#pragma once
#include "int_types.h"
#include "base_types.h"
#include <sys/ioctl.h>

48
src/policy_lup.cpp

@ -26,6 +26,8 @@
#include "policy_error.hpp"
#include "rwlock.hpp"
#include "base_types.h"
#include <limits>
#include <string>
@ -41,13 +43,14 @@ _action(const Branches::Ptr &branches_,
int error;
fs::info_t info;
Branch *obranch;
u64 best_used;
u64 best_total;
best_used = 0;
best_total = 1;
obranch = nullptr;
error = ENOENT;
uint64_t best_used = 0;
uint64_t best_total = 1;
for(auto &branch : *branches_)
{
if(branch.ro())
@ -60,8 +63,8 @@ _action(const Branches::Ptr &branches_,
if(info.readonly)
error_and_continue(error,EROFS);
uint64_t used = info.spaceused;
uint64_t total = info.spaceused + info.spaceavail;
u64 used = info.spaceused;
u64 total = info.spaceused + info.spaceavail;
if(total == 0)
{
used = 0;
@ -76,8 +79,8 @@ _action(const Branches::Ptr &branches_,
continue;
}
unsigned __int128 lhs = (unsigned __int128)used * (unsigned __int128)best_total;
unsigned __int128 rhs = (unsigned __int128)best_used * (unsigned __int128)total;
f80 lhs = (f80)used * (f80)best_total;
f80 rhs = (f80)best_used * (f80)total;
if(lhs >= rhs)
continue;
@ -101,12 +104,14 @@ _search(const Branches::Ptr &branches_,
std::vector<Branch *> &paths_)
{
int rv;
uint64_t used;
uint64_t avail;
uint64_t best_used = 0;
uint64_t best_total = 1;
u64 used;
u64 avail;
u64 best_used;
u64 best_total;
Branch *obranch;
best_used = 0;
best_total = 1;
obranch = nullptr;
for(auto &branch : *branches_)
@ -120,7 +125,7 @@ _search(const Branches::Ptr &branches_,
if(rv < 0)
continue;
uint64_t total = used + avail;
u64 total = used + avail;
if(total == 0)
{
used = 0;
@ -135,8 +140,8 @@ _search(const Branches::Ptr &branches_,
continue;
}
unsigned __int128 lhs = (unsigned __int128)used * (unsigned __int128)best_total;
unsigned __int128 rhs = (unsigned __int128)best_used * (unsigned __int128)total;
f80 lhs = (f80)used * (f80)best_total;
f80 rhs = (f80)best_used * (f80)total;
if(lhs >= rhs)
continue;
@ -160,15 +165,16 @@ _create(const Branches::Ptr &branches_,
{
int rv;
int error;
u64 best_used;
u64 best_total;
fs::info_t info;
Branch *obranch;
best_used = 0;
best_total = 1;
obranch = nullptr;
error = ENOENT;
uint64_t best_used = 0;
uint64_t best_total = 1;
for(auto &branch : *branches_)
{
if(branch.ro_or_nc())
@ -181,8 +187,8 @@ _create(const Branches::Ptr &branches_,
if(info.spaceavail < branch.minfreespace())
error_and_continue(error,ENOSPC);
uint64_t used = info.spaceused;
uint64_t total = info.spaceused + info.spaceavail;
u64 used = info.spaceused;
u64 total = info.spaceused + info.spaceavail;
if(total == 0)
{
used = 0;
@ -197,8 +203,8 @@ _create(const Branches::Ptr &branches_,
continue;
}
unsigned __int128 lhs = (unsigned __int128)used * (unsigned __int128)best_total;
unsigned __int128 rhs = (unsigned __int128)best_used * (unsigned __int128)total;
f80 lhs = (f80)used * (f80)best_total;
f80 rhs = (f80)best_used * (f80)total;
if(lhs >= rhs)
continue;

3
src/symlinkify.hpp

@ -19,7 +19,8 @@
#pragma once
#include "fuse_kernel.h"
#include "int_types.h"
#include "base_types.h"
#include <string>

Loading…
Cancel
Save