[CRIU] [PATCH 1/3] mount: Handle deleted bindmounts for regular files
Cyrill Gorcunov
gorcunov at openvz.org
Wed Aug 26 07:15:23 PDT 2015
Reported-by: Andrey Wagin <avagin at gmail.com>
Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
---
mount.c | 35 ++++++++++++++++++++++++++++++-----
1 file changed, 30 insertions(+), 5 deletions(-)
diff --git a/mount.c b/mount.c
index 04b99d990bfe..2a2dc7aafc97 100644
--- a/mount.c
+++ b/mount.c
@@ -1970,6 +1970,7 @@ static int do_bind_mount(struct mount_info *mi)
{
bool shared = 0;
bool force_private_remount = false;
+ struct stat st;
if (!mi->need_plugin) {
char *root, *cut_root, rpath[PATH_MAX];
@@ -1996,9 +1997,26 @@ do_bind:
pr_info("\tBind %s to %s\n", root, mi->mountpoint);
if (unlikely(mi->deleted)) {
- if (mkdir(root, 0700)) {
- pr_perror("Can't re-create deleted %s\n", root);
+ if (stat(mi->mountpoint, &st)) {
+ pr_perror("Can't fetch stat on %s", mi->mountpoint);
return -1;
+ } else {
+ if (!S_ISDIR(st.st_mode) && !S_ISREG(st.st_mode)) {
+ pr_err("Unsupported st_mode 0%o deleted root %s\n",
+ (int)st.st_mode, root);
+ return -1;
+ }
+ }
+ if (S_ISDIR(st.st_mode)) {
+ if (mkdir(root, 0700)) {
+ pr_perror("Can't re-create deleted directory %s\n", root);
+ return -1;
+ }
+ } else if (S_ISREG(st.st_mode)) {
+ if (open(root, O_WRONLY | O_CREAT | O_TRUNC, 0644) < 0) {
+ pr_perror("Can't re-create deleted file %s\n", root);
+ return -1;
+ }
}
}
@@ -2008,9 +2026,16 @@ do_bind:
}
if (unlikely(mi->deleted)) {
- if (rmdir(root)) {
- pr_perror("Can't remove deleted %s\n", root);
- return -1;
+ if (S_ISDIR(st.st_mode)) {
+ if (rmdir(root)) {
+ pr_perror("Can't remove deleted directory %s\n", root);
+ return -1;
+ }
+ } else if (S_ISREG(st.st_mode)) {
+ if (unlink(root)) {
+ pr_perror("Can't unlink deleted file %s\n", root);
+ return -1;
+ }
}
}
} else {
--
2.4.3
More information about the CRIU
mailing list