Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -109,18 +109,24 @@ struct fuse_req *fuse_get_request(struct fuse_conn *fc)
	int intr;
	sigset_t oldset;

	atomic_inc(&fc->num_waiting);
	block_sigs(&oldset);
	intr = down_interruptible(&fc->outstanding_sem);
	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)
{
	spin_lock(&fuse_lock);
	if (req->preallocated)
	if (req->preallocated) {
		atomic_dec(&fc->num_waiting);
		list_add(&req->list, &fc->unused_list);
	else
	} else
		fuse_request_free(req);

	/* If we are in debt decrease that first */
+3 −0
Original line number Diff line number Diff line
@@ -280,6 +280,9 @@ struct fuse_conn {
	/** Is create not implemented by fs? */
	unsigned no_create : 1;

	/** The number of requests waiting for completion */
	atomic_t num_waiting;

	/** Negotiated minor version */
	unsigned minor;

+9 −0
Original line number Diff line number Diff line
@@ -555,7 +555,16 @@ static struct file_system_type fuse_fs_type = {
	.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[] = {
	&fuse_conn_waiting.attr,
	NULL,
};