[PATCH] v9fs: Support to force umount
Support for force umount
Signed-off-by: Latchesar Ionkov <lucho@ionkov.net>
Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
diff --git a/fs/9p/mux.c b/fs/9p/mux.c
index 8ebc1af..0854bef 100644
--- a/fs/9p/mux.c
+++ b/fs/9p/mux.c
@@ -324,6 +324,26 @@
}
/**
+ * v9fs_mux_cancel_requests - cancels all pending requests
+ *
+ * @v9ses: session info structure
+ * @err: error code to return to the requests
+ */
+void v9fs_mux_cancel_requests(struct v9fs_session_info *v9ses, int err)
+{
+ struct v9fs_rpcreq *rptr;
+ struct v9fs_rpcreq *rreq;
+
+ dprintk(DEBUG_MUX, " %d\n", err);
+ spin_lock(&v9ses->muxlock);
+ list_for_each_entry_safe(rreq, rptr, &v9ses->mux_fcalls, next) {
+ rreq->err = err;
+ }
+ spin_unlock(&v9ses->muxlock);
+ wake_up_all(&v9ses->read_wait);
+}
+
+/**
* v9fs_recvproc - kproc to handle demultiplexing responses
* @data: session info structure
*
diff --git a/fs/9p/mux.h b/fs/9p/mux.h
index d7d8fa1..82ce793 100644
--- a/fs/9p/mux.h
+++ b/fs/9p/mux.h
@@ -37,3 +37,4 @@
int v9fs_mux_init(struct v9fs_session_info *v9ses, const char *dev_name);
long v9fs_mux_rpc(struct v9fs_session_info *v9ses,
struct v9fs_fcall *tcall, struct v9fs_fcall **rcall);
+void v9fs_mux_cancel_requests(struct v9fs_session_info *v9ses, int err);
diff --git a/fs/9p/v9fs.c b/fs/9p/v9fs.c
index a573b75..13bdbba 100644
--- a/fs/9p/v9fs.c
+++ b/fs/9p/v9fs.c
@@ -409,6 +409,15 @@
putname(v9ses->remotename);
}
+/**
+ * v9fs_session_cancel - mark transport as disconnected
+ * and cancel all pending requests.
+ */
+void v9fs_session_cancel(struct v9fs_session_info *v9ses) {
+ v9ses->transport->status = Disconnected;
+ v9fs_mux_cancel_requests(v9ses, -EIO);
+}
+
extern int v9fs_error_init(void);
/**
diff --git a/fs/9p/v9fs.h b/fs/9p/v9fs.h
index 5220302..45dcef4 100644
--- a/fs/9p/v9fs.h
+++ b/fs/9p/v9fs.h
@@ -89,9 +89,7 @@
void v9fs_session_close(struct v9fs_session_info *v9ses);
int v9fs_get_idpool(struct v9fs_idpool *p);
void v9fs_put_idpool(int id, struct v9fs_idpool *p);
-int v9fs_get_option(char *opts, char *name, char *buf, int buflen);
-long long v9fs_get_int_option(char *opts, char *name, long long dflt);
-int v9fs_parse_tcp_devname(const char *devname, char **addr, char **remotename);
+void v9fs_session_cancel(struct v9fs_session_info *v9ses);
#define V9FS_MAGIC 0x01021997
diff --git a/fs/9p/vfs_super.c b/fs/9p/vfs_super.c
index ce0778a..868f350 100644
--- a/fs/9p/vfs_super.c
+++ b/fs/9p/vfs_super.c
@@ -257,10 +257,19 @@
return 0;
}
+static void
+v9fs_umount_begin(struct super_block *sb)
+{
+ struct v9fs_session_info *v9ses = sb->s_fs_info;
+
+ v9fs_session_cancel(v9ses);
+}
+
static struct super_operations v9fs_super_ops = {
.statfs = simple_statfs,
.clear_inode = v9fs_clear_inode,
.show_options = v9fs_show_options,
+ .umount_begin = v9fs_umount_begin,
};
struct file_system_type v9fs_fs_type = {