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: Maxim Patlasov <mpatlasov@parallels.com>
Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
This commit is contained in:
Maxim Patlasov 2013-03-21 18:02:15 +04:00 коммит произвёл Miklos Szeredi
Родитель 8b41e6715e
Коммит 796523fb24
4 изменённых файлов: 9 добавлений и 0 удалений

Просмотреть файл

@ -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)
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 {
/** 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)
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)
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)
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);
} }