b=20903
i=rread
i=dmitry
Prevent deadlock if obd_zombie_barrier() is called from the zombie thread context.
static struct completion obd_zombie_stop;
static unsigned long obd_zombie_flags;
static cfs_waitq_t obd_zombie_waitq;
static struct completion obd_zombie_stop;
static unsigned long obd_zombie_flags;
static cfs_waitq_t obd_zombie_waitq;
+static pid_t obd_zombie_pid;
enum {
OBD_ZOMBIE_STOP = 1 << 1
enum {
OBD_ZOMBIE_STOP = 1 << 1
void obd_zombie_barrier(void)
{
struct l_wait_info lwi = { 0 };
void obd_zombie_barrier(void)
{
struct l_wait_info lwi = { 0 };
+
+ if (obd_zombie_pid == cfs_curproc_pid())
+ /* don't wait for myself */
+ return;
l_wait_event(obd_zombie_waitq, obd_zombie_is_idle(), &lwi);
}
EXPORT_SYMBOL(obd_zombie_barrier);
l_wait_event(obd_zombie_waitq, obd_zombie_is_idle(), &lwi);
}
EXPORT_SYMBOL(obd_zombie_barrier);
complete(&obd_zombie_start);
complete(&obd_zombie_start);
+ obd_zombie_pid = cfs_curproc_pid();
+
while(!test_bit(OBD_ZOMBIE_STOP, &obd_zombie_flags)) {
struct l_wait_info lwi = { 0 };
while(!test_bit(OBD_ZOMBIE_STOP, &obd_zombie_flags)) {
struct l_wait_info lwi = { 0 };
init_completion(&obd_zombie_start);
init_completion(&obd_zombie_stop);
cfs_waitq_init(&obd_zombie_waitq);
init_completion(&obd_zombie_start);
init_completion(&obd_zombie_stop);
cfs_waitq_init(&obd_zombie_waitq);
#ifdef __KERNEL__
rc = cfs_kernel_thread(obd_zombie_impexp_thread, NULL, 0);
#ifdef __KERNEL__
rc = cfs_kernel_thread(obd_zombie_impexp_thread, NULL, 0);