[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:
parent
426cc91aa6
commit
322b329ab7
20
fs/9p/mux.c
20
fs/9p/mux.c
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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 = {
|
||||||
|
|
Loading…
Reference in New Issue