Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 25557
b: refs/heads/master
c: 08a53cd
h: refs/heads/master
i:
  25555: 2bcd3cf
v: v3
  • Loading branch information
Miklos Szeredi authored and Linus Torvalds committed Apr 11, 2006
1 parent 9d9fc54 commit e613514
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 5 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: ce1d5a491f0ee50560416a73faa5e4ddbab074bd
refs/heads/master: 08a53cdce62d37d918530bbbf726cc01b21dc3d1
24 changes: 20 additions & 4 deletions trunk/fs/fuse/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,17 @@ static void __fuse_put_request(struct fuse_req *req)

struct fuse_req *fuse_get_req(struct fuse_conn *fc)
{
struct fuse_req *req = fuse_request_alloc();
struct fuse_req *req;
sigset_t oldset;
int err;

block_sigs(&oldset);
err = wait_event_interruptible(fc->blocked_waitq, !fc->blocked);
restore_sigs(&oldset);
if (err)
return ERR_PTR(-EINTR);

req = fuse_request_alloc();
if (!req)
return ERR_PTR(-ENOMEM);

Expand Down Expand Up @@ -118,6 +128,11 @@ void fuse_release_background(struct fuse_conn *fc, struct fuse_req *req)
fput(req->file);
spin_lock(&fc->lock);
list_del(&req->bg_entry);
if (fc->num_background == FUSE_MAX_BACKGROUND) {
fc->blocked = 0;
wake_up_all(&fc->blocked_waitq);
}
fc->num_background--;
spin_unlock(&fc->lock);
}

Expand Down Expand Up @@ -195,6 +210,9 @@ static void background_request(struct fuse_conn *fc, struct fuse_req *req)
{
req->background = 1;
list_add(&req->bg_entry, &fc->background);
fc->num_background++;
if (fc->num_background == FUSE_MAX_BACKGROUND)
fc->blocked = 1;
if (req->inode)
req->inode = igrab(req->inode);
if (req->inode2)
Expand Down Expand Up @@ -288,6 +306,7 @@ void request_send(struct fuse_conn *fc, struct fuse_req *req)
static void request_send_nowait(struct fuse_conn *fc, struct fuse_req *req)
{
spin_lock(&fc->lock);
background_request(fc, req);
if (fc->connected) {
queue_request(fc, req);
spin_unlock(&fc->lock);
Expand All @@ -306,9 +325,6 @@ void request_send_noreply(struct fuse_conn *fc, struct fuse_req *req)
void request_send_background(struct fuse_conn *fc, struct fuse_req *req)
{
req->isreply = 1;
spin_lock(&fc->lock);
background_request(fc, req);
spin_unlock(&fc->lock);
request_send_nowait(fc, req);
}

Expand Down
14 changes: 14 additions & 0 deletions trunk/fs/fuse/fuse_i.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@
/** Max number of pages that can be used in a single read request */
#define FUSE_MAX_PAGES_PER_REQ 32

/** Maximum number of outstanding background requests */
#define FUSE_MAX_BACKGROUND 10

/** It could be as large as PATH_MAX, but would that have any uses? */
#define FUSE_NAME_MAX 1024

Expand Down Expand Up @@ -241,6 +244,17 @@ struct fuse_conn {
interrupted request) */
struct list_head background;

/** Number of requests currently in the background */
unsigned num_background;

/** Flag indicating if connection is blocked. This will be
the case before the INIT reply is received, and if there
are too many outstading backgrounds requests */
int blocked;

/** waitq for blocked connection */
wait_queue_head_t blocked_waitq;

/** RW semaphore for exclusion with fuse_put_super() */
struct rw_semaphore sbput_sem;

Expand Down
4 changes: 4 additions & 0 deletions trunk/fs/fuse/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -381,6 +381,7 @@ static struct fuse_conn *new_conn(void)
if (fc) {
spin_lock_init(&fc->lock);
init_waitqueue_head(&fc->waitq);
init_waitqueue_head(&fc->blocked_waitq);
INIT_LIST_HEAD(&fc->pending);
INIT_LIST_HEAD(&fc->processing);
INIT_LIST_HEAD(&fc->io);
Expand All @@ -392,6 +393,7 @@ static struct fuse_conn *new_conn(void)
fc->bdi.ra_pages = (VM_MAX_READAHEAD * 1024) / PAGE_CACHE_SIZE;
fc->bdi.unplug_io_fn = default_unplug_io_fn;
fc->reqctr = 0;
fc->blocked = 1;
}
return fc;
}
Expand Down Expand Up @@ -438,6 +440,8 @@ static void process_init_reply(struct fuse_conn *fc, struct fuse_req *req)
fc->max_write = arg->minor < 5 ? 4096 : arg->max_write;
}
fuse_put_request(fc, req);
fc->blocked = 0;
wake_up_all(&fc->blocked_waitq);
}

static void fuse_send_init(struct fuse_conn *fc, struct fuse_req *req)
Expand Down

0 comments on commit e613514

Please sign in to comment.