From 69bffe26d36fd095354783c1eeeb3b0564819f2d Mon Sep 17 00:00:00 2001 From: Pavel Emelyanov Date: Mon, 10 Nov 2014 10:47:56 +0400 Subject: [PATCH] kerndat: Make fs-virtualized check report yes/no Right now it returns the whole struct stat which is excessive. Signed-off-by: Pavel Emelyanov --- include/kerndat.h | 8 +++++++- kerndat.c | 13 ++++++++++++- mount.c | 26 ++++++++++---------------- 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/include/kerndat.h b/include/kerndat.h index cfd6639a0..1f511cf82 100644 --- a/include/kerndat.h +++ b/include/kerndat.h @@ -33,6 +33,12 @@ enum { KERNDAT_FS_STAT_MAX }; -extern struct stat *kerndat_get_fs_stat(unsigned int which); +/* + * Check whether the fs @which with kdevice @kdev + * is the same as host's. If yes, this means that + * the fs mount is shared with host, if no -- it's + * a new (likely virtuzlized) fs instance. + */ +extern int kerndat_fs_virtualized(unsigned int which, u32 kdev); #endif /* __CR_KERNDAT_H__ */ diff --git a/kerndat.c b/kerndat.c index 4612ce96c..d6f3921e8 100644 --- a/kerndat.c +++ b/kerndat.c @@ -57,7 +57,7 @@ static int kerndat_get_shmemdev(void) return 0; } -struct stat *kerndat_get_fs_stat(unsigned int which) +static struct stat *kerndat_get_fs_stat(unsigned int which) { static struct { const char *name; @@ -103,6 +103,17 @@ struct stat *kerndat_get_fs_stat(unsigned int which) return &kstat[which].st; } +int kerndat_fs_virtualized(unsigned int which, u32 kdev) +{ + struct stat *host_fs_stat; + + host_fs_stat = kerndat_get_fs_stat(which); + if (host_fs_stat == NULL) + return -1; + + return (kdev_to_odev(kdev) == host_fs_stat->st_dev) ? 0 : 1; +} + /* * Check whether pagemap reports soft dirty bit. Kernel has * this functionality under CONFIG_MEM_SOFT_DIRTY option. diff --git a/mount.c b/mount.c index fac1b35c7..c8ba2fd4f 100644 --- a/mount.c +++ b/mount.c @@ -690,15 +690,17 @@ static int attach_option(struct mount_info *pm, char *opt) /* Is it mounted w or w/o the newinstance option */ static int devpts_parse(struct mount_info *pm) { - struct stat *host_st; + int ret; - host_st = kerndat_get_fs_stat(KERNDAT_FS_STAT_DEVPTS); - if (host_st == NULL) - return -1; - - if (host_st->st_dev == kdev_to_odev(pm->s_dev)) - return 0; + ret = kerndat_fs_virtualized(KERNDAT_FS_STAT_DEVPTS, pm->s_dev); + if (ret <= 0) + return ret; + /* + * Kernel hides this option, but if the fs instance + * is new (virtualized) we know that it was created + * with -o newinstance. + */ return attach_option(pm, "newinstance"); } @@ -745,15 +747,7 @@ out: static bool rt_detmpfs_match(struct mount_info *pm) { - struct stat *host_st; - - host_st = kerndat_get_fs_stat(KERNDAT_FS_STAT_DEVTMPFS); - if (host_st) { - if (host_st->st_dev == kdev_to_odev(pm->s_dev)) - return true; - } - - return false; + return kerndat_fs_virtualized(KERNDAT_FS_STAT_DEVTMPFS, pm->s_dev) == 0; } static int devtmpfs_dump(struct mount_info *pm)