+2008-11-19 Miklos Szeredi <miklos@szeredi.hu>
+
+ * lowlevel lib: fix deadlock if fuse_reply_* is called from the
+ interrupt handling function. Reported by Tero Marttila
+
2008-10-16 Miklos Szeredi <miklos@szeredi.hu>
* Allow commas in options to be escaped with a backslash
int ctr;
struct fuse_ll *f = req->f;
- pthread_mutex_lock(&req->lock);
+ pthread_mutex_lock(&f->lock);
req->u.ni.func = NULL;
req->u.ni.data = NULL;
- pthread_mutex_unlock(&req->lock);
-
- pthread_mutex_lock(&f->lock);
list_del_req(req);
ctr = --req->ctr;
pthread_mutex_unlock(&f->lock);
for (curr = f->list.next; curr != &f->list; curr = curr->next) {
if (curr->unique == req->u.i.unique) {
+ fuse_interrupt_func_t func;
+ void *data;
+
curr->ctr++;
pthread_mutex_unlock(&f->lock);
pthread_mutex_lock(&curr->lock);
pthread_mutex_lock(&f->lock);
curr->interrupted = 1;
+ func = curr->u.ni.func;
+ data = curr->u.ni.data;
pthread_mutex_unlock(&f->lock);
- if (curr->u.ni.func)
- curr->u.ni.func(curr, curr->u.ni.data);
+ if (func)
+ func(curr, data);
pthread_mutex_unlock(&curr->lock);
pthread_mutex_lock(&f->lock);
void *data)
{
pthread_mutex_lock(&req->lock);
+ pthread_mutex_lock(&req->f->lock);
req->u.ni.func = func;
req->u.ni.data = data;
+ pthread_mutex_unlock(&req->f->lock);
if (req->interrupted && func)
func(req, data);
pthread_mutex_unlock(&req->lock);