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 <[email protected]>

Signed-off-by: Alexander Mikhalitsyn <[email protected] > ---
  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.
_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to