[CRIU] [PATCH v2 1/4] files-reg: Refactor create_ghost()
Kirill Tkhai
ktkhai at odin.com
Tue Dec 22 03:43:07 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. Also, parameter
gf will be used.
Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
files-reg.c | 46 ++++++++++++++++++++++++----------------------
1 file changed, 24 insertions(+), 22 deletions(-)
diff --git a/files-reg.c b/files-reg.c
index 9aa2481..c1b2e28 100644
--- a/files-reg.c
+++ b/files-reg.c
@@ -95,10 +95,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) {
@@ -114,7 +128,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");
@@ -125,40 +138,29 @@ 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;
}
- if (fchmod(gfd, gfe->mode)) {
+ if (chmod(path, gfe->mode)) {
pr_perror("Can't set perms %o on ghost %s", gfe->mode, path);
- goto err_c;
+ goto err;
}
ret = 0;
-err_c:
- close(gfd);
err:
return ret;
}
More information about the CRIU
mailing list