[CRIU] [PATCH 1/3] files-reg: Refactor create_ghost()

Kirill Tkhai ktkhai at odin.com
Tue Dec 15 05:29:03 PST 2015


In the most cases, file descriptor is not need in this function.
We can use chown() instead of fchown(), and operate with a path
directly.

The patch moves copying content of a regular file to new function
mkreg_ghost(). This will be used in next patches.

Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
 files-reg.c |   42 ++++++++++++++++++++++--------------------
 1 file changed, 22 insertions(+), 20 deletions(-)

diff --git a/files-reg.c b/files-reg.c
index 425dc04..8469417 100644
--- a/files-reg.c
+++ b/files-reg.c
@@ -94,10 +94,24 @@ static int note_link_remap(char *path, struct ns_id *nsid)
 	return -1;
 }
 
+static int mkreg_ghost(char *path, u32 mode, struct ghost_file *gf, struct cr_img *img)
+{
+	int gfd, ret;
+
+	gfd = open(path, O_WRONLY | O_CREAT | O_EXCL, mode);
+	if (gfd < 0)
+		return -1;
+
+	ret = copy_file(img_raw_fd(img), gfd, 0);
+	close(gfd);
+
+	return ret;
+}
+
 static int create_ghost(struct ghost_file *gf, GhostFileEntry *gfe, struct cr_img *img)
 {
-	int gfd, ghost_flags, ret;
 	char path[PATH_MAX];
+	int ret;
 
 	ret = rst_get_mnt_root(gf->remap.rmnt_id, path, sizeof(path));
 	if (ret < 0) {
@@ -113,7 +127,6 @@ static int create_ghost(struct ghost_file *gf, GhostFileEntry *gfe, struct cr_im
 			pr_perror("Can't create node for ghost file");
 			goto err;
 		}
-		ghost_flags = O_RDWR; /* To not block */
 	} else if (S_ISCHR(gfe->mode) || S_ISBLK(gfe->mode)) {
 		if (!gfe->has_rdev) {
 			pr_err("No rdev for ghost device\n");
@@ -124,35 +137,24 @@ static int create_ghost(struct ghost_file *gf, GhostFileEntry *gfe, struct cr_im
 			pr_perror("Can't create node for ghost dev");
 			goto err;
 		}
-		ghost_flags = O_WRONLY;
 	} else if (S_ISDIR(gfe->mode)) {
 		if (mkdir(path, gfe->mode)) {
 			pr_perror("Can't make ghost dir");
 			goto err;
 		}
-		ghost_flags = O_DIRECTORY;
-	} else
-		ghost_flags = O_WRONLY | O_CREAT | O_EXCL;
-
-	gfd = open(path, ghost_flags, gfe->mode);
-	if (gfd < 0) {
-		pr_perror("Can't open ghost file %s", path);
-		goto err;
+	} else {
+		if (mkreg_ghost(path, gfe->mode, gf, img)) {
+			pr_perror("Can't create ghost regfile\n");
+			goto err;
+		}
 	}
 
-	if (fchown(gfd, gfe->uid, gfe->gid) < 0) {
+	if (chown(path, gfe->uid, gfe->gid) < 0) {
 		pr_perror("Can't reset user/group on ghost %s", path);
-		goto err_c;
-	}
-
-	if (S_ISREG(gfe->mode)) {
-		if (copy_file(img_raw_fd(img), gfd, 0) < 0)
-			goto err_c;
+		goto err;
 	}
 
 	ret = 0;
-err_c:
-	close(gfd);
 err:
 	return ret;
 }



More information about the CRIU mailing list