[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>
This commit is contained in:
Eric Van Hensbergen 2005-09-09 13:04:23 -07:00 committed by Linus Torvalds
parent 426cc91aa6
commit 322b329ab7
5 changed files with 40 additions and 3 deletions

View file

@ -323,6 +323,26 @@ v9fs_mux_rpc(struct v9fs_session_info *v9ses, struct v9fs_fcall *tcall,
return ret; return ret;
} }
/**
* 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 * v9fs_recvproc - kproc to handle demultiplexing responses
* @data: session info structure * @data: session info structure

View file

@ -37,3 +37,4 @@ struct v9fs_rpcreq {
int v9fs_mux_init(struct v9fs_session_info *v9ses, const char *dev_name); int v9fs_mux_init(struct v9fs_session_info *v9ses, const char *dev_name);
long v9fs_mux_rpc(struct v9fs_session_info *v9ses, long v9fs_mux_rpc(struct v9fs_session_info *v9ses,
struct v9fs_fcall *tcall, struct v9fs_fcall **rcall); struct v9fs_fcall *tcall, struct v9fs_fcall **rcall);
void v9fs_mux_cancel_requests(struct v9fs_session_info *v9ses, int err);

View file

@ -409,6 +409,15 @@ void v9fs_session_close(struct v9fs_session_info *v9ses)
putname(v9ses->remotename); 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); extern int v9fs_error_init(void);
/** /**

View file

@ -89,9 +89,7 @@ struct v9fs_session_info *v9fs_inode2v9ses(struct inode *);
void v9fs_session_close(struct v9fs_session_info *v9ses); void v9fs_session_close(struct v9fs_session_info *v9ses);
int v9fs_get_idpool(struct v9fs_idpool *p); int v9fs_get_idpool(struct v9fs_idpool *p);
void v9fs_put_idpool(int id, 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); void v9fs_session_cancel(struct v9fs_session_info *v9ses);
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);
#define V9FS_MAGIC 0x01021997 #define V9FS_MAGIC 0x01021997

View file

@ -257,10 +257,19 @@ static int v9fs_show_options(struct seq_file *m, struct vfsmount *mnt)
return 0; 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 = { static struct super_operations v9fs_super_ops = {
.statfs = simple_statfs, .statfs = simple_statfs,
.clear_inode = v9fs_clear_inode, .clear_inode = v9fs_clear_inode,
.show_options = v9fs_show_options, .show_options = v9fs_show_options,
.umount_begin = v9fs_umount_begin,
}; };
struct file_system_type v9fs_fs_type = { struct file_system_type v9fs_fs_type = {