Giter VIP home page Giter VIP logo

pmemfile's Introduction

pmemfile

Build Status Coverage Status Coverity Scan Build Status

⚠️ Discontinuation of the project

The pmemfile project will no longer be maintained by Intel.

  • Intel has ceased development and contributions including, but not limited to, maintenance, bug fixes, new releases, or updates, to this project.
  • Intel no longer accepts patches to this project.
  • If you have an ongoing need to use this project, are interested in independently developing it, or would like to maintain patches for the open source software community, please create your own fork of this project.
  • You will find more information here.

Introduction

Pmemfile project's goal is to provide low-overhead userspace implementation of file APIs using persistent memory. It consists of 2 major compoments:

  • libpmemfile-posix - provides syscall-like API which can be used by applications
  • libpmemfile - provides transparent access to libpmemfile-posix pools

How to build

Requirements:

$ mkdir build
$ cd build
$ cmake .. -DCMAKE_INSTALL_PREFIX=/usr
$ make
$ make install

When developing:

$ ...
$ cmake .. -DCMAKE_BUILD_TYPE=Debug -DDEVELOPER_MODE=1 -DTEST_DIR=/mnt/pmem/pmemfile-tests
$ ...
$ ctest --output-on-failure

Note that in Debug mode "make install" installs only debug libraries.

Pmemfile-specific cmake variables:

  • BUILD_LIBPMEMFILE=0 - disables building of libpmemfile.so
  • BUILD_LIBPMEMFILE_POP=1 - builds tests using with libpmemfile-posix-over-POSIX library which imitates libpmemfile-posix.so, but uses POSIX functions provided by OS
  • DEVELOPER_MODE=1 - enables coding style, whitespace, license checks and enables fail-on-warning flags
  • LONG_TESTS=1 - enables tests which take much more time
  • TEST_DIR=/mnt/pmem/test_dir - provides directory where tests will create its pools
  • TRACE_TESTS=1 - dumps more info when test fails (requires cmake >= 3.4)
  • TESTS_USE_FORCED_PMEM=1 - allows tests to force enable or force disable use of optimized flush in libpmemobj (to speed them up)
  • USE_ASAN=1 - enables AddressSanitizer (only for debugging)
  • USE_UBSAN=1 - enables UndefinedBehaviorSanitizer (only for debugging)
  • LIBPMEMFILE_VALIDATE_POINTERS=1 - build-in support for PMEMFILE_PRELOAD_VALIDATE_POINTERS environment variable

Package for Debian-based distros

$ ./utils/build-deb.sh

Resulting packages will be in ./build-deb/release and ./build-deb/debug

Package for RPM-based distros

$ ./utils/build-rpm.sh

Resulting packages will be in ~/rpmbuild/RPMS.

Note: Before 1.0 pmemfile-posix API and ABI is considered unstable. We reserve the right to change the on-media layout without warning.

Description:

Example:

$ mkfs.pmemfile /dev/dax0.0 0
$ mkdir /tmp/mountpoint

$ sudo pmemfile-mount /dev/dax0.0 /tmp/mountpoint
$ alias pf='LD_PRELOAD=libpmemfile.so'

# or if you don't have root access:

$ alias pf='LD_PRELOAD=libpmemfile.so PMEMFILE_POOLS=/tmp/mountpoint:/dev/dax0.0'

# now all commands prefixed with 'pf' will see files under /tmp/mountpoint,
# but files will be stored in file system backed by /dev/dax0.0
$ pf mkdir /tmp/mountpoint/dir_in_pmemfile
$ pf cp README.md /tmp/mountpoint/dir_in_pmemfile
$ pf ls -l /tmp/mountpoint/
total 0
drwxrwxrwx 2 user group 4008 Feb 16 17:46 dir_in_pmemfile
$ pf ls -l /tmp/mountpoint/dir_in_pmemfile
total 16
-rw-r--r-- 1 user group 1014 Feb 16 17:46 README.md
$ pf cat /tmp/mountpoint/dir_in_pmemfile/README.md | wc -c
1014
# verify that files are stored in pmemfile pool:
$ ls -l /tmp/mountpoint/
total 0
$ ls -l /tmp/mountpoint/dir_in_pmemfile
ls: cannot access '/tmp/mountpoint/dir_in_pmemfile': No such file or directory

Limitations:

  • libpmemfile[-posix].so does not support multiple processes accessing the pool (libpmemobj limitation)
  • libpmemfile.so supports Linux only (other UNIX-like systems could be supported)
  • libpmemfile.so supports x86_64 only (libsyscall_intercept, libpmem and libpmemobj limitation)
  • libpmemfile.so is not safe with remotely replicated pool (libpmemfile-posix.so has no such limitation)

Debugging:

Environment variables:

libsyscall_intercept.so:

  • INTERCEPT_LOG - log file for all intercepted syscalls (default: none)
  • INTERCEPT_LOG_TRUNC - when set to 0, the above log file is not truncated (default: 1)
  • INTERCEPT_HOOK_CMDLINE_FILTER - intercept syscalls only when process name matches this variable (used to skip gdb from intercepting) (default: empty)

libpmemobj.so:

  • PMEMOBJ_LOG_FILE - log file (default: none)
  • PMEMOBJ_LOG_LEVEL - logging level (default: 0)

libpmemfile-posix.so:

  • PMEMFILE_POSIX_LOG_FILE - log file (default: none)
  • PMEMFILE_POSIX_LOG_LEVEL - logging level (default: 0)

libpmemfile.so:

  • PMEMFILE_PRELOAD_LOG - log file (default: none)
  • PMEMFILE_PRELOAD_LOG_TRUNC - when set to 0, the above log file is not truncated (default: 1)
  • PMEMFILE_EXIT_ON_NOT_SUPPORTED - when set to 1, aborts an application which uses unsupported syscall (default: 0)
  • PMEMFILE_PRELOAD_PAUSE_AT_START - pauses initialization of pmemfile until debugger is attached (default: 0)

Other variables:

  • PMEMFILE_BLOCK_SIZE - forces one block size (default: dynamic)
  • PMEMFILE_CD - performs early chdir() to specified directory, used as a workaround for missing multi-process support when application must start from pmemfile-backed directory (default: none)
  • PMEMFILE_IGNORE_INODE_FREE_ERRORS - when set to 1, disables abort() when freeing inode's metadata fails (it defers freeing to the next application start) - can be used to get out of out-of-space situations (default: 0)
  • PMEMFILE_OVERALLOCATE_ON_APPEND - when set to 0, disables allocation of more space than required (default: 1)
  • PMEMFILE_PRELOAD_PROCESS_SWITCHING - when set to 1, enables VERY slow emulation of multi-process support, used for testing pmemfile with file system test suites (default: 0)
  • PMEMFILE_PRELOAD_VALIDATE_POINTERS - when set to 1, verifies memory reaching libpmemfile through syscall arguments is accessible; it's very slow, so it should never be used in production for non-buggy applications

Other stuff

pmemfile's People

Contributors

gbuella avatar igchor avatar krzycz avatar ldorau avatar marcinslusarz avatar mramotowski avatar mslusarz avatar szadam avatar szychows avatar wlemkows avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pmemfile's Issues

fcntl: setting FD_CLOEXEC flag with F_SETFD returns ENOTSUP

found on e7cde04

reproduction:

test.c

int fd = open("myfile", O_WRONLY | O_CREAT | O_TRUNC, 0666);
int ret = fcntl(fd, F_SETFD, FD_CLOEXEC);

$ pf INTERCEPT_LOG=intercept.log ./test

intercept.log fragment:
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("myfile", O_WRONLY | O_CREAT | O_TRUNC, 0666) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("myfile", O_WRONLY | O_CREAT | O_TRUNC, 0666) = 5
/lib/x86_64-linux-gnu/libc.so.6 0xf6b05 -- fcntl(5, 2 (F_SETFD), 2) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6b05 -- fcntl(5, 2 (F_SETFD), 2) = -95

found cause:
in libpmemfile-posix/fcntl.c:pmemfile_fcntl(): no appropriate return statement inside 'case PMEMFILE_F_SETFD:' in switch(cmd) instruction.

make - error when trying to build pmem file

Found on 0ed593b

cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DDEVELOPER_MODE=1 -DTEST_DIR=/mnt/pmem -DTRACE_TESTS=1 -DLONG_TESTS=1 -DTESTS_USE_FORCED_PMEM=1

