Commit 796523fb authored by Maxim Patlasov's avatar Maxim Patlasov Committed by Miklos Szeredi

fuse: add flag fc->initialized

Existing flag fc->blocked is used to suspend request allocation both in case
of many background request submitted and period of time before init_reply
arrives from userspace. Next patch will skip blocking allocations of
synchronous request (disregarding fc->blocked). This is mostly OK, but
we still need to suspend allocations if init_reply is not arrived yet. The
patch introduces flag fc->initialized which will serve this purpose.
Signed-off-by: default avatarMaxim Patlasov <mpatlasov@parallels.com>
Signed-off-by: default avatarMiklos Szeredi <mszeredi@suse.cz>
parent 8b41e671
...@@ -505,6 +505,7 @@ static int cuse_channel_open(struct inode *inode, struct file *file) ...@@ -505,6 +505,7 @@ static int cuse_channel_open(struct inode *inode, struct file *file)
cc->fc.connected = 1; cc->fc.connected = 1;
cc->fc.blocked = 0; cc->fc.blocked = 0;
cc->fc.initialized = 1;
rc = cuse_send_init(cc); rc = cuse_send_init(cc);
if (rc) { if (rc) {
fuse_conn_put(&cc->fc); fuse_conn_put(&cc->fc);
......
...@@ -2087,6 +2087,7 @@ void fuse_abort_conn(struct fuse_conn *fc) ...@@ -2087,6 +2087,7 @@ void fuse_abort_conn(struct fuse_conn *fc)
if (fc->connected) { if (fc->connected) {
fc->connected = 0; fc->connected = 0;
fc->blocked = 0; fc->blocked = 0;
fc->initialized = 1;
end_io_requests(fc); end_io_requests(fc);
end_queued_requests(fc); end_queued_requests(fc);
end_polls(fc); end_polls(fc);
......
...@@ -417,6 +417,10 @@ struct fuse_conn { ...@@ -417,6 +417,10 @@ struct fuse_conn {
/** Batching of FORGET requests (positive indicates FORGET batch) */ /** Batching of FORGET requests (positive indicates FORGET batch) */
int forget_batch; int forget_batch;
/** Flag indicating that INIT reply has been received. Allocating
* any fuse request will be suspended until the flag is set */
int initialized;
/** Flag indicating if connection is blocked. This will be /** Flag indicating if connection is blocked. This will be
the case before the INIT reply is received, and if there the case before the INIT reply is received, and if there
are too many outstading backgrounds requests */ are too many outstading backgrounds requests */
......
...@@ -363,6 +363,7 @@ void fuse_conn_kill(struct fuse_conn *fc) ...@@ -363,6 +363,7 @@ void fuse_conn_kill(struct fuse_conn *fc)
spin_lock(&fc->lock); spin_lock(&fc->lock);
fc->connected = 0; fc->connected = 0;
fc->blocked = 0; fc->blocked = 0;
fc->initialized = 1;
spin_unlock(&fc->lock); spin_unlock(&fc->lock);
/* Flush all readers on this fs */ /* Flush all readers on this fs */
kill_fasync(&fc->fasync, SIGIO, POLL_IN); kill_fasync(&fc->fasync, SIGIO, POLL_IN);
...@@ -583,6 +584,7 @@ void fuse_conn_init(struct fuse_conn *fc) ...@@ -583,6 +584,7 @@ void fuse_conn_init(struct fuse_conn *fc)
fc->polled_files = RB_ROOT; fc->polled_files = RB_ROOT;
fc->reqctr = 0; fc->reqctr = 0;
fc->blocked = 1; fc->blocked = 1;
fc->initialized = 0;
fc->attr_version = 1; fc->attr_version = 1;
get_random_bytes(&fc->scramble_key, sizeof(fc->scramble_key)); get_random_bytes(&fc->scramble_key, sizeof(fc->scramble_key));
} }
...@@ -882,6 +884,7 @@ static void process_init_reply(struct fuse_conn *fc, struct fuse_req *req) ...@@ -882,6 +884,7 @@ static void process_init_reply(struct fuse_conn *fc, struct fuse_req *req)
fc->conn_init = 1; fc->conn_init = 1;
} }
fc->blocked = 0; fc->blocked = 0;
fc->initialized = 1;
wake_up_all(&fc->blocked_waitq); wake_up_all(&fc->blocked_waitq);
} }
......
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