Skip to content

Commit

Permalink
memfd: make memfd_open() skip fd attributes not needed for vma mapping
Browse files Browse the repository at this point in the history
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 to F_SETOWN
nor update the fd's position.

Signed-off-by: Michał Mirosław <emmir@google.com>
  • Loading branch information
osctobe committed Aug 21, 2023
1 parent e1cda9f commit e217a75
Showing 1 changed file with 17 additions and 13 deletions.
30 changes: 17 additions & 13 deletions criu/memfd.c
Original file line number Diff line number Diff line change
Expand Up @@ -355,14 +355,6 @@ int memfd_open(struct file_desc *d, u32 *fdflags)
close(fd);
fd = _fd;

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);
goto err;
}

return fd;

err:
Expand All @@ -371,14 +363,26 @@ int memfd_open(struct file_desc *d, u32 *fdflags)
return -1;
}

static int memfd_open_fe_fd(struct file_desc *fd, int *new_fd)
static int memfd_open_fe_fd(struct file_desc *d, int *new_fd)
{
int tmp;
MemfdFileEntry *mfe;
int fd;

tmp = memfd_open(fd, NULL);
if (tmp < 0)
fd = memfd_open(d, NULL);
if (fd < 0)
return -1;
*new_fd = tmp;

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 %d for memfd id=%d", fd, mfe->id);
goto err;
}

*new_fd = fd;
return 0;
}

Expand Down

0 comments on commit e217a75

Please sign in to comment.