v9fs: Support to force umount
Subsystems (2)
PATCH 1/1 v9fs: Support to force umount
[PATCH] v9fs: Support to force umount
Support for force umount
Signed-off-by Latchesar Ionkov <[email protected]>
Signed-off-by Eric Van Hensbergen <[email protected]>
---
commit 3f92b2539fe581ee9011d687fbd43cebb641465e
tree cd34696129c3b636b85578f659f260100196dee1
parent 83f1fe3d2adc3746d719e430d0a794de1f151c40
author Eric Van Hensbergen <[email protected]> Wed, 31 Aug 2005 15:53:14 -0500
committer Eric Van Hensbergen <[email protected]> Wed, 31 Aug 2005 15:53:14 -0500
fs/9p/mux.c | 20 ++++++++++++++++++++ fs/9p/mux.h | 1 + fs/9p/v9fs.c | 9 +++++++++ fs/9p/v9fs.h | 4 +--- fs/9p/vfs_super.c | 9 +++++++++ 5 files changed, 40 insertions(+), 3 deletions(-)
fs/9p/mux.c +20 -0
@@ -331,6 +331,26 @@ v9fs_mux_rpc(struct v9fs_session_info *v }/** +* 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 *
fs/9p/mux.h +0 -0
@@ -38,3 +38,4 @@ struct v9fs_rpcreq { 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);
fs/9p/v9fs.c +9 -0
@@ -414,6 +414,15 @@ void v9fs_session_close(struct v9fs_sessputname (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 );/**
fs/9p/v9fs.h +0 -3
@@ -89,9 +89,7 @@ struct v9fs_session_info *v9fs_inode2v9svoid 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
fs/9p/vfs_super.c +9 -0
@@ -257,10 +257,19 @@ static int v9fs_show_options(struct seq_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 = {