Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8a0dc95f authored by Eric Van Hensbergen's avatar Eric Van Hensbergen
Browse files

9p: transport API reorganization



This merges the mux.c (including the connection interface) with trans_fd
in preparation for transport API changes.  Ultimately, trans_fd will need
to be rewritten to clean it up and simplify the implementation, but this
reorganization is viewed as the first step.

Signed-off-by: default avatarEric Van Hensbergen <ericvh@gmail.com>
parent f3933545
Loading
Loading
Loading
Loading
+11 −40
Original line number Diff line number Diff line
@@ -3,7 +3,7 @@
 *
 *  This file contains functions assisting in mapping VFS to 9P2000
 *
 *  Copyright (C) 2004 by Eric Van Hensbergen <ericvh@gmail.com>
 *  Copyright (C) 2004-2008 by Eric Van Hensbergen <ericvh@gmail.com>
 *  Copyright (C) 2002 by Ron Minnich <rminnich@lanl.gov>
 *
 *  This program is free software; you can redistribute it and/or modify
@@ -31,7 +31,6 @@
#include <linux/idr.h>
#include <net/9p/9p.h>
#include <net/9p/transport.h>
#include <net/9p/conn.h>
#include <net/9p/client.h>
#include "v9fs.h"
#include "v9fs_vfs.h"
@@ -43,11 +42,11 @@

