[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:
Родитель
426cc91aa6
Коммит
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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -409,6 +409,15 @@ void v9fs_session_close(struct v9fs_session_info *v9ses)
|
|||
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);
|
||||
|
||||
/**
|
||||
|
|
|
@ -89,9 +89,7 @@ struct v9fs_session_info *v9fs_inode2v9ses(struct inode *);
|
|||
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
|
||||
|
||||
|
|
|
@ -257,10 +257,19 @@ static int v9fs_show_options(struct seq_file *m, struct vfsmount *mnt)
|
|||
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 = {
|
||||
|
|
Загрузка…
Ссылка в новой задаче