diff options
Diffstat (limited to 'src/pmdk/src/libpmem2/deep_flush.c')
-rw-r--r-- | src/pmdk/src/libpmem2/deep_flush.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/pmdk/src/libpmem2/deep_flush.c b/src/pmdk/src/libpmem2/deep_flush.c new file mode 100644 index 000000000..585772ae1 --- /dev/null +++ b/src/pmdk/src/libpmem2/deep_flush.c @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: BSD-3-Clause +/* Copyright 2020, Intel Corporation */ + +/* + * deep_flush.c -- pmem2_deep_flush implementation + */ + +#include <stdlib.h> + +#include "libpmem2.h" +#include "deep_flush.h" +#include "out.h" +#include "pmem2_utils.h" + +/* + * pmem2_deep_flush -- performs deep flush operation + */ +int +pmem2_deep_flush(struct pmem2_map *map, void *ptr, size_t size) +{ + LOG(3, "map %p ptr %p size %zu", map, ptr, size); + PMEM2_ERR_CLR(); + + uintptr_t map_addr = (uintptr_t)map->addr; + uintptr_t map_end = map_addr + map->content_length; + uintptr_t flush_addr = (uintptr_t)ptr; + uintptr_t flush_end = flush_addr + size; + + if (flush_addr < map_addr || flush_end > map_end) { + ERR("requested deep flush rage ptr %p size %zu" + "exceeds map range %p", ptr, size, map); + return PMEM2_E_DEEP_FLUSH_RANGE; + } + + int ret = map->deep_flush_fn(map, ptr, size); + if (ret) { + LOG(1, "cannot perform deep flush operation for map %p", map); + return ret; + } + + return 0; +} |