summaryrefslogtreecommitdiff
path: root/src/cache/backings
diff options
context:
space:
mode:
Diffstat (limited to 'src/cache/backings')
-rw-r--r--src/cache/backings/file.c2
-rw-r--r--src/cache/backings/file_common.h14
-rw-r--r--src/cache/backings/file_mapped.c4
3 files changed, 15 insertions, 5 deletions
diff --git a/src/cache/backings/file.c b/src/cache/backings/file.c
index 06cc600..c98c8d5 100644
--- a/src/cache/backings/file.c
+++ b/src/cache/backings/file.c
@@ -63,7 +63,7 @@ static void file_backing_set_size(struct cch_backing *backing, off_t size, bool
struct cch_backing_file *file = (struct cch_backing_file *)backing;
nn_mutex_lock(&file->mutex);
file->backing.size = size;
- if (expand_to_size && (size_t)size > file->file.size) {
+ if (expand_to_size || (size > 0 && size < file->file.size)) {
nn_file_truncate(&file->file, size);
}
nn_mutex_unlock(&file->mutex);
diff --git a/src/cache/backings/file_common.h b/src/cache/backings/file_common.h
index 6650dd1..6dd4e96 100644
--- a/src/cache/backings/file_common.h
+++ b/src/cache/backings/file_common.h
@@ -27,7 +27,19 @@ static void file_backing_finalize(struct cch_backing *backing)
static bool file_open_internal(struct cch_backing_file *file, str *path, size_t size)
{
s32 flags = (size != 0) ? NNWT_FILE_CREATE : NNWT_FILE_READONLY;
- if (!nn_file_open(&file->file, path, flags)) return false;
+ if (al_str_cmp(path, &al_str_c("fd://"), 0, 5) == 0) {
+ str fd_str = al_str_substr(path, 5, path->length);
+ bool error;
+ s32 fd = (s32)al_str_to_long(&fd_str, 10, &error);
+ if (error) return false;
+ if (!nn_file_wrap_fd(&file->file, fd)) {
+ return false;
+ }
+ } else {
+ if (!nn_file_open(&file->file, path, flags)) {
+ return false;
+ }
+ }
size_t filesize = file->file.size;
if (!size) {
file->backing.size = filesize;
diff --git a/src/cache/backings/file_mapped.c b/src/cache/backings/file_mapped.c
index 7657a21..24ac005 100644
--- a/src/cache/backings/file_mapped.c
+++ b/src/cache/backings/file_mapped.c
@@ -46,14 +46,12 @@ static void file_backing_unlock(struct cch_backing *backing)
static void file_backing_set_size(struct cch_backing *backing, off_t size, bool expand_to_size)
{
struct cch_backing_file *file = (struct cch_backing_file *)backing;
- al_assert(expand_to_size || size == 0);
nn_mutex_lock(&file->mutex);
file->backing.size = size;
- if ((size_t)size > file->file.size) {
+ if (expand_to_size || (size > 0 && size < file->file.size)) {
nn_file_munmap(&file->file, file->u.map);
nn_file_truncate(&file->file, size);
file->u.map = nn_file_mmap(&file->file);
- file->file.size = size;
}
nn_mutex_unlock(&file->mutex);
}