/home/mramotow/repos/pmemfile/pmemfile/src/libpmemfile/preload.c: In function ‘pmemfile_preload_constructor’:
/home/mramotow/repos/pmemfile/pmemfile/src/libpmemfile/preload.c:263:7: error: implicit declaration of function ‘syscall_hook_in_process_allowed’ [-Werror=implicit-function-declaration]
if (!syscall_hook_in_process_allowed())
^
cc1: all warnings being treated as errors
src/libpmemfile/CMakeFiles/pmemfile_o.dir/build.make:86: recipe for target 'src/libpmemfile/CMakeFiles/pmemfile_o.dir/preload.c.o' failed
make[2]: *** [src/libpmemfile/CMakeFiles/pmemfile_o.dir/preload.c.o] Error 1
CMakeFiles/Makefile2:813: recipe for target 'src/libpmemfile/CMakeFiles/pmemfile_o.dir/all' failed
make[1]: *** [src/libpmemfile/CMakeFiles/pmemfile_o.dir/all] Error 2
Makefile:138: recipe for target 'all' failed
make: *** [all] Error 2

touch returns '1' on exit, even when succeeded

dup2 seems to cause the problem, file is created, however touch 'newfile' returns 1

[szychows@vmmalloc-70-233 mountpoint]$ export PMEMFILE_PRELOAD_LOG=pmemfile_preload.log
[szychows@vmmalloc-70-233 mountpoint]$ export INTERCEPT_LOG=intercept.log
[szychows@vmmalloc-70-233 mountpoint]$ alias pf='LD_PRELOAD=libpmemfile.so PMEMFILE_POOLS=/tmp/mountpoint:/mnt/pmemfile/pool'
[szychows@vmmalloc-70-233 mountpoint]$ pf touch newfile
touch: cannot touch 'newfile': Operation not supported
[szychows@vmmalloc-70-233 mountpoint]$ cat intercept.log 
tempfile=$(mktemp) ; tempfile2=$(mktemp) ; grep "^/" $0 | cut -d " " -f 1,2 | sed "s/^/addr2line -p -f -e /" > $tempfile ; { echo ; . $tempfile ; echo ; } > $tempfile2 ; paste $tempfile2 $0 ; exit 0
/lib64/libc.so.6 0xf84c8 -- getcwd("x\x91!", 1024) = ?
/lib64/libc.so.6 0xf84c8 -- getcwd("/tmp/mountpoint", 1024) = 16
/lib64/libc.so.6 0xf7553 -- stat("/tmp/mountpoint", 0x7ffe266f5070) = ?
/lib64/libc.so.6 0xf7553 -- stat("/tmp/mountpoint", 0x7ffe266f5070) = 0
/lib64/libc.so.6 0xf79ae -- open("/mnt/pmemfile/pool", O_RDONLY, 00) = ?
/lib64/libc.so.6 0xf79ae -- open("/mnt/pmemfile/pool", O_RDONLY, 00) = 6
/lib64/libc.so.6 0xf75a2 -- fstat(6, 0x7ffe266f2e00) = ?
/lib64/libc.so.6 0xf75a2 -- fstat(6, 0x7ffe266f2e00) = 0
/lib64/libc.so.6 0xf825e -- close(6) = ?
/lib64/libc.so.6 0xf825e -- close(6) = 0
/lib64/libc.so.6 0xf79ae -- open("/mnt/pmemfile/pool", O_RDONLY, 00) = ?
/lib64/libc.so.6 0xf79ae -- open("/mnt/pmemfile/pool", O_RDONLY, 00) = 6
/lib64/libc.so.6 0xf8115 -- flock(6, 6) = ?
/lib64/libc.so.6 0xf8115 -- flock(6, 6) = 0
/lib64/libc.so.6 0xf79ae -- open("/mnt/pmemfile/pool", O_RDONLY, 00) = ?
/lib64/libc.so.6 0xf79ae -- open("/mnt/pmemfile/pool", O_RDONLY, 00) = 7
/lib64/libc.so.6 0xf75a2 -- fstat(7, 0x7ffe266f2d30) = ?
/lib64/libc.so.6 0xf75a2 -- fstat(7, 0x7ffe266f2d30) = 0
/lib64/libc.so.6 0xf825e -- close(7) = ?
/lib64/libc.so.6 0xf825e -- close(7) = 0
/lib64/libc.so.6 0xf7553 -- stat("/mnt/pmemfile/pool", 0x7ffe266f4e10) = ?
/lib64/libc.so.6 0xf7553 -- stat("/mnt/pmemfile/pool", 0x7ffe266f4e10) = 0
/lib64/libc.so.6 0xf7bce -- read(6, "", 11) = ?
/lib64/libc.so.6 0xf7bce -- read(6, "PMEMOBJ\0\x03\0\0", 11) = 11
/lib64/libc.so.6 0xf825e -- close(6) = ?
/lib64/libc.so.6 0xf825e -- close(6) = 0
/lib64/libc.so.6 0xf79ae -- open("/mnt/pmemfile/pool", O_RDONLY, 023) = ?
/lib64/libc.so.6 0xf79ae -- open("/mnt/pmemfile/pool", O_RDONLY, 023) = 6
/lib64/libc.so.6 0xf75a2 -- fstat(6, 0x7ffe266f2dd0) = ?
/lib64/libc.so.6 0xf75a2 -- fstat(6, 0x7ffe266f2dd0) = 0
/lib64/libc.so.6 0xf825e -- close(6) = ?
/lib64/libc.so.6 0xf825e -- close(6) = 0
/lib64/libc.so.6 0xf7c85 -- access("/mnt/pmemfile/pool", 0) = ?
/lib64/libc.so.6 0xf7c85 -- access("/mnt/pmemfile/pool", 0) = 0
/lib64/libc.so.6 0xf79ae -- open("/mnt/pmemfile/pool", O_RDWR, 040000000) = ?
/lib64/libc.so.6 0xf79ae -- open("/mnt/pmemfile/pool", O_RDWR, 040000000) = 6
/lib64/libc.so.6 0xf8115 -- flock(6, 6) = ?
/lib64/libc.so.6 0xf8115 -- flock(6, 6) = 0
/lib64/libc.so.6 0xf79ae -- open("/mnt/pmemfile/pool", O_RDONLY, 040000000) = ?
/lib64/libc.so.6 0xf79ae -- open("/mnt/pmemfile/pool", O_RDONLY, 040000000) = 7
/lib64/libc.so.6 0xf75a2 -- fstat(7, 0x7ffe266f2d20) = ?
/lib64/libc.so.6 0xf75a2 -- fstat(7, 0x7ffe266f2d20) = 0
/lib64/libc.so.6 0xf825e -- close(7) = ?
/lib64/libc.so.6 0xf825e -- close(7) = 0
/lib64/libc.so.6 0xf7553 -- stat("/mnt/pmemfile/pool", 0x7ffe266f4e00) = ?
/lib64/libc.so.6 0xf7553 -- stat("/mnt/pmemfile/pool", 0x7ffe266f4e00) = 0
/lib64/libc.so.6 0x101dd8 -- mmap(0x0, 1075838976, 1, 34, -1, 0x0) = ?
/lib64/libc.so.6 0x101dd8 -- mmap(0x0, 1075838976, 1, 34, -1, 0x0) = 140318821756928
/lib64/libc.so.6 0x101e65 -- munmap(0x7f9e8586b000, 1075838976) = ?
/lib64/libc.so.6 0x101e65 -- munmap(0x7f9e8586b000, 1075838976) = 0
/lib64/libc.so.6 0x101dd8 -- mmap(0x7f9e85a00000, 1073741824, 3, 1, 6, 0x0) = ?
/lib64/libc.so.6 0x101dd8 -- mmap(0x7f9e85a00000, 1073741824, 3, 1, 6, 0x0) = 140318823415808
/lib64/libc.so.6 0x101dd8 -- mmap(0x0, 4096, 3, 1, 6, 0x0) = ?
/lib64/libc.so.6 0x101dd8 -- mmap(0x0, 4096, 3, 1, 6, 0x0) = 140319928602624
/lib64/libc.so.6 0xf79ae -- open("/proc/self/exe", O_RDONLY, 010) = ?
/lib64/libc.so.6 0xf79ae -- open("/proc/self/exe", O_RDONLY, 010) = 7
/lib64/libc.so.6 0xf7bce -- read(7, "", 64) = ?
/lib64/libc.so.6 0xf7bce -- read(7, "\x7fELF\x02\x01\x01\0\0\0\0\0\0\0\0\0\x03\0>\0\x01\0\0\0@5\0\0\0\0\0\0@\0\0\0\0\0\0\0\xd0\t\x01\0\0\0\0\0\0\0\0\0@\08\0\t\0...", 64) = 64
/lib64/libc.so.6 0xf825e -- close(7) = ?
/lib64/libc.so.6 0xf825e -- close(7) = 0
/lib64/libc.so.6 0x101e65 -- munmap(0x7f9ec77fd000, 4096) = ?
/lib64/libc.so.6 0x101e65 -- munmap(0x7f9ec77fd000, 4096) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a01000, 2064, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a01000, 2064, 4) = 0
/lib64/libc.so.6 0xfd657 -- brk(94524156489728) = ?
/lib64/libc.so.6 0xfd657 -- brk(94524156489728) = 94524156489728
/lib64/libc.so.6 0x10607f -- open("/sys/devices/system/cpu/online", O_RDONLY | O_CLOEXEC, 0200000) = ?
/lib64/libc.so.6 0x10607f -- open("/sys/devices/system/cpu/online", O_RDONLY | O_CLOEXEC, 0200000) = 7
/lib64/libc.so.6 0x105eae -- read(7, "", 8192) = ?
/lib64/libc.so.6 0x105eae -- read(7, "0-3\n", 8192) = 4
/lib64/libc.so.6 0x106241 -- close(7) = ?
/lib64/libc.so.6 0x106241 -- close(7) = 0
/lib64/libc.so.6 0xfd657 -- brk(94524156624896) = ?
/lib64/libc.so.6 0xfd657 -- brk(94524156624896) = 94524156624896
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 32, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 32, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 24, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 24, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85d02000, 1104, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85d02000, 1104, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2896, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2896, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 24, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 24, 4) = 0
/lib64/libc.so.6 0xf825e -- close(6) = ?
/lib64/libc.so.6 0xf825e -- close(6) = 0
/lib64/libc.so.6 0xfd657 -- brk(94524156760064) = ?
/lib64/libc.so.6 0xfd657 -- brk(94524156760064) = 94524156760064
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85d02000, 1176, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85d02000, 1176, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85d02000, 1104, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85d02000, 1104, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 2360320, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 2360320, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 1040, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 1040, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 32, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 32, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 24, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 24, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85d02000, 1104, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85d02000, 1104, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2896, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2896, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 24, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 24, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 5152, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 5152, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 1056, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 1056, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85db8000, 5584, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85db8000, 5584, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 5152, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 5152, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 1040, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 1040, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 1040, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 1040, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = 0
/lib64/libc.so.6 0x2ca2d -- open("/usr/lib/locale/locale-archive", O_RDONLY | O_CLOEXEC, 00) = ?
/lib64/libc.so.6 0x2ca2d -- open("/usr/lib/locale/locale-archive", O_RDONLY | O_CLOEXEC, 00) = 6
/lib64/libc.so.6 0xf75a2 -- fstat(6, 0x7f9ec7041940) = ?
/lib64/libc.so.6 0xf75a2 -- fstat(6, 0x7f9ec7041940) = 0
/lib64/libc.so.6 0x101dd8 -- mmap(0x0, 112823232, 1, 2, 6, 0x0) = ?
/lib64/libc.so.6 0x101dd8 -- mmap(0x0, 112823232, 1, 2, 6, 0x0) = 140318710591488
/lib64/libc.so.6 0x2cadf -- close(6) = ?
/lib64/libc.so.6 0x2cadf -- close(6) = 0
/lib64/libc.so.6 0xf79ae -- open("newfile", O_WRONLY | O_CREAT | O_NOCTTY | O_NONBLOCK, 0666) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85db9000, 1552, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85db9000, 1552, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 32, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 32, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 24, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 24, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85d82000, 1080, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85d82000, 1080, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2224, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2224, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 24, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 24, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 1080, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 1080, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 1056, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 1056, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 1112, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 1112, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 1096, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 1096, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85db7000, 1488, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85db7000, 1488, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85db7000, 2104, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85db7000, 2104, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85db9000, 5696, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85db9000, 5696, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 1112, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 1112, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2224, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2224, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 1040, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 1040, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 1040, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 1040, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = 0
/lib64/libc.so.6 0xf79ae -- open("newfile", O_WRONLY | O_CREAT | O_NOCTTY | O_NONBLOCK, 0666) = 6
/lib64/libc.so.6 0xf82e5 -- dup2(6, 0) = ?
/lib64/libc.so.6 0xf82e5 -- dup2(6, 0) = -95
/lib64/libc.so.6 0xf825e -- close(6) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 1040, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85dc2000, 1040, 4) = 0
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = ?
/lib64/libc.so.6 0x101ece -- msync(0x7f9e85a02000, 2056, 4) = 0
/lib64/libc.so.6 0xf825e -- close(6) = 0
/lib64/libc.so.6 0xfc3a0 -- utimensat(-100, "newfile", 0x0, 0) = ?
/lib64/libc.so.6 0xfc3a0 -- utimensat(-100, "newfile", 0x0, 0) = -2
/lib64/libc.so.6 0x7bc78 -- open("/usr/share/locale/locale.alias", O_RDONLY | O_CLOEXEC, 0666) = ?
/lib64/libc.so.6 0x7bc78 -- open("/usr/share/locale/locale.alias", O_RDONLY | O_CLOEXEC, 0666) = 6
/lib64/libc.so.6 0xf75a2 -- fstat(6, 0x7ffe266f4da0) = ?
/lib64/libc.so.6 0xf75a2 -- fstat(6, 0x7ffe266f4da0) = 0
/lib64/libc.so.6 0x7b166 -- read(6, "", 4096) = ?
/lib64/libc.so.6 0x7b166 -- read(6, "# Locale name alias data base.\n# Copyright (C) 1996-2016 Free Software Foundation, Inc.\n#\n# This program is free softwa...", 4096) = 2997
/lib64/libc.so.6 0x7b166 -- read(6, "", 4096) = ?
/lib64/libc.so.6 0x7b166 -- read(6, "", 4096) = 0
/lib64/libc.so.6 0x7a0c9 -- close(6) = ?
/lib64/libc.so.6 0x7a0c9 -- close(6) = 0
/lib64/libc.so.6 0x30bfe -- open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/coreutils.mo", O_RDONLY, 03771730737476600) = ?
/lib64/libc.so.6 0x30bfe -- open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/coreutils.mo", O_RDONLY, 03771730737476600) = -2
/lib64/libc.so.6 0x30bfe -- open("/usr/share/locale/en_US.utf8/LC_MESSAGES/coreutils.mo", O_RDONLY, 03771730737476600) = ?
/lib64/libc.so.6 0x30bfe -- open("/usr/share/locale/en_US.utf8/LC_MESSAGES/coreutils.mo", O_RDONLY, 03771730737476600) = -2
/lib64/libc.so.6 0x30bfe -- open("/usr/share/locale/en_US/LC_MESSAGES/coreutils.mo", O_RDONLY, 03771730737476600) = ?
/lib64/libc.so.6 0x30bfe -- open("/usr/share/locale/en_US/LC_MESSAGES/coreutils.mo", O_RDONLY, 03771730737476600) = -2
/lib64/libc.so.6 0x30bfe -- open("/usr/share/locale/en.UTF-8/LC_MESSAGES/coreutils.mo", O_RDONLY, 03771730737476600) = ?
/lib64/libc.so.6 0x30bfe -- open("/usr/share/locale/en.UTF-8/LC_MESSAGES/coreutils.mo", O_RDONLY, 03771730737476600) = -2
/lib64/libc.so.6 0x30bfe -- open("/usr/share/locale/en.utf8/LC_MESSAGES/coreutils.mo", O_RDONLY, 03771730737476600) = ?
/lib64/libc.so.6 0x30bfe -- open("/usr/share/locale/en.utf8/LC_MESSAGES/coreutils.mo", O_RDONLY, 03771730737476600) = -2
/lib64/libc.so.6 0x30bfe -- open("/usr/share/locale/en/LC_MESSAGES/coreutils.mo", O_RDONLY, 03771730737476600) = ?
/lib64/libc.so.6 0x30bfe -- open("/usr/share/locale/en/LC_MESSAGES/coreutils.mo", O_RDONLY, 03771730737476600) = -2
/lib64/libc.so.6 0xf7c2e -- write(2, "touch: ", 7) = ?
/lib64/libc.so.6 0xf7c2e -- write(2, "touch: ", 7) = 7
/lib64/libc.so.6 0xf7c2e -- write(2, "cannot touch 'newfile'", 22) = ?
/lib64/libc.so.6 0xf7c2e -- write(2, "cannot touch 'newfile'", 22) = 22
/lib64/libc.so.6 0x30bfe -- open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY, 03771730737476600) = ?
/lib64/libc.so.6 0x30bfe -- open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY, 03771730737476600) = -2
/lib64/libc.so.6 0x30bfe -- open("/usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo", O_RDONLY, 03771730737476600) = ?
/lib64/libc.so.6 0x30bfe -- open("/usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo", O_RDONLY, 03771730737476600) = -2
/lib64/libc.so.6 0x30bfe -- open("/usr/share/locale/en_US/LC_MESSAGES/libc.mo", O_RDONLY, 03771730737476600) = ?
/lib64/libc.so.6 0x30bfe -- open("/usr/share/locale/en_US/LC_MESSAGES/libc.mo", O_RDONLY, 03771730737476600) = -2
/lib64/libc.so.6 0x30bfe -- open("/usr/share/locale/en.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY, 03771730737476600) = ?
/lib64/libc.so.6 0x30bfe -- open("/usr/share/locale/en.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY, 03771730737476600) = -2
/lib64/libc.so.6 0x30bfe -- open("/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo", O_RDONLY, 03771730737476600) = ?
/lib64/libc.so.6 0x30bfe -- open("/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo", O_RDONLY, 03771730737476600) = -2
/lib64/libc.so.6 0x30bfe -- open("/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY, 03771730737476600) = ?
/lib64/libc.so.6 0x30bfe -- open("/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY, 03771730737476600) = -2
/lib64/libc.so.6 0xf7c2e -- write(2, ": Operation not supported", 25) = ?
/lib64/libc.so.6 0xf7c2e -- write(2, ": Operation not supported", 25) = 25
/lib64/libc.so.6 0xf7c2e -- write(2, "\n", 1) = ?
/lib64/libc.so.6 0xf7c2e -- write(2, "\n", 1) = 1
/lib64/libc.so.6 0x7a0c9 -- close(1) = ?
/lib64/libc.so.6 0x7a0c9 -- close(1) = 0
/lib64/libc.so.6 0x7a0c9 -- close(2) = ?
/lib64/libc.so.6 0x7a0c9 -- close(2) = 0
/lib64/libc.so.6 0xccc66 -- exit_group(1)
[szychows@vmmalloc-70-233 mountpoint]$ cat pmemfile_preload.log 
hook_openat("/usr/lib/locale/locale-archive")
hook_openat("newfile")
pmemfile_openat(0x55f81ec11040, 0xffffffffffffffff, "newfile", 0x141, 438) = 0x55f81ec75410
pmemfile_close(0x55f81ec11040, 0x55f81ec75410) = 0
hook_openat("/usr/share/locale/locale.alias")
hook_openat("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/coreutils.mo")
hook_openat("/usr/share/locale/en_US.utf8/LC_MESSAGES/coreutils.mo")
hook_openat("/usr/share/locale/en_US/LC_MESSAGES/coreutils.mo")
hook_openat("/usr/share/locale/en.UTF-8/LC_MESSAGES/coreutils.mo")
hook_openat("/usr/share/locale/en.utf8/LC_MESSAGES/coreutils.mo")
hook_openat("/usr/share/locale/en/LC_MESSAGES/coreutils.mo")
hook_openat("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/libc.mo")
hook_openat("/usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo")
hook_openat("/usr/share/locale/en_US/LC_MESSAGES/libc.mo")
hook_openat("/usr/share/locale/en.UTF-8/LC_MESSAGES/libc.mo")
hook_openat("/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo")
hook_openat("/usr/share/locale/en/LC_MESSAGES/libc.mo")


preload: reentrancy issue

When libc, while holding a global lock, invokes some syscall and in response to this syscall we are calling back into the same function in libc, libc tries to take the same lock, which leads to deadlock.

This can happen when pmemobj wants to format an error message (strerror, which requires opening translation file) while we service opening any translation file.

Functionality we probably won't ever support

This issue lists features we currently don't plan to support. If you want to discuss support for any of them please file separate issue and remove it from here.

Almost definitely not:

  • O_ASYNC flag for open
  • mandatory locking
  • signal management using fcntl (F_GETOWN, F_SETOWN, F_GETOWN_EX, F_SETOWN_EX, F_GETSIG, F_SETSIG)
  • RENAME_WHITEOUT flag for renameat2

Probably not:

  • dnotify (F_NOTIFY flag for fctnl)
  • inotify
  • fanotify
  • leases (F_SETLEASE, F_GETLEASE flags for fcntl)
  • file sealing (F_ADD_SEALS, F_GET_SEALS flags for fcntl)
  • select / pselect / poll / ppoll / epoll

Compilation fatal error: attr/xattr.h: No such file or directory (Fedora 24)

On Fedora 24:

$ make
....
[ 93%] Building C object tests/preload/CMakeFiles/preload_xattr.dir/xattr/xattr.c.o
/home/ldorau/work/pmemfile/tests/preload/xattr/xattr.c:50:24: fatal error: attr/xattr.h: No such file or directory
 #include <attr/xattr.h>
                        ^
compilation terminated.
tests/preload/CMakeFiles/preload_xattr.dir/build.make:62: recipe for target 'tests/preload/CMakeFiles/preload_xattr.dir/xattr/xattr.c.o' failed
make[2]: *** [tests/preload/CMakeFiles/preload_xattr.dir/xattr/xattr.c.o] Error 1
CMakeFiles/Makefile2:3341: recipe for target 'tests/preload/CMakeFiles/preload_xattr.dir/all' failed
make[1]: *** [tests/preload/CMakeFiles/preload_xattr.dir/all] Error 2
Makefile:138: recipe for target 'all' failed
make: *** [all] Error 2

Replace clang-format with a more appropriate tool

The clang-format tool is meant to format code, and not for checking the style of existing code.
Such errors are rather annoying:

Style check using /usr/bin/clang-format for file /home/tej/code/pmemfile/tests/posix/stat/stat.cpp failed
@@ -164,9 +164,9 @@

 TEST_F(stat_test, stat_big_file)
 {
-	PMEMfile *f = pmemfile_open(pfp, "/file1", PMEMFILE_O_CREAT |
-					    PMEMFILE_O_EXCL | PMEMFILE_O_WRONLY,
-				    0644);
+	PMEMfile *f = pmemfile_open(
+		pfp, "/file1",
+		PMEMFILE_O_CREAT | PMEMFILE_O_EXCL | PMEMFILE_O_WRONLY, 0644);
 	ASSERT_NE(f, nullptr) << strerror(errno);

This seems to be because clang-format 4.0 differs somewhat from clang-format 3.8

chmod does not work probably fchmodat is resposinble

export INTERCEPT_LOG=intercept.log
export PMEMFILE_PRELOAD_LOG=pmemfile_preload.log
export PMEMFILECORE_LOG_LEVEL=4
export PMEMFILECORE_LOG_FILE=pmemfile-core.log
export PMEM_IS_PMEM_FORCE=1
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libpmemfile.so PMEMFILE_POOLS=/tmp/mountpoint:/mnt/pmem/pmemfile_pool chmod o+w testdir

mramotow@mramotow:/tmp/mountpoint$ cat pmemfile_preload.log
hook_openat("/usr/lib/locale/locale-archive")
pmemfile_fchmodat(0xcb9040, 0xffffffffffffffff, "testdir", 0777, 960) = -95
hook_openat("/usr/share/locale/locale.alias")
hook_openat("/usr/share/locale/en_US/LC_MESSAGES/coreutils.mo")
hook_openat("/usr/share/locale/en/LC_MESSAGES/coreutils.mo")
hook_openat("/usr/share/locale-langpack/en_US/LC_MESSAGES/coreutils.mo")
hook_openat("/usr/share/locale-langpack/en/LC_MESSAGES/coreutils.mo")
hook_openat("/usr/share/locale/en_US/LC_MESSAGES/libc.mo")
hook_openat("/usr/share/locale/en/LC_MESSAGES/libc.mo")
hook_openat("/usr/share/locale-langpack/en_US/LC_MESSAGES/libc.mo")
hook_openat("/usr/share/locale-langpack/en/LC_MESSAGES/libc.mo")

mramotow@mramotow:/tmp/mountpoint$ cat intercept.log
tempfile=$(mktemp) ; tempfile2=$(mktemp) ; grep "^/" $0 | cut -d " " -f 1,2 | sed "s/^/addr2line -p -f -e /" > $tempfile ; { echo ; . $tempfile ; echo ; } > $tempfile2 ; paste $tempfile2 $0 ; exit 0
/lib/x86_64-linux-gnu/libc.so.6 0xf6f78 -- getcwd("0\x1c", 1024) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6f78 -- getcwd("/tmp/mountpoint", 1024) = 16
/lib/x86_64-linux-gnu/libc.so.6 0xf6003 -- stat("/tmp/mountpoint", 0x7fffa4063280) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6003 -- stat("/tmp/mountpoint", 0x7fffa4063280) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/mnt/pmem/pmemfile_pool", O_RDONLY, 00) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/mnt/pmem/pmemfile_pool", O_RDONLY, 00) = 6
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(6, 0x7fffa4061000) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(6, 0x7fffa4061000) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(6) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(6) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/mnt/pmem/pmemfile_pool", O_RDONLY, 00) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/mnt/pmem/pmemfile_pool", O_RDONLY, 00) = 6
/lib/x86_64-linux-gnu/libc.so.6 0xf6bc5 -- flock(6, 6) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6bc5 -- flock(6, 6) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/mnt/pmem/pmemfile_pool", O_RDONLY, 00) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/mnt/pmem/pmemfile_pool", O_RDONLY, 00) = 7
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(7, 0x7fffa4060f20) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(7, 0x7fffa4060f20) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(7) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(7) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf6003 -- stat("/mnt/pmem/pmemfile_pool", 0x7fffa4063010) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6003 -- stat("/mnt/pmem/pmemfile_pool", 0x7fffa4063010) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf667e -- read(6, "", 11) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf667e -- read(6, "PMEMOBJ\0\x03\0\0", 11) = 11
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(6) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(6) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/mnt/pmem/pmemfile_pool", O_RDONLY, 00) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/mnt/pmem/pmemfile_pool", O_RDONLY, 00) = 6
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(6, 0x7fffa4060fd0) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(6, 0x7fffa4060fd0) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(6) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(6) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf6735 -- access("/mnt/pmem/pmemfile_pool", 0) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6735 -- access("/mnt/pmem/pmemfile_pool", 0) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/mnt/pmem/pmemfile_pool", O_RDWR, 040000000) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/mnt/pmem/pmemfile_pool", O_RDWR, 040000000) = 6
/lib/x86_64-linux-gnu/libc.so.6 0xf6bc5 -- flock(6, 6) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6bc5 -- flock(6, 6) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/mnt/pmem/pmemfile_pool", O_RDONLY, 040000000) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/mnt/pmem/pmemfile_pool", O_RDONLY, 040000000) = 7
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(7, 0x7fffa4060f20) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(7, 0x7fffa4060f20) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(7) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(7) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf6003 -- stat("/mnt/pmem/pmemfile_pool", 0x7fffa4063010) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6003 -- stat("/mnt/pmem/pmemfile_pool", 0x7fffa4063010) = 0
/lib/x86_64-linux-gnu/libc.so.6 0x100ac8 -- mmap(0x0, 1075838976, 1, 34, -1, 0x0) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x100ac8 -- mmap(0x0, 1075838976, 1, 34, -1, 0x0) = 139661131579392
/lib/x86_64-linux-gnu/libc.so.6 0x100b55 -- munmap(0x7f0564230000, 1075838976) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x100b55 -- munmap(0x7f0564230000, 1075838976) = 0
/lib/x86_64-linux-gnu/libc.so.6 0x100ac8 -- mmap(0x7f0564400000, 1073741824, 3, 1, 6, 0x0) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x100ac8 -- mmap(0x7f0564400000, 1073741824, 3, 1, 6, 0x0) = 139661133479936
/lib/x86_64-linux-gnu/libc.so.6 0x100ac8 -- mmap(0x0, 4096, 3, 1, 6, 0x0) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x100ac8 -- mmap(0x0, 4096, 3, 1, 6, 0x0) = 139662238748672
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/proc/self/exe", O_RDONLY, 010) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/proc/self/exe", O_RDONLY, 010) = 7
/lib/x86_64-linux-gnu/libc.so.6 0xf667e -- read(7, "", 64) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf667e -- read(7, "\x7fELF\x02\x01\x01\0\0\0\0\0\0\0\0\0\x02\0>\0\x01\0\0\0\x80&@\0\0\0\0\0@\0\0\0\0\0\0\0\xf0\xd3\0\0\0\0\0\0\0\0\0\0@\08\0\t...", 64) = 64
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(7) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(7) = 0
/lib/x86_64-linux-gnu/libc.so.6 0x100b55 -- munmap(0x7f05a6211000, 4096) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x100b55 -- munmap(0x7f05a6211000, 4096) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xfc227 -- brk(13611008) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xfc227 -- brk(13611008) = 13611008
/lib/x86_64-linux-gnu/libc.so.6 0x104daf -- open("/sys/devices/system/cpu/online", O_RDONLY | O_CLOEXEC, 0200000) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x104daf -- open("/sys/devices/system/cpu/online", O_RDONLY | O_CLOEXEC, 0200000) = 7
/lib/x86_64-linux-gnu/libc.so.6 0x104bd6 -- read(7, "", 8192) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x104bd6 -- read(7, "0-7\n", 8192) = 4
/lib/x86_64-linux-gnu/libc.so.6 0x104e65 -- close(7) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x104e65 -- close(7) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xfc227 -- brk(13746176) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xfc227 -- brk(13746176) = 13746176
/lib/x86_64-linux-gnu/libc.so.6 0xfc227 -- brk(13881344) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xfc227 -- brk(13881344) = 13881344
/lib/x86_64-linux-gnu/libc.so.6 0xfc227 -- brk(14016512) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xfc227 -- brk(14016512) = 14016512
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(6) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(6) = 0
/lib/x86_64-linux-gnu/libc.so.6 0x2c7d1 -- open("/usr/lib/locale/locale-archive", O_RDONLY | O_CLOEXEC, 00) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x2c7d1 -- open("/usr/lib/locale/locale-archive", O_RDONLY | O_CLOEXEC, 00) = 6
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(6, 0x7f05a5a0f980) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(6, 0x7f05a5a0f980) = 0
/lib/x86_64-linux-gnu/libc.so.6 0x100ac8 -- mmap(0x0, 4228736, 1, 2, 6, 0x0) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x100ac8 -- mmap(0x0, 4228736, 1, 2, 6, 0x0) = 139661129248768
/lib/x86_64-linux-gnu/libc.so.6 0x2c876 -- close(6) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x2c876 -- close(6) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf62f5 -- umask(00) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf62f5 -- umask(00) = 2
/lib/x86_64-linux-gnu/libc.so.6 0xf6003 -- stat("testdir", 0xd4d588) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6003 -- stat("testdir", 0xd4d588) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf6397 -- fchmodat(-100, "testdir", 0777, 960) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6397 -- fchmodat(-100, "testdir", 0777, 960) = -95
/lib/x86_64-linux-gnu/libc.so.6 0x79a5d -- open("/usr/share/locale/locale.alias", O_RDONLY | O_CLOEXEC, 0666) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x79a5d -- open("/usr/share/locale/locale.alias", O_RDONLY | O_CLOEXEC, 0666) = 6
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(6, 0x7fffa4062fd0) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(6, 0x7fffa4062fd0) = 0
/lib/x86_64-linux-gnu/libc.so.6 0x791ac -- read(6, "", 4096) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x791ac -- read(6, "# Locale name alias data base.\n# Copyright (C) 1996-2016 Free Software Foundation, Inc.\n#\n# This program is free softwa...", 4096) = 2995
/lib/x86_64-linux-gnu/libc.so.6 0x791ac -- read(6, "", 4096) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x791ac -- read(6, "", 4096) = 0
/lib/x86_64-linux-gnu/libc.so.6 0x78349 -- close(6) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x78349 -- close(6) = 0
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale/en_US/LC_MESSAGES/coreutils.mo", O_RDONLY, 03760264607743600) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale/en_US/LC_MESSAGES/coreutils.mo", O_RDONLY, 03760264607743600) = -2
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale/en/LC_MESSAGES/coreutils.mo", O_RDONLY, 03760264607743600) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale/en/LC_MESSAGES/coreutils.mo", O_RDONLY, 03760264607743600) = -2
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale-langpack/en_US/LC_MESSAGES/coreutils.mo", O_RDONLY, 03760264607743600) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale-langpack/en_US/LC_MESSAGES/coreutils.mo", O_RDONLY, 03760264607743600) = -2
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale-langpack/en/LC_MESSAGES/coreutils.mo", O_RDONLY, 03760264607743600) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale-langpack/en/LC_MESSAGES/coreutils.mo", O_RDONLY, 03760264607743600) = 6
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(6, 0x7fffa4063310) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(6, 0x7fffa4063310) = 0
/lib/x86_64-linux-gnu/libc.so.6 0x100ac8 -- mmap(0x0, 619, 1, 2, 6, 0x0) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x100ac8 -- mmap(0x0, 619, 1, 2, 6, 0x0) = 139662238748672
/lib/x86_64-linux-gnu/libc.so.6 0x30b0c -- close(6) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x30b0c -- close(6) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf66de -- write(2, "chmod: ", 7) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf66de -- write(2, "chmod: ", 7) = 7
/lib/x86_64-linux-gnu/libc.so.6 0xf66de -- write(2, "changing permissions of 'testdir'", 33) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf66de -- write(2, "changing permissions of 'testdir'", 33) = 33
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale/en_US/LC_MESSAGES/libc.mo", O_RDONLY, 03760264607743600) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale/en_US/LC_MESSAGES/libc.mo", O_RDONLY, 03760264607743600) = -2
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY, 03760264607743600) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY, 03760264607743600) = -2
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale-langpack/en_US/LC_MESSAGES/libc.mo", O_RDONLY, 03760264607743600) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale-langpack/en_US/LC_MESSAGES/libc.mo", O_RDONLY, 03760264607743600) = -2
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale-langpack/en/LC_MESSAGES/libc.mo", O_RDONLY, 03760264607743600) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale-langpack/en/LC_MESSAGES/libc.mo", O_RDONLY, 03760264607743600) = -2
/lib/x86_64-linux-gnu/libc.so.6 0xf66de -- write(2, ": Operation not supported", 25) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf66de -- write(2, ": Operation not supported", 25) = 25
/lib/x86_64-linux-gnu/libc.so.6 0xf66de -- write(2, "\n", 1) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf66de -- write(2, "\n", 1) = 1
/lib/x86_64-linux-gnu/libc.so.6 0x78349 -- close(1) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x78349 -- close(1) = 0
/lib/x86_64-linux-gnu/libc.so.6 0x78349 -- close(2) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x78349 -- close(2) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xcbb96 -- exit_group(1)

