Blob Blame History Raw
From 1d10fc1e0f2589d34b893c6432fcaab2f99018f7 Mon Sep 17 00:00:00 2001
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
Date: Fri, 17 Dec 2021 14:58:47 +0300
Subject: [PATCH 101/120] mount: split check_mountpoint_fd from
 __open_mountpoint

Now we can reuse "check" part separately in other places.

Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
---
 criu/include/mount.h |  1 +
 criu/mount.c         | 60 ++++++++++++++++++++++++--------------------
 2 files changed, 34 insertions(+), 27 deletions(-)

diff --git a/criu/include/mount.h b/criu/include/mount.h
index 7705279e4..23448d5fc 100644
--- a/criu/include/mount.h
+++ b/criu/include/mount.h
@@ -109,6 +109,7 @@ extern int mntns_get_root_by_mnt_id(int mnt_id);
 extern struct ns_id *lookup_nsid_by_mnt_id(int mnt_id);
 
 extern int open_mount(unsigned int s_dev);
+extern int check_mountpoint_fd(struct mount_info *pm, int mnt_fd);
 extern int __open_mountpoint(struct mount_info *pm, int mnt_fd);
 extern int mnt_is_dir(struct mount_info *pm);
 extern int open_mountpoint(struct mount_info *pm);
diff --git a/criu/mount.c b/criu/mount.c
index d75ca5598..f6347fd9d 100644
--- a/criu/mount.c
+++ b/criu/mount.c
@@ -1018,39 +1018,20 @@ int mnt_is_dir(struct mount_info *pm)
 	return 0;
 }
 
-/*
- * mnt_fd is a file descriptor on the mountpoint, which is closed in an error case.
- * If mnt_fd is -1, the mountpoint will be opened by this function.
- */
-int __open_mountpoint(struct mount_info *pm, int mnt_fd)
+int check_mountpoint_fd(struct mount_info *pm, int mnt_fd)
 {
 	struct stat st;
-	int dev;
-	int ret;
-
-	if (mnt_fd == -1) {
-		int mntns_root;
-
-		mntns_root = mntns_get_root_fd(pm->nsid);
-		if (mntns_root < 0)
-			return -1;
-
-		mnt_fd = openat(mntns_root, pm->ns_mountpoint, O_RDONLY);
-		if (mnt_fd < 0) {
-			pr_perror("Can't open %s", pm->ns_mountpoint);
-			return -1;
-		}
-	}
+	int ret, dev;
 
 	ret = fstat(mnt_fd, &st);
 	if (ret < 0) {
 		pr_perror("fstat(%s) failed", pm->ns_mountpoint);
-		goto err;
+		return -1;
 	}
 
 	if (pm->s_dev_rt == MOUNT_INVALID_DEV) {
 		pr_err("Resolving over invalid device for %#x %s %s\n", pm->s_dev, pm->fstype->name, pm->ns_mountpoint);
-		goto err;
+		return -1;
 	}
 
 	dev = MKKDEV(major(st.st_dev), minor(st.st_dev));
@@ -1063,13 +1044,38 @@ int __open_mountpoint(struct mount_info *pm, int mnt_fd)
 	if (dev != pm->s_dev_rt) {
 		pr_err("The file system %#x %#x (%#x) %s %s is inaccessible\n", pm->s_dev, pm->s_dev_rt, dev,
 		       pm->fstype->name, pm->ns_mountpoint);
-		goto err;
+		return -1;
+	}
+
+	return 0;
+}
+
+/*
+ * mnt_fd is a file descriptor on the mountpoint, which is closed in an error case.
+ * If mnt_fd is -1, the mountpoint will be opened by this function.
+ */
+int __open_mountpoint(struct mount_info *pm, int mnt_fd)
+{
+	if (mnt_fd == -1) {
+		int mntns_root;
+
+		mntns_root = mntns_get_root_fd(pm->nsid);
+		if (mntns_root < 0)
+			return -1;
+
+		mnt_fd = openat(mntns_root, pm->ns_mountpoint, O_RDONLY);
+		if (mnt_fd < 0) {
+			pr_perror("Can't open %s", pm->ns_mountpoint);
+			return -1;
+		}
+	}
+
+	if (check_mountpoint_fd(pm, mnt_fd)) {
+		close(mnt_fd);
+		return -1;
 	}
 
 	return mnt_fd;
-err:
-	close(mnt_fd);
-	return -1;
 }
 
 int open_mount(unsigned int s_dev)
-- 
2.34.1