Skip to content

Commit

Permalink
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel…
Browse files Browse the repository at this point in the history
…/git/ericvh/v9fs

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs:
  9p: fix p9_printfcall export
  9p: transport API reorganization
  9p: add remove function to trans_virtio
  9p: Convert semaphore to spinlock for p9_idpool
  9p: fix mmap to be read-only
  9p: add support for sticky bit
  9p: Fix soft lockup in virtio transport
  9p: fix bug in attach-per-user
  9p: block-based virtio client
  9p: create transport rpc cut-thru
  9p: fix bug in p9_clone_stat
  • Loading branch information
Linus Torvalds committed Feb 7, 2008
2 parents a80a438 + 7276744 commit 488b5ec
Show file tree
Hide file tree
Showing 17 changed files with 1,466 additions and 1,390 deletions.
4 changes: 2 additions & 2 deletions fs/9p/fid.c
Original file line number Diff line number Diff line change
Expand Up @@ -175,15 +175,15 @@ struct p9_fid *v9fs_fid_lookup(struct dentry *dentry)
if (!wnames)
return ERR_PTR(-ENOMEM);

for (d = dentry, i = n; i >= 0; i--, d = d->d_parent)
for (d = dentry, i = (n-1); i >= 0; i--, d = d->d_parent)
wnames[i] = (char *) d->d_name.name;

clone = 1;
i = 0;
while (i < n) {
l = min(n - i, P9_MAXWELEM);
fid = p9_client_walk(fid, l, &wnames[i], clone);
if (!fid) {
if (IS_ERR(fid)) {
kfree(wnames);
return fid;
}
Expand Down
51 changes: 11 additions & 40 deletions fs/9p/v9fs.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
*
* This file contains functions assisting in mapping VFS to 9P2000
*
* Copyright (C) 2004 by Eric Van Hensbergen <[email protected]>
* Copyright (C) 2004-2008 by Eric Van Hensbergen <[email protected]>
* Copyright (C) 2002 by Ron Minnich <[email protected]>
*
* This program is free software; you can redistribute it and/or modify
Expand Down Expand Up @@ -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"
Expand All @@ -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 */
Expand All @@ -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"},
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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();
Expand All @@ -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);
Expand All @@ -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)) {
Expand Down
5 changes: 2 additions & 3 deletions fs/9p/v9fs.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* V9FS definitions.
*
* Copyright (C) 2004 by Eric Van Hensbergen <[email protected]>
* Copyright (C) 2004-2008 by Eric Van Hensbergen <[email protected]>
* Copyright (C) 2002 by Ron Minnich <[email protected]>
*
* This program is free software; you can redistribute it and/or modify
Expand All @@ -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 */
Expand All @@ -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;
};
Expand Down
4 changes: 2 additions & 2 deletions fs/9p/vfs_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ static const struct file_operations v9fs_cached_file_operations = {
.open = v9fs_file_open,
.release = v9fs_dir_release,
.lock = v9fs_file_lock,
.mmap = generic_file_mmap,
.mmap = generic_file_readonly_mmap,
};

const struct file_operations v9fs_file_operations = {
Expand All @@ -194,5 +194,5 @@ const struct file_operations v9fs_file_operations = {
.open = v9fs_file_open,
.release = v9fs_dir_release,
.lock = v9fs_file_lock,
.mmap = generic_file_mmap,
.mmap = generic_file_readonly_mmap,
};
5 changes: 5 additions & 0 deletions fs/9p/vfs_inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,8 @@ static int unixmode2p9mode(struct v9fs_session_info *v9ses, int mode)
res |= P9_DMSETUID;
if ((mode & S_ISGID) == S_ISGID)
res |= P9_DMSETGID;
if ((mode & S_ISVTX) == S_ISVTX)
res |= P9_DMSETVTX;
if ((mode & P9_DMLINK))
res |= P9_DMLINK;
}
Expand Down Expand Up @@ -119,6 +121,9 @@ static int p9mode2unixmode(struct v9fs_session_info *v9ses, int mode)

if ((mode & P9_DMSETGID) == P9_DMSETGID)
res |= S_ISGID;

if ((mode & P9_DMSETVTX) == P9_DMSETVTX)
res |= S_ISVTX;
}

return res;
Expand Down
1 change: 1 addition & 0 deletions include/net/9p/9p.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ enum {
P9_DMSOCKET = 0x00100000,
P9_DMSETUID = 0x00080000,
P9_DMSETGID = 0x00040000,
P9_DMSETVTX = 0x00010000,
};

/* qid.types */
Expand Down
5 changes: 3 additions & 2 deletions include/net/9p/client.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
*
* 9P Client Definitions
*
* Copyright (C) 2008 by Eric Van Hensbergen <[email protected]>
* Copyright (C) 2007 by Latchesar Ionkov <[email protected]>
*
* This program is free software; you can redistribute it and/or modify
Expand All @@ -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;

Expand All @@ -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,
Expand Down
57 changes: 0 additions & 57 deletions include/net/9p/conn.h

This file was deleted.

11 changes: 6 additions & 5 deletions include/net/9p/transport.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* Transport Definition
*
* Copyright (C) 2005 by Latchesar Ionkov <[email protected]>
* Copyright (C) 2004 by Eric Van Hensbergen <[email protected]>
* Copyright (C) 2004-2008 by Eric Van Hensbergen <[email protected]>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2
Expand Down Expand Up @@ -34,19 +34,20 @@ 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);
};

struct p9_trans_module {
struct list_head list;
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);
Expand Down
1 change: 0 additions & 1 deletion net/9p/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ obj-$(CONFIG_NET_9P_VIRTIO) += 9pnet_virtio.o

9pnet-objs := \
mod.o \
mux.o \
client.o \
conv.o \
error.o \
Expand Down
Loading

0 comments on commit 488b5ec

Please sign in to comment.