diff --git a/configure b/configure index 83d5964e6..8253bfc04 100755 --- a/configure +++ b/configure @@ -5875,7 +5875,7 @@ fi done -for ac_header in termios.h sys/statvfs.h sys/timerfd.h +for ac_header in termios.h sys/statvfs.h sys/timerfd.h linux/magic.h linux/fiemap.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" diff --git a/configure.in b/configure.in index b87f8ff89..33b5c766a 100644 --- a/configure.in +++ b/configure.in @@ -103,7 +103,7 @@ AC_CHECK_HEADERS([assert.h ctype.h dirent.h errno.h fcntl.h float.h \ sys/time.h sys/types.h sys/utsname.h sys/wait.h time.h \ unistd.h], , [AC_MSG_ERROR(bailing out)]) -AC_CHECK_HEADERS(termios.h sys/statvfs.h sys/timerfd.h) +AC_CHECK_HEADERS(termios.h sys/statvfs.h sys/timerfd.h linux/magic.h linux/fiemap.h) case "$host_os" in linux*) diff --git a/include/configure.h.in b/include/configure.h.in index d94d55d45..3c43bd529 100644 --- a/include/configure.h.in +++ b/include/configure.h.in @@ -264,9 +264,15 @@ /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_FIEMAP_H + /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_FS_H +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_MAGIC_H + /* Define to 1 if you have the header file. */ #undef HAVE_LOCALE_H diff --git a/libdm/libdm-stats.c b/libdm/libdm-stats.c index 612f9bff8..57ef11d4a 100644 --- a/libdm/libdm-stats.c +++ b/libdm/libdm-stats.c @@ -21,9 +21,18 @@ #include #include /* fstatfs */ -#include /* FS_IOC_FIEMAP */ -#include /* fiemap */ -#include /* BTRFS_SUPER_MAGIC */ + +#ifdef __linux__ + #include /* FS_IOC_FIEMAP */ +#endif + +#ifdef HAVE_LINUX_FIEMAP_H + #include /* fiemap */ +#endif + +#ifdef HAVE_LINUX_MAGIC_H + #include /* BTRFS_SUPER_MAGIC */ +#endif #define DM_STATS_REGION_NOT_PRESENT UINT64_MAX #define DM_STATS_GROUP_NOT_PRESENT DM_STATS_GROUP_NONE @@ -4064,6 +4073,7 @@ int dm_stats_get_group_descriptor(const struct dm_stats *dms, return 1; } +#ifdef HAVE_LINUX_FIEMAP_H /* * Group a table of region_ids corresponding to the extents of a file. */ @@ -4258,6 +4268,7 @@ static uint64_t *_stats_create_file_regions(struct dm_stats *dms, int fd, struct statfs fsbuf; struct stat buf; +#ifdef BTRFS_SUPER_MAGIC if (fstatfs(fd, &fsbuf)) { log_error("fstatfs failed for fd %d", fd); return 0; @@ -4268,6 +4279,7 @@ static uint64_t *_stats_create_file_regions(struct dm_stats *dms, int fd, "physical FIEMAP extent data."); return 0; } +#endif if (fstat(fd, &buf)) { log_error("fstat failed for fd %d", fd); @@ -4360,6 +4372,17 @@ out: return NULL; } +#else /* HAVE_LINUX_FIEMAP */ +uint64_t *dm_stats_create_regions_from_fd(struct dm_stats *dms, int fd, + int group, int precise, + struct dm_histogram *bounds, + const char *alias) +{ + log_error("File mapping requires FIEMAP ioctl support."); + return 0; +} +#endif /* HAVE_LINUX_FIEMAP */ + /* * Backward compatible dm_stats_create_region() implementations. *