mirror of
https://github.com/checkpoint-restore/criu.git
synced 2026-07-17 16:47:50 +00:00
memfd: don't set fd attributes not needed for vma mapping
There is only one user of memfd_open() outside of memfd.c: open_filemap(). It is restoring a file-backed mapping and doesn't need nor expect to update F_SETOWN nor the fd's position. Check the inherited_fd() handling in the callers to simplify the code. Signed-off-by: Michał Mirosław <emmir@google.com>
This commit is contained in:
parent
8c17535f3f
commit
0085f992cb
2 changed files with 25 additions and 24 deletions
|
|
@ -2508,7 +2508,8 @@ static int open_filemap(int pid, struct vma_area *vma)
|
|||
*/
|
||||
ret = dup(plugin_fd);
|
||||
} else if (vma->e->status & VMA_AREA_MEMFD) {
|
||||
ret = memfd_open(vma->vmfd, &flags);
|
||||
if (!inherited_fd(vma->vmfd, &ret))
|
||||
ret = memfd_open(vma->vmfd, &flags);
|
||||
} else {
|
||||
ret = open_path(vma->vmfd, do_open_reg_noseek_flags, &flags);
|
||||
}
|
||||
|
|
|
|||
46
criu/memfd.c
46
criu/memfd.c
|
|
@ -331,14 +331,11 @@ int memfd_open(struct file_desc *d, u32 *fdflags)
|
|||
mfi = container_of(d, struct memfd_info, d);
|
||||
mfe = mfi->mfe;
|
||||
|
||||
if (inherited_fd(d, &fd))
|
||||
return fd;
|
||||
|
||||
pr_info("Restoring memfd id=%d\n", mfe->id);
|
||||
|
||||
fd = memfd_open_inode(mfi->inode);
|
||||
if (fd < 0)
|
||||
goto err;
|
||||
return -1;
|
||||
|
||||
/* Reopen the fd with original permissions */
|
||||
flags = fdflags ? *fdflags : mfe->flags;
|
||||
|
|
@ -348,40 +345,43 @@ int memfd_open(struct file_desc *d, u32 *fdflags)
|
|||
* important though.
|
||||
*/
|
||||
_fd = __open_proc(PROC_SELF, 0, flags, "fd/%d", fd);
|
||||
if (_fd < 0) {
|
||||
if (_fd < 0)
|
||||
pr_perror("Can't reopen memfd id=%d", mfe->id);
|
||||
goto err;
|
||||
}
|
||||
|
||||
close(fd);
|
||||
fd = _fd;
|
||||
return _fd;
|
||||
}
|
||||
|
||||
static int memfd_open_fe_fd(struct file_desc *d, int *new_fd)
|
||||
{
|
||||
MemfdFileEntry *mfe;
|
||||
int fd;
|
||||
|
||||
if (inherited_fd(d, new_fd))
|
||||
return 0;
|
||||
|
||||
fd = memfd_open(d, NULL);
|
||||
if (fd < 0)
|
||||
return -1;
|
||||
|
||||
mfe = container_of(d, struct memfd_info, d)->mfe;
|
||||
|
||||
if (restore_fown(fd, mfe->fown) < 0)
|
||||
goto err;
|
||||
|
||||
if (lseek(fd, mfe->pos, SEEK_SET) < 0) {
|
||||
pr_perror("Can't restore file position of memfd id=%d", mfe->id);
|
||||
pr_perror("Can't restore file position of %d for memfd id=%d", fd, mfe->id);
|
||||
goto err;
|
||||
}
|
||||
|
||||
return fd;
|
||||
*new_fd = fd;
|
||||
return 0;
|
||||
|
||||
err:
|
||||
if (fd >= 0)
|
||||
close(fd);
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int memfd_open_fe_fd(struct file_desc *fd, int *new_fd)
|
||||
{
|
||||
int tmp;
|
||||
|
||||
tmp = memfd_open(fd, NULL);
|
||||
if (tmp < 0)
|
||||
return -1;
|
||||
*new_fd = tmp;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static char *memfd_d_name(struct file_desc *d, char *buf, size_t s)
|
||||
{
|
||||
MemfdInodeEntry *mie = NULL;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue