From 86efbff13d082bb11e86c7af01b3beb8aa720eeb Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Mon, 16 Jan 2006 22:14:38 -0800 Subject: [PATCH] --- yaml --- r: 18655 b: refs/heads/master c: 0cd5b88553acf0611474dbaf8e43770eed268060 h: refs/heads/master i: 18653: a36721781ed9a7f5722db3468e027e7f742dfb19 18651: b1fce270ef7acfd259613b0adddab1407e26d245 18647: 00cd8febc2fa9e673cba59a2d953bf55ed7cbe1e 18639: cb4b3b44c3a452e2d391988d38788a5b621fd390 18623: 45c7aa2a11ea3629ea92a8e6ba4af78968db7925 v: v3 --- [refs] | 2 +- trunk/fs/fuse/dev.c | 12 +++++++++--- trunk/fs/fuse/fuse_i.h | 3 +++ trunk/fs/fuse/inode.c | 9 +++++++++ 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 643a51caab10..7378ca46b80d 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f543f253f3aa721a24557d7df8259145bb01b734 +refs/heads/master: 0cd5b88553acf0611474dbaf8e43770eed268060 diff --git a/trunk/fs/fuse/dev.c b/trunk/fs/fuse/dev.c index de4a0a0bda8a..c72e44b58d09 100644 --- a/trunk/fs/fuse/dev.c +++ b/trunk/fs/fuse/dev.c @@ -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 */ diff --git a/trunk/fs/fuse/fuse_i.h b/trunk/fs/fuse/fuse_i.h index 6ef1e5f5873b..bcb453f68111 100644 --- a/trunk/fs/fuse/fuse_i.h +++ b/trunk/fs/fuse/fuse_i.h @@ -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; diff --git a/trunk/fs/fuse/inode.c b/trunk/fs/fuse/inode.c index 514b700c863d..182235923cdd 100644 --- a/trunk/fs/fuse/inode.c +++ b/trunk/fs/fuse/inode.c @@ -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, };