enum {
	/* Options that take integer arguments */
	Opt_debug, Opt_msize, Opt_dfltuid, Opt_dfltgid, Opt_afid,
	Opt_debug, Opt_dfltuid, Opt_dfltgid, Opt_afid,
	/* String options */
	Opt_uname, Opt_remotename, Opt_trans,
	/* Options that take no arguments */
	Opt_legacy, Opt_nodevmap,
	Opt_nodevmap,
	/* Cache options */
	Opt_cache_loose,
	/* Access options */
@@ -58,14 +57,11 @@ enum {

static match_table_t tokens = {
	{Opt_debug, "debug=%x"},
	{Opt_msize, "msize=%u"},
	{Opt_dfltuid, "dfltuid=%u"},
	{Opt_dfltgid, "dfltgid=%u"},
	{Opt_afid, "afid=%u"},
	{Opt_uname, "uname=%s"},
	{Opt_remotename, "aname=%s"},
	{Opt_trans, "trans=%s"},
	{Opt_legacy, "noextend"},
	{Opt_nodevmap, "nodevmap"},
	{Opt_cache_loose, "cache=loose"},
	{Opt_cache_loose, "loose"},
@@ -85,16 +81,14 @@ static void v9fs_parse_options(struct v9fs_session_info *v9ses)
	char *options;
	substring_t args[MAX_OPT_ARGS];
	char *p;
	int option;
	int ret;
	int option = 0;
	char *s, *e;
	int ret;

	/* setup defaults */
	v9ses->maxdata = 8192;
	v9ses->afid = ~0;
	v9ses->debug = 0;
	v9ses->cache = 0;
	v9ses->trans = v9fs_default_trans();

	if (!v9ses->options)
		return;
@@ -106,7 +100,8 @@ static void v9fs_parse_options(struct v9fs_session_info *v9ses)
			continue;
		token = match_token(p, tokens, args);
		if (token < Opt_uname) {
			if ((ret = match_int(&args[0], &option)) < 0) {
			ret = match_int(&args[0], &option);
			if (ret < 0) {
				P9_DPRINTK(P9_DEBUG_ERROR,
					"integer field, but no integer?\n");
				continue;
@@ -119,9 +114,7 @@ static void v9fs_parse_options(struct v9fs_session_info *v9ses)
			p9_debug_level = option;
#endif
			break;
		case Opt_msize:
			v9ses->maxdata = option;
			break;

		case Opt_dfltuid:
			v9ses->dfltuid = option;
			break;
@@ -131,18 +124,12 @@ static void v9fs_parse_options(struct v9fs_session_info *v9ses)
		case Opt_afid:
			v9ses->afid = option;
			break;
		case Opt_trans:
			v9ses->trans = v9fs_match_trans(&args[0]);
			break;
		case Opt_uname:
			match_strcpy(v9ses->uname, &args[0]);
			break;
		case Opt_remotename:
			match_strcpy(v9ses->aname, &args[0]);
			break;
		case Opt_legacy:
			v9ses->flags &= ~V9FS_EXTENDED;
			break;
		case Opt_nodevmap:
			v9ses->nodev = 1;
			break;
@@ -185,7 +172,6 @@ struct p9_fid *v9fs_session_init(struct v9fs_session_info *v9ses,
		  const char *dev_name, char *data)
{
	int retval = -EINVAL;
	struct p9_trans *trans = NULL;
	struct p9_fid *fid;

	v9ses->uname = __getname();
@@ -207,24 +193,7 @@ struct p9_fid *v9fs_session_init(struct v9fs_session_info *v9ses,
	v9ses->options = kstrdup(data, GFP_KERNEL);
	v9fs_parse_options(v9ses);

	if (v9ses->trans == NULL) {
		retval = -EPROTONOSUPPORT;
		P9_DPRINTK(P9_DEBUG_ERROR,
				"No transport defined or default transport\n");
		goto error;
	}

	trans = v9ses->trans->create(dev_name, v9ses->options);
	if (IS_ERR(trans)) {
		retval = PTR_ERR(trans);
		trans = NULL;
		goto error;
	}
	if ((v9ses->maxdata+P9_IOHDRSZ) > v9ses->trans->maxsize)
		v9ses->maxdata = v9ses->trans->maxsize-P9_IOHDRSZ;

	v9ses->clnt = p9_client_create(trans, v9ses->maxdata+P9_IOHDRSZ,
		v9fs_extended(v9ses));
	v9ses->clnt = p9_client_create(dev_name, v9ses->options);

	if (IS_ERR(v9ses->clnt)) {
		retval = PTR_ERR(v9ses->clnt);
@@ -236,6 +205,8 @@ struct p9_fid *v9fs_session_init(struct v9fs_session_info *v9ses,
	if (!v9ses->clnt->dotu)
		v9ses->flags &= ~V9FS_EXTENDED;

	v9ses->maxdata = v9ses->clnt->msize;

	/* for legacy mode, fall back to V9FS_ACCESS_ANY */
	if (!v9fs_extended(v9ses) &&
		((v9ses->flags&V9FS_ACCESS_MASK) == V9FS_ACCESS_USER)) {
+2 −3
Original line number Diff line number Diff line
/*
 * V9FS definitions.
 *
 *  Copyright (C) 2004 by Eric Van Hensbergen <ericvh@gmail.com>
 *  Copyright (C) 2004-2008 by Eric Van Hensbergen <ericvh@gmail.com>
 *  Copyright (C) 2002 by Ron Minnich <rminnich@lanl.gov>
 *
 *  This program is free software; you can redistribute it and/or modify
@@ -28,7 +28,6 @@

struct v9fs_session_info {
	/* options */
	unsigned int maxdata;
	unsigned char flags;	/* session flags */
	unsigned char nodev;	/* set to 1 if no disable device mapping */
	unsigned short debug;	/* debug level */
@@ -38,10 +37,10 @@ struct v9fs_session_info {
	char *options;		/* copy of mount options */
	char *uname;		/* user name to mount as */
	char *aname;		/* name of remote hierarchy being mounted */
	unsigned int maxdata;	/* max data for client interface */
	unsigned int dfltuid;	/* default uid/muid for legacy support */
	unsigned int dfltgid;	/* default gid for legacy support */
	u32 uid;		/* if ACCESS_SINGLE, the uid that has access */
	struct p9_trans_module *trans; /* 9p transport */
	struct p9_client *clnt;	/* 9p client */
	struct dentry *debugfs_dir;
};
+3 −2
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@
 *
 * 9P Client Definitions
 *
 *  Copyright (C) 2008 by Eric Van Hensbergen <ericvh@gmail.com>
 *  Copyright (C) 2007 by Latchesar Ionkov <lucho@ionkov.net>
 *
 *  This program is free software; you can redistribute it and/or modify
@@ -29,6 +30,7 @@ struct p9_client {
	spinlock_t lock; /* protect client structure */
	int msize;
	unsigned char dotu;
	struct p9_trans_module *trans_mod;
	struct p9_trans *trans;
	struct p9_conn *conn;

@@ -52,8 +54,7 @@ struct p9_fid {
	struct list_head dlist;	/* list of all fids attached to a dentry */
};

struct p9_client *p9_client_create(struct p9_trans *trans, int msize,
								int dotu);
struct p9_client *p9_client_create(const char *dev_name, char *options);
void p9_client_destroy(struct p9_client *clnt);
void p9_client_disconnect(struct p9_client *clnt);
struct p9_fid *p9_client_attach(struct p9_client *clnt, struct p9_fid *afid,

include/net/9p/conn.h

deleted100644 → 0
+0 −57
Original line number Diff line number Diff line
/*
 * include/net/9p/conn.h
 *
 * Connection 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
 *
 */

#ifndef NET_9P_CONN_H
#define NET_9P_CONN_H

#undef P9_NONBLOCK

struct p9_conn;
struct p9_req;

/**
 * p9_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.
 *
 * @req - request
 * @a - the pointer that was specified when the request was send to be
 *      passed to the callback
 */
typedef void (*p9_conn_req_callback)(struct p9_req *req, void *a);

struct p9_conn *p9_conn_create(struct p9_trans *trans, int msize,
							unsigned char *dotu);
void p9_conn_destroy(struct p9_conn *);
int p9_conn_rpc(struct p9_conn *m, struct p9_fcall *tc, struct p9_fcall **rc);

#ifdef P9_NONBLOCK
int p9_conn_rpcnb(struct p9_conn *m, struct p9_fcall *tc,
	p9_conn_req_callback cb, void *a);
#endif /* P9_NONBLOCK */

void p9_conn_cancel(struct p9_conn *m, int err);

#endif /* NET_9P_CONN_H */
+5 −6
Original line number Diff line number Diff line
@@ -4,7 +4,7 @@
 * Transport Definition
 *
 *  Copyright (C) 2005 by Latchesar Ionkov <lucho@ionkov.net>
 *  Copyright (C) 2004 by Eric Van Hensbergen <ericvh@gmail.com>
 *  Copyright (C) 2004-2008 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
@@ -34,13 +34,12 @@ enum p9_trans_status {

struct p9_trans {
	enum p9_trans_status status;
	int msize;
	unsigned char extended;
	void *priv;
	int (*write) (struct p9_trans *, void *, int);
	int (*read) (struct p9_trans *, void *, int);
	void (*close) (struct p9_trans *);
	unsigned int (*poll)(struct p9_trans *, struct poll_table_struct *);
	int (*rpc) (struct p9_trans *t, struct p9_fcall *tc,
				struct p9_fcall **rc, int msize, int dotu);
							struct p9_fcall **rc);
};

struct p9_trans_module {
@@ -48,7 +47,7 @@ struct p9_trans_module {
	char *name;		/* name of transport */
	int maxsize;		/* max message size of transport */
	int def;		/* this transport should be default */
	struct p9_trans * (*create)(const char *devname, char *options);
	struct p9_trans * (*create)(const char *, char *, int, unsigned char);
};

void v9fs_register_trans(struct p9_trans_module *m);
Loading