Ninja builds fail

The way gtest is added in tests/posix/CMakeLists.txt works well with makefiles, but apparently something is missing for ninja to understand the dependencies.

~/code/pmemfile$ mkdir nbuild && cd nbuild
~/code/pmemfile/nbuild$ cmake -G Ninja .. > /dev/null
~/code/pmemfile/nbuild$ ninja
ninja: error: 'tests/posix/gtest/src/gtest-build/googlemock/gtest/libgtest.a', needed by 'tests/posix/file_crash', missing and no known rule to make it

preload: rmdir "$mountpoint" succeeds on non-empty pool

$ pf mkdir /tmp/mountpoint/123
$ pf rmdir /tmp/mountpoint
$ ls -ld /tmp/mountpoint
ls: cannot access '/tmp/mountpoint': No such file or directory
$ mkdir /tmp/mountpoint
$ pf ls -l /tmp/mountpoint
total 0
drwxrwxrwx 2 root root 4008 Jun 16 12:32 123

Also rm -r "$mountpoint" removes only the mountpoint directory, but doesn't remove any files.

gcc-4.8: compilation error

Found on 3f9722c

CMakeFiles/file_stat.dir/stat/stat.cpp.o: In function stat_test_2_Test::TestBody()': /home/mramotow/repos/pmemfile/pmemfile/tests/core/stat/stat.cpp:149: undefined reference to testing::internal::GetBoolAssertionFailureMessage(testing::AssertionResult const&, char const*, char const*, char const*)'
CMakeFiles/file_stat.dir/stat/stat.cpp.o: In function testing::AssertionResult::AppendMessage(testing::Message const&)': /home/mramotow/repos/pmemfile/pmemfile/build/tests/core/gtest/src/gtest/googletest/include/gtest/gtest.h:323: undefined reference to testing::Message::GetString() const'
CMakeFiles/file_stat.dir/stat/stat.cpp.o: In function pmemfile_test::SetUp()': /home/mramotow/repos/pmemfile/pmemfile/tests/core/./pmemfile_test.hpp:153: undefined reference to testing::internal::GetBoolAssertionFailureMessage(testing::AssertionResult const&, char const*, char const*, char const*)'
CMakeFiles/file_stat.dir/stat/stat.cpp.o: In function pmemfile_test::TearDown()': /home/mramotow/repos/pmemfile/pmemfile/tests/core/./pmemfile_test.hpp:163: undefined reference to testing::internal::GetBoolAssertionFailureMessage(testing::AssertionResult const&, char const*, char const*, char const*)'
CMakeFiles/file_stat.dir/stat/stat.cpp.o: In function testing::AssertionResult testing::internal::CmpHelperEQFailure<bool, bool>(char const*, char const*, bool const&, bool const&)': /home/mramotow/repos/pmemfile/pmemfile/build/tests/core/gtest/src/gtest/googletest/include/gtest/gtest.h:1382: undefined reference to testing::internal::EqFailure(char const*, char const*, std::string const&, std::string const&, bool)'
CMakeFiles/file_stat.dir/stat/stat.cpp.o: In function testing::AssertionResult testing::internal::CmpHelperEQFailure<int, int>(char const*, char const*, int const&, int const&)': /home/mramotow/repos/pmemfile/pmemfile/build/tests/core/gtest/src/gtest/googletest/include/gtest/gtest.h:1382: undefined reference to testing::internal::EqFailure(char const*, char const*, std::string const&, std::string const&, bool)'
CMakeFiles/file_stat.dir/stat/stat.cpp.o: In function testing::AssertionResult testing::internal::CmpHelperEQFailure<long, int>(char const*, char const*, long const&, int const&)': /home/mramotow/repos/pmemfile/pmemfile/build/tests/core/gtest/src/gtest/googletest/include/gtest/gtest.h:1382: undefined reference to testing::internal::EqFailure(char const*, char const*, std::string const&, std::string const&, bool)'
libpmemfile_test.a(pmemfile_test.cpp.o): In function testing::AssertionResult testing::internal::CmpHelperEQFailure<unsigned int, unsigned int>(char const*, char const*, unsigned int const&, unsigned int const&)': /home/mramotow/repos/pmemfile/pmemfile/build/tests/core/gtest/src/gtest/googletest/include/gtest/gtest.h:1382: undefined reference to testing::internal::EqFailure(char const*, char const*, std::string const&, std::string const&, bool)'
collect2: error: ld returned 1 exit status
tests/core/CMakeFiles/file_stat.dir/build.make:98: recipe for target 'tests/core/file_stat' failed
make[2]: *** [tests/core/file_stat] Error 1
CMakeFiles/Makefile2:1186: recipe for target 'tests/core/CMakeFiles/file_stat.dir/all' failed
make[1]: *** [tests/core/CMakeFiles/file_stat.dir/all] Error 2
Makefile:138: recipe for target 'all' failed
make: *** [all] Error 2

