forked from Minki/linux
41e5a6ac80
Multiple races can happen when v9fs is interrupted by a signal and Tflush message is sent to the server. After v9fs sends Tflush it doesn't wait until it receives Rflush, and possibly the response of the original message. This behavior may confuse v9fs what fids are allocated by the file server. This patch fixes the races and the fid allocation. Signed-off-by: Latchesar Ionkov <lucho@ionkov.net> Cc: Eric Van Hensbergen <ericvh@hera.kernel.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
56 lines
1.9 KiB
C
56 lines
1.9 KiB
C
/*
|
|
* linux/fs/9p/mux.h
|
|
*
|
|
* Multiplexer Definitions
|
|
*
|
|
* Copyright (C) 2005 by Latchesar Ionkov <lucho@ionkov.net>
|
|
* Copyright (C) 2004 by Eric Van Hensbergen <ericvh@gmail.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2
|
|
* as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to:
|
|
* Free Software Foundation
|
|
* 51 Franklin Street, Fifth Floor
|
|
* Boston, MA 02111-1301 USA
|
|
*
|
|
*/
|
|
|
|
struct v9fs_mux_data;
|
|
struct v9fs_req;
|
|
|
|
/**
|
|
* v9fs_mux_req_callback - callback function that is called when the
|
|
* response of a request is received. The callback is called from
|
|
* a workqueue and shouldn't block.
|
|
*
|
|
* @a - the pointer that was specified when the request was send to be
|
|
* passed to the callback
|
|
* @tc - request call
|
|
* @rc - response call
|
|
* @err - error code (non-zero if error occured)
|
|
*/
|
|
typedef void (*v9fs_mux_req_callback)(struct v9fs_req *req, void *a);
|
|
|
|
int v9fs_mux_global_init(void);
|
|
void v9fs_mux_global_exit(void);
|
|
|
|
struct v9fs_mux_data *v9fs_mux_init(struct v9fs_transport *trans, int msize,
|
|
unsigned char *extended);
|
|
void v9fs_mux_destroy(struct v9fs_mux_data *);
|
|
|
|
int v9fs_mux_send(struct v9fs_mux_data *m, struct v9fs_fcall *tc);
|
|
struct v9fs_fcall *v9fs_mux_recv(struct v9fs_mux_data *m);
|
|
int v9fs_mux_rpc(struct v9fs_mux_data *m, struct v9fs_fcall *tc, struct v9fs_fcall **rc);
|
|
|
|
void v9fs_mux_flush(struct v9fs_mux_data *m, int sendflush);
|
|
void v9fs_mux_cancel(struct v9fs_mux_data *m, int err);
|
|
int v9fs_errstr2errno(char *errstr, int len);
|