[CRIU] p.haul: mtouch test "Pre-dump failed"
Andrew Vagin
avagin at parallels.com
Sun Mar 30 02:41:43 PDT 2014
On Sat, Mar 29, 2014 at 10:44:03PM +0400, Cyrill Gorcunov wrote:
> From cd6596469161ea85ffb03b0f2ab576509e83a187 Mon Sep 17 00:00:00 2001
> From: Cyrill Gorcunov <gorcunov at openvz.org>
> Date: Sat, 29 Mar 2014 22:43:14 +0400
> Subject: [PATCH] files: predump_one_fd -- Use direct read of pid's fd link
>
> Using O_PATH known to be buggy on 3.11 kernel so use
> direct link reading procedure here.
>
> Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
> ---
> files.c | 34 ++++++++++------------------------
> 1 file changed, 10 insertions(+), 24 deletions(-)
>
> diff --git a/files.c b/files.c
> index 3cf5e470c5c0..a99c66b21e77 100644
> --- a/files.c
> +++ b/files.c
> @@ -405,33 +405,20 @@ err:
>
> static int predump_one_fd(int pid, int fd)
> {
> - int lfd, ret = 0;
> - struct statfs buf;
> const struct fdtype_ops *ops;
> - char link[32];
> -
> - /*
> - * This should look like the dump_task_files_seized,
> - * but since we pre-dump only *notify-s, we use the
> - * enightened version without fds draining.
> - */
> -
> - lfd = __open_proc(pid, O_PATH | O_RDONLY, "fd/%d", fd);
> - if (lfd < 0)
> - return 0; /* That's OK, it can be a socket */
> + char link[32], t[32];
> + int ret = 0;
>
> - if (fstatfs(lfd, &buf)) {
> - pr_perror("Can't fstatfs file");
> + snprintf(t, sizeof(t), "/proc/%d/fd/%d", pid, fd);
> + ret = readlink(t, link, sizeof(link));
> + if (ret < 0) {
> + pr_perror("Can't read link of fd %d", fd);
> + return -1;
> + } else if ((size_t)ret == sizeof(link)) {
> + pr_err("Buffer for read link of fd %d is too small\n", fd);
> return -1;
> }
link is only 32 bytes. Is it ok?
> -
> - if (buf.f_type != ANON_INODE_FS_MAGIC)
> - goto out;
> -
> - if (read_fd_link(lfd, link, sizeof(link)) < 0) {
> - ret = -1;
> - goto out;
> - }
> + link[ret] = 0;
>
> if (is_inotify_link(link))
> ops = &inotify_dump_ops;
> @@ -443,7 +430,6 @@ static int predump_one_fd(int pid, int fd)
> pr_debug("Pre-dumping %d's %d fd\n", pid, fd);
> ret = ops->pre_dump(pid, fd);
> out:
> - close(lfd);
> return ret;
> }
>
> --
> 1.8.3.1
>
More information about the CRIU
mailing list