The tests in xattr.c assume an FS with xattr support

The tests in tests/preload/xattr/xattr.c expect setxattr to work on paths not mounted under pmemfile.
This caused a problem when I had TEST_DIR=/dev/shm:

$ cf -R preload_xa
Test project /home/tej/code/pmemfile/build
    Start 68: preload_xattr
1/1 Test #68: preload_xattr ....................***Failed    0.09 sec
preload_xattr: setxattr failed: Operation not supported
CMake Error at /home/tej/code/pmemfile/tests/helpers.cmake:105 (message):
  /home/tej/code/pmemfile/build/tests/preload/preload_xattr /dev/shm//xattr
  failed: 3
Call Stack (most recent call first):
  /home/tej/code/pmemfile/tests/preload/xattr/xattr.cmake:45 (execute)

This test failure looks exactly as if libpmemfile would return ENOTSUP, but in this case the kernel returned this error code.

clang-3.8: compilation error

Found on 3f9722c

/home/mramotow/repos/pmemfile/pmemfile/tests/core/crash/crash.cpp:56:13: error: no previous extern declaration for non-static variable 'path' [-Werror,-Wmissing-variable-declarations]
const char *path;
^
/home/mramotow/repos/pmemfile/pmemfile/tests/core/crash/crash.cpp:57:13: error: no previous extern declaration for non-static variable 'op' [-Werror,-Wmissing-variable-declarations]
const char *op;

