From: Eric Van Hensbergen Support for force umount Signed-off-by: Latchesar Ionkov Signed-off-by: Eric Van Hensbergen Signed-off-by: Andrew Morton --- 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(-) diff -puN fs/9p/mux.c~v9fs-support-to-force-umount fs/9p/mux.c --- devel/fs/9p/mux.c~v9fs-support-to-force-umount 2005-09-03 16:20:08.000000000 -0700 +++ devel-akpm/fs/9p/mux.c 2005-09-03 16:20:08.000000000 -0700 @@ -324,6 +324,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 * diff -puN fs/9p/mux.h~v9fs-support-to-force-umount fs/9p/mux.h --- devel/fs/9p/mux.h~v9fs-support-to-force-umount 2005-09-03 16:20:08.000000000 -0700 +++ devel-akpm/fs/9p/mux.h 2005-09-03 16:20:08.000000000 -0700 @@ -37,3 +37,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); diff -puN fs/9p/v9fs.c~v9fs-support-to-force-umount fs/9p/v9fs.c --- devel/fs/9p/v9fs.c~v9fs-support-to-force-umount 2005-09-03 16:20:08.000000000 -0700 +++ devel-akpm/fs/9p/v9fs.c 2005-09-03 16:20:08.000000000 -0700 @@ -409,6 +409,15 @@ void v9fs_session_close(struct v9fs_sess 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 -puN fs/9p/v9fs.h~v9fs-support-to-force-umount fs/9p/v9fs.h --- devel/fs/9p/v9fs.h~v9fs-support-to-force-umount 2005-09-03 16:20:08.000000000 -0700 +++ devel-akpm/fs/9p/v9fs.h 2005-09-03 16:20:08.000000000 -0700 @@ -89,9 +89,7 @@ struct v9fs_session_info *v9fs_inode2v9s 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 -puN fs/9p/vfs_super.c~v9fs-support-to-force-umount fs/9p/vfs_super.c --- devel/fs/9p/vfs_super.c~v9fs-support-to-force-umount 2005-09-03 16:20:08.000000000 -0700 +++ devel-akpm/fs/9p/vfs_super.c 2005-09-03 16:20:08.000000000 -0700 @@ -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 = { _