Add a function to check, is it a file-posix node on top of file in FUSE file system.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com> --- include/block/block.h | 2 ++ block/file-posix.c | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/include/block/block.h b/include/block/block.h index 877fda06a4..51e957f6fb 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -787,4 +787,6 @@ int coroutine_fn bdrv_co_copy_range(BdrvChild *src, uint64_t src_offset, BdrvChild *dst, uint64_t dst_offset, uint64_t bytes, BdrvRequestFlags read_flags, BdrvRequestFlags write_flags); + +bool bdrv_is_file_on_fuse(BlockDriverState *bs); #endif diff --git a/block/file-posix.c b/block/file-posix.c index 560d1c0a94..4100b8dc89 100644 --- a/block/file-posix.c +++ b/block/file-posix.c @@ -324,6 +324,27 @@ static bool dio_byte_aligned(int fd) return false; } +static bool is_fuse(int fd) +{ +#ifdef __linux__ + struct statfs buf; + int ret; + + ret = fstatfs(fd, &buf); + if (ret == 0 && buf.f_type == FUSE_SUPER_MAGIC) { + return true; + } +#endif + return false; +} + +bool bdrv_is_file_on_fuse(BlockDriverState *bs) +{ + BDRVRawState *s = bs->opaque; + + return !strcmp(bs->drv->format_name, "file") && is_fuse(s->fd); +} + /* Check if read is allowed with given memory buffer and length. * * This function is used to check O_DIRECT memory buffer and request alignment. -- 2.18.0