preload: fork/clone safety

We should detect fork in libpmemfile.so and disable access to pmemfile pool from either child or parent. Without that it's possible to corrupt pmemfile pool.

It's not possible to rm -r directory with files (fcntl)

LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libpmemfile.so PMEMFILE_POOLS=/tmp/mountpoint:/mnt/pmem/pmemfile_pool ls testdir
no-such-file test2.db test3.db test.db

export INTERCEPT_LOG=intercept.log
export PMEMFILE_PRELOAD_LOG=pmemfile_preload.log
export PMEMFILECORE_LOG_LEVEL=4
export PMEMFILECORE_LOG_FILE=pmemfile-core.log
export PMEM_IS_PMEM_FORCE=1
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libpmemfile.so PMEMFILE_POOLS=/tmp/mountpoint:/mnt/pmem/pmemfile_pool rm -r testdir

cat intercept.log
tempfile=$(mktemp) ; tempfile2=$(mktemp) ; grep "^/" $0 | cut -d " " -f 1,2 | sed "s/^/addr2line -p -f -e /" > $tempfile ; { echo ; . $tempfile ; echo ; } > $tempfile2 ; paste $tempfile2 $0 ; exit 0
/lib/x86_64-linux-gnu/libc.so.6 0xf6f78 -- getcwd("0\x1c", 1024) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6f78 -- getcwd("/tmp/mountpoint", 1024) = 16
/lib/x86_64-linux-gnu/libc.so.6 0xf6003 -- stat("/tmp/mountpoint", 0x7ffdb7d28b40) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6003 -- stat("/tmp/mountpoint", 0x7ffdb7d28b40) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/mnt/pmem/pmemfile_pool", O_RDONLY, 00) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/mnt/pmem/pmemfile_pool", O_RDONLY, 00) = 6
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(6, 0x7ffdb7d268c0) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(6, 0x7ffdb7d268c0) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(6) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(6) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/mnt/pmem/pmemfile_pool", O_RDONLY, 00) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/mnt/pmem/pmemfile_pool", O_RDONLY, 00) = 6
/lib/x86_64-linux-gnu/libc.so.6 0xf6bc5 -- flock(6, 6) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6bc5 -- flock(6, 6) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/mnt/pmem/pmemfile_pool", O_RDONLY, 00) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/mnt/pmem/pmemfile_pool", O_RDONLY, 00) = 7
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(7, 0x7ffdb7d267e0) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(7, 0x7ffdb7d267e0) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(7) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(7) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf6003 -- stat("/mnt/pmem/pmemfile_pool", 0x7ffdb7d288d0) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6003 -- stat("/mnt/pmem/pmemfile_pool", 0x7ffdb7d288d0) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf667e -- read(6, "", 11) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf667e -- read(6, "PMEMOBJ\0\x03\0\0", 11) = 11
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(6) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(6) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/mnt/pmem/pmemfile_pool", O_RDONLY, 00) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/mnt/pmem/pmemfile_pool", O_RDONLY, 00) = 6
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(6, 0x7ffdb7d26890) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(6, 0x7ffdb7d26890) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(6) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(6) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf6735 -- access("/mnt/pmem/pmemfile_pool", 0) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6735 -- access("/mnt/pmem/pmemfile_pool", 0) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/mnt/pmem/pmemfile_pool", O_RDWR, 040000000) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/mnt/pmem/pmemfile_pool", O_RDWR, 040000000) = 6
/lib/x86_64-linux-gnu/libc.so.6 0xf6bc5 -- flock(6, 6) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6bc5 -- flock(6, 6) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/mnt/pmem/pmemfile_pool", O_RDONLY, 040000000) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/mnt/pmem/pmemfile_pool", O_RDONLY, 040000000) = 7
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(7, 0x7ffdb7d267e0) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(7, 0x7ffdb7d267e0) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(7) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(7) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf6003 -- stat("/mnt/pmem/pmemfile_pool", 0x7ffdb7d288d0) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6003 -- stat("/mnt/pmem/pmemfile_pool", 0x7ffdb7d288d0) = 0
/lib/x86_64-linux-gnu/libc.so.6 0x100ac8 -- mmap(0x0, 1075838976, 1, 34, -1, 0x0) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x100ac8 -- mmap(0x0, 1075838976, 1, 34, -1, 0x0) = 139691337277440
/lib/x86_64-linux-gnu/libc.so.6 0x100b55 -- munmap(0x7f0c6c896000, 1075838976) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x100b55 -- munmap(0x7f0c6c896000, 1075838976) = 0
/lib/x86_64-linux-gnu/libc.so.6 0x100ac8 -- mmap(0x7f0c6ca00000, 1073741824, 3, 1, 6, 0x0) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x100ac8 -- mmap(0x7f0c6ca00000, 1073741824, 3, 1, 6, 0x0) = 139691338760192
/lib/x86_64-linux-gnu/libc.so.6 0x100ac8 -- mmap(0x0, 4096, 3, 1, 6, 0x0) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x100ac8 -- mmap(0x0, 4096, 3, 1, 6, 0x0) = 139692444446720
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/proc/self/exe", O_RDONLY, 010) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf645e -- open("/proc/self/exe", O_RDONLY, 010) = 7
/lib/x86_64-linux-gnu/libc.so.6 0xf667e -- read(7, "", 64) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf667e -- read(7, "\x7fELF\x02\x01\x01\0\0\0\0\0\0\0\0\0\x02\0>\0\x01\0\0\0\x90 @\0\0\0\0\0@\0\0\0\0\0\0\00\xe4\0\0\0\0\0\0\0\0\0\0@\08\0\t\0...", 64) = 64
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(7) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(7) = 0
/lib/x86_64-linux-gnu/libc.so.6 0x100b55 -- munmap(0x7f0cae877000, 4096) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x100b55 -- munmap(0x7f0cae877000, 4096) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xfc227 -- brk(14962688) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xfc227 -- brk(14962688) = 14962688
/lib/x86_64-linux-gnu/libc.so.6 0x104daf -- open("/sys/devices/system/cpu/online", O_RDONLY | O_CLOEXEC, 0200000) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x104daf -- open("/sys/devices/system/cpu/online", O_RDONLY | O_CLOEXEC, 0200000) = 7
/lib/x86_64-linux-gnu/libc.so.6 0x104bd6 -- read(7, "", 8192) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x104bd6 -- read(7, "0-7\n", 8192) = 4
/lib/x86_64-linux-gnu/libc.so.6 0x104e65 -- close(7) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x104e65 -- close(7) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xfc227 -- brk(15097856) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xfc227 -- brk(15097856) = 15097856
/lib/x86_64-linux-gnu/libc.so.6 0xfc227 -- brk(15233024) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xfc227 -- brk(15233024) = 15233024
/lib/x86_64-linux-gnu/libc.so.6 0xfc227 -- brk(15368192) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xfc227 -- brk(15368192) = 15368192
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(6) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6d0e -- close(6) = 0
/lib/x86_64-linux-gnu/libc.so.6 0x2c7d1 -- open("/usr/lib/locale/locale-archive", O_RDONLY | O_CLOEXEC, 00) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x2c7d1 -- open("/usr/lib/locale/locale-archive", O_RDONLY | O_CLOEXEC, 00) = 6
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(6, 0x7f0cae075980) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(6, 0x7f0cae075980) = 0
/lib/x86_64-linux-gnu/libc.so.6 0x100ac8 -- mmap(0x0, 4228736, 1, 2, 6, 0x0) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x100ac8 -- mmap(0x0, 4228736, 1, 2, 6, 0x0) = 139691334529024
/lib/x86_64-linux-gnu/libc.so.6 0x2c876 -- close(6) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x2c876 -- close(6) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xfbaa8 -- ioctl(0, 21505, 140727687482960) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xfbaa8 -- ioctl(0, 21505, 140727687482960) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf60a3 -- lstat("/", 0x7ffdb7d28e30) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf60a3 -- lstat("/", 0x7ffdb7d28e30) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf61b8 -- newfstatat(-100, "testdir", 0xe97558, 256) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf61b8 -- newfstatat(-100, "testdir", 0xe97558, 256) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf6548 -- openat(-100, "testdir", O_RDONLY | O_DIRECTORY | O_NOCTTY | O_NOFOLLOW | O_NONBLOCK, 00) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6548 -- openat(-100, "testdir", O_RDONLY | O_DIRECTORY | O_NOCTTY | O_NOFOLLOW | O_NONBLOCK, 00) = 133
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(133, 0x7ffdb7d28ce0) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(133, 0x7ffdb7d28ce0) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf6b05 -- fcntl(133, 3 (F_GETFL), 3) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6b05 -- fcntl(133, 3 (F_GETFL), 3) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf6b05 -- fcntl(133, 2 (F_SETFD), 2) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6b05 -- fcntl(133, 2 (F_SETFD), 2) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xc7d39 -- getdents(133, 0xe978a0, 32768) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xc7d39 -- getdents(133, 0xe978a0, 32768) = 176
/lib/x86_64-linux-gnu/libc.so.6 0xc7825 -- close(133) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xc7825 -- close(133) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xcc6a5 -- geteuid() = ?
/lib/x86_64-linux-gnu/libc.so.6 0xcc6a5 -- geteuid() = 1000
/lib/x86_64-linux-gnu/libc.so.6 0xf61b8 -- newfstatat(-100, "testdir", 0x7ffdb7d28db0, 256) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf61b8 -- newfstatat(-100, "testdir", 0x7ffdb7d28db0, 256) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf68a8 -- faccessat(-100, "testdir", 02, 2098) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf68a8 -- faccessat(-100, "testdir", 02, 2098) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf6548 -- openat(-100, "testdir", O_RDONLY | O_DIRECTORY | O_NOCTTY | O_NOFOLLOW | O_NONBLOCK, 00) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6548 -- openat(-100, "testdir", O_RDONLY | O_DIRECTORY | O_NOCTTY | O_NOFOLLOW | O_NONBLOCK, 00) = 133
/lib/x86_64-linux-gnu/libc.so.6 0xf6b05 -- fcntl(133, 1 (F_GETFD), 1) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6b05 -- fcntl(133, 1 (F_GETFD), 1) = -95
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(133, 0x7ffdb7d28bf0) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(133, 0x7ffdb7d28bf0) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf6b05 -- fcntl(133, 3 (F_GETFL), 3) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6b05 -- fcntl(133, 3 (F_GETFL), 3) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf6b05 -- fcntl(133, 2 (F_SETFD), 2) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6b05 -- fcntl(133, 2 (F_SETFD), 2) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf6b05 -- fcntl(133, 0 (F_DUPFD), 0) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6b05 -- fcntl(133, 0 (F_DUPFD), 0) = -95
/lib/x86_64-linux-gnu/libc.so.6 0xc7825 -- close(133) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xc7825 -- close(133) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf61b8 -- newfstatat(-100, "testdir", 0x7ffdb7d28db0, 256) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf61b8 -- newfstatat(-100, "testdir", 0x7ffdb7d28db0, 256) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf68a8 -- faccessat(-100, "testdir", 02, 256) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf68a8 -- faccessat(-100, "testdir", 02, 256) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf7ed5 -- unlinkat(4294967196, "testdir", 512) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x79a5d -- open("/usr/share/locale/locale.alias", O_RDONLY | O_CLOEXEC, 0666) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x79a5d -- open("/usr/share/locale/locale.alias", O_RDONLY | O_CLOEXEC, 0666) = 134
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(134, 0x7ffdb7d1e550) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(134, 0x7ffdb7d1e550) = 0
/lib/x86_64-linux-gnu/libc.so.6 0x791ac -- read(134, "", 4096) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x791ac -- read(134, "# Locale name alias data base.\n# Copyright (C) 1996-2016 Free Software Foundation, Inc.\n#\n# This program is free softwa...", 4096) = 2995
/lib/x86_64-linux-gnu/libc.so.6 0x791ac -- read(134, "", 4096) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x791ac -- read(134, "", 4096) = 0
/lib/x86_64-linux-gnu/libc.so.6 0x78349 -- close(134) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x78349 -- close(134) = 0
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale/en_US/LC_MESSAGES/libc.mo", O_RDONLY, 03760625641423600) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale/en_US/LC_MESSAGES/libc.mo", O_RDONLY, 03760625641423600) = -2
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY, 03760625641423600) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY, 03760625641423600) = -2
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale-langpack/en_US/LC_MESSAGES/libc.mo", O_RDONLY, 03760625641423600) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale-langpack/en_US/LC_MESSAGES/libc.mo", O_RDONLY, 03760625641423600) = -2
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale-langpack/en/LC_MESSAGES/libc.mo", O_RDONLY, 03760625641423600) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale-langpack/en/LC_MESSAGES/libc.mo", O_RDONLY, 03760625641423600) = -2
/lib/x86_64-linux-gnu/libc.so.6 0xf7ed5 -- unlinkat(4294967196, "testdir", 512) = -39
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale/en_US/LC_MESSAGES/coreutils.mo", O_RDONLY, 03760625641423600) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale/en_US/LC_MESSAGES/coreutils.mo", O_RDONLY, 03760625641423600) = -2
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale/en/LC_MESSAGES/coreutils.mo", O_RDONLY, 03760625641423600) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale/en/LC_MESSAGES/coreutils.mo", O_RDONLY, 03760625641423600) = -2
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale-langpack/en_US/LC_MESSAGES/coreutils.mo", O_RDONLY, 03760625641423600) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale-langpack/en_US/LC_MESSAGES/coreutils.mo", O_RDONLY, 03760625641423600) = -2
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale-langpack/en/LC_MESSAGES/coreutils.mo", O_RDONLY, 03760625641423600) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x30a0d -- open("/usr/share/locale-langpack/en/LC_MESSAGES/coreutils.mo", O_RDONLY, 03760625641423600) = 134
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(134, 0x7ffdb7d28b00) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf6052 -- fstat(134, 0x7ffdb7d28b00) = 0
/lib/x86_64-linux-gnu/libc.so.6 0x100ac8 -- mmap(0x0, 619, 1, 2, 134, 0x0) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x100ac8 -- mmap(0x0, 619, 1, 2, 134, 0x0) = 139692444446720
/lib/x86_64-linux-gnu/libc.so.6 0x30b0c -- close(134) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x30b0c -- close(134) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xf66de -- write(2, "rm: ", 4) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf66de -- write(2, "rm: ", 4) = 4
/lib/x86_64-linux-gnu/libc.so.6 0xf66de -- write(2, "cannot remove 'testdir'", 23) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf66de -- write(2, "cannot remove 'testdir'", 23) = 23
/lib/x86_64-linux-gnu/libc.so.6 0xf66de -- write(2, ": Directory not empty", 21) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf66de -- write(2, ": Directory not empty", 21) = 21
/lib/x86_64-linux-gnu/libc.so.6 0xf66de -- write(2, "\n", 1) = ?
/lib/x86_64-linux-gnu/libc.so.6 0xf66de -- write(2, "\n", 1) = 1
/lib/x86_64-linux-gnu/libc.so.6 0x106855 -- lseek(0, 0, 1) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x106855 -- lseek(0, 0, 1) = -29
/lib/x86_64-linux-gnu/libc.so.6 0x78349 -- close(0) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x78349 -- close(0) = 0
/lib/x86_64-linux-gnu/libc.so.6 0x78349 -- close(1) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x78349 -- close(1) = 0
/lib/x86_64-linux-gnu/libc.so.6 0x78349 -- close(2) = ?
/lib/x86_64-linux-gnu/libc.so.6 0x78349 -- close(2) = 0
/lib/x86_64-linux-gnu/libc.so.6 0xcbb96 -- exit_group(1)

cat pmemfile_preload.log
hook_openat("/usr/lib/locale/locale-archive")
hook_openat("testdir")
pmemfile_openat(0xe03040, 0xffffffffffffffff, "testdir", 0x30100, 0) = 0xe977f0
pmemfile_fstat(0x7f0cae34a2c0, 0xe977f0, 0x7ffdb7d28ce0) = 0
pmemfile_fcntl(0x7f0cae34a2c0, 0xe977f0, 0x3, 0x7ffdb7d28ce0) = 0
pmemfile_fcntl(0x7f0cae34a2c0, 0xe977f0, 0x2, 0x1) = 0
pmemfile_getdents(0xe03040, 0xe977f0, 0xe978a0, 32768) = 176
pmemfile_close(0xe03040, 0xe977f0) = 0
hook_openat("testdir")
pmemfile_openat(0xe03040, 0xffffffffffffffff, "testdir", 0x30100, 0) = 0xe977f0
pmemfile_fcntl(0x7f0cae34a2c0, 0xe977f0, 0x1, 0x0) = -95
pmemfile_fstat(0x7f0cae34a2c0, 0xe977f0, 0x7ffdb7d28bf0) = 0
pmemfile_fcntl(0x7f0cae34a2c0, 0xe977f0, 0x3, 0x7ffdb7d28bf0) = 0
pmemfile_fcntl(0x7f0cae34a2c0, 0xe977f0, 0x2, 0x1) = 0
pmemfile_fcntl(0x7f0cae34a2c0, 0xe977f0, 0x0, 0x3) = -95
pmemfile_close(0xe03040, 0xe977f0) = 0
pmemfile_unlink(0xe03040, "testdir") = -39
hook_openat("/usr/share/locale/en_US/LC_MESSAGES/coreutils.mo")
hook_openat("/usr/share/locale/en/LC_MESSAGES/coreutils.mo")
hook_openat("/usr/share/locale-langpack/en_US/LC_MESSAGES/coreutils.mo")
hook_openat("/usr/share/locale-langpack/en/LC_MESSAGES/coreutils.mo")

Missing support for extended attributes

fgetxattr, flistxattr, fremovexattr, fsetxattr, getxattr, lgetxattr, listxattr, llistxattr, lremovexattr, lsetxattr, removexattr, setxattr are not supported

preload: incomplete environment setup

libpmemfile does not:

  • notify libpmemfile-posix about current user credentials (ruid, rgid, fsuid, fsgid, euid, egid, groups, capabilites) and its changes
  • notify libpmemfile-posix about umask and its changes

It affects a lot of tests in pjdfstest.

tune file locking

It is not entirely obvious when a pmemfile struct's mutex should be held, and currently it is probably locked too often/for too long.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.