[CRIU] [PATCH 04/14] crtools: add ability to create and close a service fd
Andrew Vagin
avagin at parallels.com
Fri Jan 11 06:15:28 EST 2013
On Fri, Jan 11, 2013 at 02:34:49PM +0400, Pavel Emelyanov wrote:
> On 01/11/2013 01:22 PM, Andrey Vagin wrote:
> > A service fd should be created, otherwise get_service_fd returns -1
> >
> > v2: rename open_service_fd to install_service_fd
> >
> > Signed-off-by: Andrey Vagin <avagin at openvz.org>
> > ---
> > include/crtools.h | 2 ++
> > util.c | 35 +++++++++++++++++++++++++++++++++++
> > 2 files changed, 37 insertions(+)
> >
> > diff --git a/include/crtools.h b/include/crtools.h
> > index 64e11dd..a8813b3 100644
> > --- a/include/crtools.h
> > +++ b/include/crtools.h
> > @@ -124,6 +124,8 @@ enum sfd_type {
> > extern int clone_service_fd(int id);
> > extern int init_service_fd(void);
> > extern int get_service_fd(enum sfd_type type);
> > +extern int open_service_fd(enum sfd_type type, int fd);
> > +extern int close_service_fd(enum sfd_type type);
> > extern bool is_service_fd(int fd, enum sfd_type type);
> > extern bool is_any_service_fd(int fd);
> >
> > diff --git a/util.c b/util.c
> > index af191d4..1ad0572 100644
> > --- a/util.c
> > +++ b/util.c
> > @@ -308,12 +308,47 @@ static int __get_service_fd(enum sfd_type type, int service_fd_id)
> > return service_fd_rlim_cur - type - SERVICE_FD_MAX * service_fd_id;
> > }
> >
> > +static DECLARE_BITMAP(sfd_map, SERVICE_FD_MAX);
> > +
> > +int install_service_fd(enum sfd_type type, int fd)
> > +{
> > + int sfd = __get_service_fd(type, service_fd_id);
> > +
> > + BUG_ON((int)type <= SERVICE_FD_MIN || (int)type >= SERVICE_FD_MAX);
> > +
> > + if (dup2(fd, sfd) != sfd) {
> > + pr_perror("Dup %d -> %d failed", fd, sfd);
> > + return -1;
> > + }
> > +
> > + set_bit(type, sfd_map);
> > + return sfd;
> > +}
> > +
> > int get_service_fd(enum sfd_type type)
> > {
> > BUG_ON((int)type <= SERVICE_FD_MIN || (int)type >= SERVICE_FD_MAX);
> > +
> > + if (!test_bit(type, sfd_map))
> > + return -1;
>
> This breaks git-bisect, isn't it? I mean -- right after this patch no
> service fds will be available.
Yes, this patch should be merged with the next one
>
> > +
> > return __get_service_fd(type, service_fd_id);
> > }
> >
> > +int close_service_fd(enum sfd_type type)
> > +{
> > + int fd = get_service_fd(type);
> > +
> > + if (fd < 0)
> > + return 0;
> > +
> > + if (close_safe(&fd))
> > + return -1;
> > +
> > + clear_bit(type, sfd_map);
> > + return 0;
> > +}
> > +
> > int clone_service_fd(int id)
> > {
> > int ret = -1, i;
> >
>
>
More information about the CRIU
mailing list