mirror of
https://github.com/isar/libmdbx.git
synced 2024-12-29 09:18:50 +08:00
mdbx: костыль для обхода ошибок encryptfs.
Выяснилось что утилита `mdbx_copy` и функции `mdbx_env_copy()` могут создавать ПРОБЛЕМЫ если целевой файл расположен в encryptfs (такая файловая система в Linux). При этом может быть четыре исхода в зависимости от версии ядра и положения звезд на небе: - всё хорошо; - плохие данные в копии без возврата ошибок; - ошибка EINVAL(22) при копировании; - oops или зависание ядра, отвал смонтированной encryptfs и т.п. В текущем понимании, причина обусловлена ошибой в коде fs, которая проявляется при использовании системного вызова `copy_file_range`.
This commit is contained in:
parent
206dbecccf
commit
8833dc6871
@ -20339,6 +20339,11 @@ __cold static int env_copy_asis(MDBX_env *env, MDBX_txn *read_txn,
|
||||
#if MDBX_USE_COPYFILERANGE
|
||||
static bool copyfilerange_unavailable;
|
||||
bool not_the_same_filesystem = false;
|
||||
struct statfs statfs_info;
|
||||
if (fstatfs(fd, &statfs_info) ||
|
||||
statfs_info.f_type == /* ECRYPTFS_SUPER_MAGIC */ 0xf15f)
|
||||
/* avoid use copyfilerange_unavailable() to ecryptfs due bugs */
|
||||
not_the_same_filesystem = true;
|
||||
#endif /* MDBX_USE_COPYFILERANGE */
|
||||
for (size_t offset = meta_bytes; rc == MDBX_SUCCESS && offset < used_size;) {
|
||||
#if MDBX_USE_SENDFILE
|
||||
@ -20372,7 +20377,9 @@ __cold static int env_copy_asis(MDBX_env *env, MDBX_txn *read_txn,
|
||||
if (bytes_copied == 0)
|
||||
break;
|
||||
rc = errno;
|
||||
if (rc == EXDEV)
|
||||
if (rc == EXDEV || rc == /* workaround for ecryptfs bug(s),
|
||||
maybe usefull for others fs */
|
||||
EINVAL)
|
||||
not_the_same_filesystem = true;
|
||||
else if (ignore_enosys(rc) == MDBX_RESULT_TRUE)
|
||||
copyfilerange_unavailable = true;
|
||||
|
Loading…
x
Reference in New Issue
Block a user