libvirt/src/lxc/lxc_fuse.h
Daniel P. Berrange 3563c51d3e Avoid async signal safety problem in glibc's setxid
The glibc setxid is supposed to be async signal safe, but
libc developers confirm that it is not. This causes a problem
when libvirt_lxc starts the FUSE thread and then runs clone()
to start the container. If the clone() was done before the
FUSE thread has completely started up, then the container
will hang in setxid after clone().

The fix is to avoid creating any threads until after the
container has been clone()'d. By avoiding any threads in
the parent, the child is no longer required to run in an
async signal safe context, and we thus avoid the glibc
bug.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-11-18 15:36:23 +00:00

65 lines
1.8 KiB
C

/*
* Copyright (C) 2012 Fujitsu Limited.
*
* lxc_fuse.c: fuse filesystem support for libvirt lxc
*
* Authors:
* Gao feng <gaofeng at cn.fujitsu.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see
* <http://www.gnu.org/licenses/>.
*/
#ifndef LXC_FUSE_H
# define LXC_FUSE_H
# define FUSE_USE_VERSION 26
# if WITH_FUSE
# include <fuse.h>
# endif
# include "lxc_conf.h"
# include "viralloc.h"
struct virLXCMeminfo {
unsigned long long memtotal;
unsigned long long memusage;
unsigned long long cached;
unsigned long long active_anon;
unsigned long long inactive_anon;
unsigned long long active_file;
unsigned long long inactive_file;
unsigned long long unevictable;
unsigned long long swaptotal;
unsigned long long swapusage;
};
typedef struct virLXCMeminfo *virLXCMeminfoPtr;
struct virLXCFuse {
virDomainDefPtr def;
virThread thread;
char *mountpoint;
struct fuse *fuse;
struct fuse_chan *ch;
virMutex lock;
};
typedef struct virLXCFuse *virLXCFusePtr;
extern int lxcSetupFuse(virLXCFusePtr *f, virDomainDefPtr def);
extern int lxcStartFuse(virLXCFusePtr f);
extern void lxcFreeFuse(virLXCFusePtr *f);
#endif /* LXC_FUSE_H */