[Devel] [PATCH v7 2/2] overlayfs: add mnt_id paths options

Pavel Tikhomirov ptikhomirov at virtuozzo.com
Thu Jun 4 11:19:05 MSK 2020



On 6/3/20 7:58 PM, Alexander Mikhalitsyn wrote:
> This patch adds config OVERLAY_FS_PATH_OPTIONS_MNT_ID
> compile-time option, and "mnt_id_path_opts" runtime module option.
> If enabled, user may see mnt_ids for lowerdir, upperdir paths
> in mountinfo in separate lowerdir_mnt_id/upperdir_mnt_id options.
> 
> This patch is very helpful to checkpoint/restore functionality
> of overlayfs mounts in case when we have overmounts on
> lowerdir, workdir, upperdir paths.
> 
> https://jira.sw.ru/browse/PSBM-58614
> 

Reviewed-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>

> Signed-off-by: Alexander Mikhalitsyn <alexander.mikhalitsyn at virtuozzo.com > ---
>   fs/overlayfs/Kconfig     | 26 ++++++++++++++++++++++++++
>   fs/overlayfs/overlayfs.h |  3 +++
>   fs/overlayfs/super.c     | 14 ++++++++++++++
>   fs/overlayfs/util.c      | 21 +++++++++++++++++++++
>   4 files changed, 64 insertions(+)
> 
> diff --git a/fs/overlayfs/Kconfig b/fs/overlayfs/Kconfig
> index 27a3f05..2a76e28 100644
> --- a/fs/overlayfs/Kconfig
> +++ b/fs/overlayfs/Kconfig
> @@ -133,4 +133,30 @@ config OVERLAY_FS_DYNAMIC_RESOLVE_PATH_OPTIONS
>   
>   	  For more information, see Documentation/filesystems/overlayfs.txt
>   
> +	  If unsure, say N.
> +
> +config OVERLAY_FS_PATH_OPTIONS_MNT_ID
> +	bool "Overlayfs: show mnt_id for all mount paths options"
> +	default y
> +	depends on OVERLAY_FS
> +	help
> +	  This option helps checkpoint/restore of overlayfs mounts.
> +	  If N selected, old behavior is saved.
> +
> +	  If this config option is enabled then in overlay filesystems mount
> +	  options you will be able to see additional parameters lowerdir_mnt_id/
> +	  upperdir_mnt_id with corresponding mnt_ids.
> +
> +	  It's also possible to change this behavior on overlayfs module loading or
> +	  through sysfs (mnt_id_path_opts parameter).
> +
> +	  Disable this to get a backward compatible with previous kernels configuration,
> +	  but in this case checkpoint/restore functionality for overlayfs mounts
> +	  may not fully work.
> +
> +	  If backward compatibility is not an issue, then it is safe and
> +	  recommended to say Y here.
> +
> +	  For more information, see Documentation/filesystems/overlayfs.txt
> +
>   	  If unsure, say N.
> \ No newline at end of file
> diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h
> index f508cd2..6440be5 100644
> --- a/fs/overlayfs/overlayfs.h
> +++ b/fs/overlayfs/overlayfs.h
> @@ -256,6 +256,9 @@ int ovl_lock_rename_workdir(struct dentry *workdir, struct dentry *upperdir);
>   void print_path_option(struct seq_file *m, const char *name, struct path *path);
>   void print_paths_option(struct seq_file *m, const char *name,
>   			struct path *paths, unsigned int num);
> +void print_mnt_id_option(struct seq_file *m, const char *name, struct path *path);
> +void print_mnt_ids_option(struct seq_file *m, const char *name,
> +			struct path *paths, unsigned int num);
>   
>   static inline bool ovl_is_impuredir(struct dentry *dentry)
>   {
> diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c
> index 138c6ac..be01553 100644
> --- a/fs/overlayfs/super.c
> +++ b/fs/overlayfs/super.c
> @@ -61,6 +61,10 @@ static bool ovl_dyn_path_opts = IS_ENABLED(CONFIG_OVERLAY_FS_DYNAMIC_RESOLVE_PAT
>   module_param_named(dyn_path_opts, ovl_dyn_path_opts, bool, 0644);
>   MODULE_PARM_DESC(dyn_path_opts, "dyn_path_opts feature enabled");
>   
> +static bool ovl_mnt_id_path_opts = IS_ENABLED(OVERLAY_FS_PATH_OPTIONS_MNT_ID);
> +module_param_named(mnt_id_path_opts, ovl_mnt_id_path_opts, bool, 0644);
> +MODULE_PARM_DESC(mnt_id_path_opts, "mnt_id_path_opts feature enabled");
> +
>   static void ovl_entry_stack_free(struct ovl_entry *oe)
>   {
>   	unsigned int i;
> @@ -390,6 +394,16 @@ static int ovl_show_options(struct seq_file *m, struct dentry *dentry)
>   		}
>   	}
>   
> +	if (ovl_mnt_id_path_opts) {
> +		print_mnt_ids_option(m, "lowerdir_mnt_id", ofs->lowerpaths, ofs->numlower);
> +		/*
> +		 * We don't need to show mnt_id for workdir because it
> +		 * on the same mount as upperdir.
> +		 */
> +		if (ofs->config.upperdir)
> +			print_mnt_id_option(m, "upperdir_mnt_id", &ofs->upperpath);
> +	}
> +
>   	if (ofs->config.default_permissions)
>   		seq_puts(m, ",default_permissions");
>   	if (strcmp(ofs->config.redirect_mode, ovl_redirect_mode_def()) != 0)
> diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c
> index bb670ee..0425c49 100644
> --- a/fs/overlayfs/util.c
> +++ b/fs/overlayfs/util.c
> @@ -18,6 +18,7 @@
>   #include <linux/namei.h>
>   #include <linux/ratelimit.h>
>   #include <linux/seq_file.h>
> +#include "../mount.h"
>   #include "overlayfs.h"
>   
>   int ovl_want_write(struct dentry *dentry)
> @@ -699,3 +700,23 @@ void print_paths_option(struct seq_file *m, const char *name,
>   		seq_path(m, &paths[i], ", \t\n\\");
>   	}
>   }
> +
> +void print_mnt_id_option(struct seq_file *m, const char *name, struct path *path)
> +{
> +	seq_show_option(m, name, "");
> +	seq_printf(m, "%i", real_mount(path->mnt)->mnt_id);
> +}
> +
> +void print_mnt_ids_option(struct seq_file *m, const char *name,
> +			struct path *paths, unsigned int num)
> +{
> +	int i;
> +
> +	seq_show_option(m, name, "");
> +
> +	for (i = 0; i < num; i++) {
> +		if (i)
> +			seq_putc(m, ':');
> +		seq_printf(m, "%i", real_mount(paths[i].mnt)->mnt_id);
> +	}
> +}
> 

-- 
Best regards, Tikhomirov Pavel
Software Developer, Virtuozzo.


More information about the Devel mailing list