Commit 0cd5b885 authored by Miklos Szeredi's avatar Miklos Szeredi Committed by Linus Torvalds

[PATCH] fuse: add number of waiting requests attribute

This patch adds the 'waiting' attribute which indicates how many filesystem
requests are currently waiting to be completed.  A non-zero value without any
filesystem activity indicates a hung or deadlocked filesystem.
Signed-off-by: default avatarMiklos Szeredi <miklos@szeredi.hu>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent f543f253
...@@ -109,18 +109,24 @@ struct fuse_req *fuse_get_request(struct fuse_conn *fc) ...@@ -109,18 +109,24 @@ struct fuse_req *fuse_get_request(struct fuse_conn *fc)
int intr; int intr;
sigset_t oldset; sigset_t oldset;
atomic_inc(&fc->num_waiting);
block_sigs(&oldset); block_sigs(&oldset);
intr = down_interruptible(&fc->outstanding_sem); intr = down_interruptible(&fc->outstanding_sem);
restore_sigs(&oldset); restore_sigs(&oldset);
return intr ? NULL : do_get_request(fc); if (intr) {
atomic_dec(&fc->num_waiting);
return NULL;
}
return do_get_request(fc);
} }
static void fuse_putback_request(struct fuse_conn *fc, struct fuse_req *req) static void fuse_putback_request(struct fuse_conn *fc, struct fuse_req *req)
{ {
spin_lock(&fuse_lock); spin_lock(&fuse_lock);
if (req->preallocated) if (req->preallocated) {
atomic_dec(&fc->num_waiting);
list_add(&req->list, &fc->unused_list); list_add(&req->list, &fc->unused_list);
else } else
fuse_request_free(req); fuse_request_free(req);
/* If we are in debt decrease that first */ /* If we are in debt decrease that first */
......
...@@ -280,6 +280,9 @@ struct fuse_conn { ...@@ -280,6 +280,9 @@ struct fuse_conn {
/** Is create not implemented by fs? */ /** Is create not implemented by fs? */
unsigned no_create : 1; unsigned no_create : 1;
/** The number of requests waiting for completion */
atomic_t num_waiting;
/** Negotiated minor version */ /** Negotiated minor version */
unsigned minor; unsigned minor;
......
...@@ -555,7 +555,16 @@ static struct file_system_type fuse_fs_type = { ...@@ -555,7 +555,16 @@ static struct file_system_type fuse_fs_type = {
.kill_sb = kill_anon_super, .kill_sb = kill_anon_super,
}; };
static ssize_t fuse_conn_waiting_show(struct fuse_conn *fc, char *page)
{
return sprintf(page, "%i\n", atomic_read(&fc->num_waiting));
}
static struct fuse_conn_attr fuse_conn_waiting =
__ATTR(waiting, 0400, fuse_conn_waiting_show, NULL);
static struct attribute *fuse_conn_attrs[] = { static struct attribute *fuse_conn_attrs[] = {
&fuse_conn_waiting.attr,
NULL, NULL,
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment