Browse Source

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>
Maxim Patlasov 12 years ago
parent
commit
796523fb24
4 changed files with 9 additions and 0 deletions
  1. 1 0
      fs/fuse/cuse.c
  2. 1 0
      fs/fuse/dev.c
  3. 4 0
      fs/fuse/fuse_i.h
  4. 3 0
      fs/fuse/inode.c

+ 1 - 0
fs/fuse/cuse.c

@@ -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);

+ 1 - 0
fs/fuse/dev.c

@@ -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);

+ 4 - 0
fs/fuse/fuse_i.h

@@ -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 */

+ 3 - 0
fs/fuse/inode.c

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