[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: Miklos Szeredi <miklos@szeredi.hu> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
f543f253f3
commit
0cd5b88553
@ -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 {
|
|||||||
/** 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 = {
|
|||||||
.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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user