aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/memfile.c9
-rw-r--r--src/nvim/os/fs.c9
-rw-r--r--test/unit/os/fs_spec.lua21
3 files changed, 35 insertions, 4 deletions
diff --git a/src/nvim/memfile.c b/src/nvim/memfile.c
index 82369b739a..be8148c28d 100644
--- a/src/nvim/memfile.c
+++ b/src/nvim/memfile.c
@@ -123,10 +123,11 @@ memfile_T *mf_open(char_u *fname, int flags)
*/
FileInfo file_info;
if (mfp->mf_fd >= 0
- && os_get_file_info_fd(mfp->mf_fd, &file_info)
- && file_info.stat.st_blksize >= MIN_SWAP_PAGE_SIZE
- && file_info.stat.st_blksize <= MAX_SWAP_PAGE_SIZE) {
- mfp->mf_page_size = file_info.stat.st_blksize;
+ && os_get_file_info_fd(mfp->mf_fd, &file_info)) {
+ uint64_t blocksize = os_fileinfo_blocksize(&file_info);
+ if (blocksize >= MIN_SWAP_PAGE_SIZE && blocksize <= MAX_SWAP_PAGE_SIZE) {
+ mfp->mf_page_size = blocksize;
+ }
}
if (mfp->mf_fd < 0 || (flags & (O_TRUNC|O_EXCL))
diff --git a/src/nvim/os/fs.c b/src/nvim/os/fs.c
index 70a53edb1c..71e8a55c0e 100644
--- a/src/nvim/os/fs.c
+++ b/src/nvim/os/fs.c
@@ -412,6 +412,15 @@ uint64_t os_fileinfo_hardlinks(const FileInfo *file_info)
return file_info->stat.st_nlink;
}
+/// Get the blocksize from a `FileInfo`.
+///
+/// @return blocksize in bytes.
+uint64_t os_fileinfo_blocksize(const FileInfo *file_info)
+ FUNC_ATTR_NONNULL_ALL
+{
+ return file_info->stat.st_blksize;
+}
+
/// Get the `FileID` for a given path
///
/// @param path Path to the file.
diff --git a/test/unit/os/fs_spec.lua b/test/unit/os/fs_spec.lua
index 9f6d110e8f..696e6f15cc 100644
--- a/test/unit/os/fs_spec.lua
+++ b/test/unit/os/fs_spec.lua
@@ -625,6 +625,27 @@ describe('fs function', function()
end)
end)
+ describe('os_fileinfo_blocksize', function()
+ it('returns the correct blocksize of a file', function()
+ local path = 'unit-test-directory/test.file'
+ -- there is a bug in luafilesystem where
+ -- `lfs.attributes path, 'blksize'` returns the worng value:
+ -- https://github.com/keplerproject/luafilesystem/pull/44
+ -- using this workaround for now:
+ local blksize = lfs.attributes(path).blksize
+ local file_info = file_info_new()
+ assert.is_true(fs.os_get_file_info(path, file_info))
+ if blksize then
+ eq(blksize, fs.os_fileinfo_blocksize(file_info))
+ else
+ -- luafs dosn't support blksize on windows
+ -- libuv on windows returns a constant value as blocksize
+ -- checking for this constant value should be enough
+ eq(2048, fs.os_fileinfo_blocksize(file_info))
+ end
+ end)
+ end)
+
describe('os_get_file_id', function()
it('returns false if given an non-existing file', function()
local file_id = file_id_new()