9p: rework client code to use new protocol support functions
Now that the new protocol functions are in place, this patch switches the client code to using the new support code. Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
This commit is contained in:
Родитель
cb198131b0
Коммит
51a87c552d
|
@ -46,10 +46,10 @@ extern struct dentry_operations v9fs_cached_dentry_operations;
|
|||
|
||||
struct inode *v9fs_get_inode(struct super_block *sb, int mode);
|
||||
ino_t v9fs_qid2ino(struct p9_qid *qid);
|
||||
void v9fs_stat2inode(struct p9_stat *, struct inode *, struct super_block *);
|
||||
void v9fs_stat2inode(struct p9_wstat *, struct inode *, struct super_block *);
|
||||
int v9fs_dir_release(struct inode *inode, struct file *filp);
|
||||
int v9fs_file_open(struct inode *inode, struct file *file);
|
||||
void v9fs_inode2stat(struct inode *inode, struct p9_stat *stat);
|
||||
void v9fs_inode2stat(struct inode *inode, struct p9_wstat *stat);
|
||||
void v9fs_dentry_release(struct dentry *);
|
||||
int v9fs_uflags2omode(int uflags, int extended);
|
||||
|
||||
|
|
|
@ -85,8 +85,8 @@ static int v9fs_dir_readdir(struct file *filp, void *dirent, filldir_t filldir)
|
|||
return -ENOMEM;
|
||||
|
||||
while (1) {
|
||||
err = v9fs_file_readn(filp, statbuf, NULL, fid->rdir_fpos,
|
||||
buflen);
|
||||
err = v9fs_file_readn(filp, statbuf, NULL, buflen,
|
||||
fid->rdir_fpos);
|
||||
if (err <= 0)
|
||||
break;
|
||||
|
||||
|
|
|
@ -136,7 +136,7 @@ v9fs_file_readn(struct file *filp, char *data, char __user *udata, u32 count,
|
|||
int n, total;
|
||||
struct p9_fid *fid = filp->private_data;
|
||||
|
||||
P9_DPRINTK(P9_DEBUG_9P, "fid %d offset %llu count %d\n", fid->fid,
|
||||
P9_DPRINTK(P9_DEBUG_VFS, "fid %d offset %llu count %d\n", fid->fid,
|
||||
(long long unsigned) offset, count);
|
||||
|
||||
n = 0;
|
||||
|
|
|
@ -334,7 +334,7 @@ v9fs_inode_from_fid(struct v9fs_session_info *v9ses, struct p9_fid *fid,
|
|||
{
|
||||
int err, umode;
|
||||
struct inode *ret;
|
||||
struct p9_stat *st;
|
||||
struct p9_wstat *st;
|
||||
|
||||
ret = NULL;
|
||||
st = p9_client_stat(fid);
|
||||
|
@ -417,6 +417,8 @@ v9fs_create(struct v9fs_session_info *v9ses, struct inode *dir,
|
|||
struct p9_fid *dfid, *ofid, *fid;
|
||||
struct inode *inode;
|
||||
|
||||
P9_DPRINTK(P9_DEBUG_VFS, "name %s\n", dentry->d_name.name);
|
||||
|
||||
err = 0;
|
||||
ofid = NULL;
|
||||
fid = NULL;
|
||||
|
@ -424,6 +426,7 @@ v9fs_create(struct v9fs_session_info *v9ses, struct inode *dir,
|
|||
dfid = v9fs_fid_clone(dentry->d_parent);
|
||||
if (IS_ERR(dfid)) {
|
||||
err = PTR_ERR(dfid);
|
||||
P9_DPRINTK(P9_DEBUG_VFS, "fid clone failed %d\n", err);
|
||||
dfid = NULL;
|
||||
goto error;
|
||||
}
|
||||
|
@ -432,18 +435,22 @@ v9fs_create(struct v9fs_session_info *v9ses, struct inode *dir,
|
|||
ofid = p9_client_walk(dfid, 0, NULL, 1);
|
||||
if (IS_ERR(ofid)) {
|
||||
err = PTR_ERR(ofid);
|
||||
P9_DPRINTK(P9_DEBUG_VFS, "p9_client_walk failed %d\n", err);
|
||||
ofid = NULL;
|
||||
goto error;
|
||||
}
|
||||
|
||||
err = p9_client_fcreate(ofid, name, perm, mode, extension);
|
||||
if (err < 0)
|
||||
if (err < 0) {
|
||||
P9_DPRINTK(P9_DEBUG_VFS, "p9_client_fcreate failed %d\n", err);
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* now walk from the parent so we can get unopened fid */
|
||||
fid = p9_client_walk(dfid, 1, &name, 0);
|
||||
if (IS_ERR(fid)) {
|
||||
err = PTR_ERR(fid);
|
||||
P9_DPRINTK(P9_DEBUG_VFS, "p9_client_walk failed %d\n", err);
|
||||
fid = NULL;
|
||||
goto error;
|
||||
} else
|
||||
|
@ -453,6 +460,7 @@ v9fs_create(struct v9fs_session_info *v9ses, struct inode *dir,
|
|||
inode = v9fs_inode_from_fid(v9ses, fid, dir->i_sb);
|
||||
if (IS_ERR(inode)) {
|
||||
err = PTR_ERR(inode);
|
||||
P9_DPRINTK(P9_DEBUG_VFS, "inode creation failed %d\n", err);
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
@ -734,7 +742,7 @@ v9fs_vfs_getattr(struct vfsmount *mnt, struct dentry *dentry,
|
|||
int err;
|
||||
struct v9fs_session_info *v9ses;
|
||||
struct p9_fid *fid;
|
||||
struct p9_stat *st;
|
||||
struct p9_wstat *st;
|
||||
|
||||
P9_DPRINTK(P9_DEBUG_VFS, "dentry: %p\n", dentry);
|
||||
err = -EPERM;
|
||||
|
@ -815,10 +823,9 @@ static int v9fs_vfs_setattr(struct dentry *dentry, struct iattr *iattr)
|
|||
*/
|
||||
|
||||
void
|
||||
v9fs_stat2inode(struct p9_stat *stat, struct inode *inode,
|
||||
v9fs_stat2inode(struct p9_wstat *stat, struct inode *inode,
|
||||
struct super_block *sb)
|
||||
{
|
||||
int n;
|
||||
char ext[32];
|
||||
struct v9fs_session_info *v9ses = sb->s_fs_info;
|
||||
|
||||
|
@ -842,11 +849,7 @@ v9fs_stat2inode(struct p9_stat *stat, struct inode *inode,
|
|||
int major = -1;
|
||||
int minor = -1;
|
||||
|
||||
n = stat->extension.len;
|
||||
if (n > sizeof(ext)-1)
|
||||
n = sizeof(ext)-1;
|
||||
memmove(ext, stat->extension.str, n);
|
||||
ext[n] = 0;
|
||||
strncpy(ext, stat->extension, sizeof(ext));
|
||||
sscanf(ext, "%c %u %u", &type, &major, &minor);
|
||||
switch (type) {
|
||||
case 'c':
|
||||
|
@ -857,8 +860,8 @@ v9fs_stat2inode(struct p9_stat *stat, struct inode *inode,
|
|||
break;
|
||||
default:
|
||||
P9_DPRINTK(P9_DEBUG_ERROR,
|
||||
"Unknown special type %c (%.*s)\n", type,
|
||||
stat->extension.len, stat->extension.str);
|
||||
"Unknown special type %c %s\n", type,
|
||||
stat->extension);
|
||||
};
|
||||
inode->i_rdev = MKDEV(major, minor);
|
||||
} else
|
||||
|
@ -904,7 +907,7 @@ static int v9fs_readlink(struct dentry *dentry, char *buffer, int buflen)
|
|||
|
||||
struct v9fs_session_info *v9ses;
|
||||
struct p9_fid *fid;
|
||||
struct p9_stat *st;
|
||||
struct p9_wstat *st;
|
||||
|
||||
P9_DPRINTK(P9_DEBUG_VFS, " %s\n", dentry->d_name.name);
|
||||
retval = -EPERM;
|
||||
|
@ -926,15 +929,10 @@ static int v9fs_readlink(struct dentry *dentry, char *buffer, int buflen)
|
|||
}
|
||||
|
||||
/* copy extension buffer into buffer */
|
||||
if (st->extension.len < buflen)
|
||||
buflen = st->extension.len + 1;
|
||||
|
||||
memmove(buffer, st->extension.str, buflen - 1);
|
||||
buffer[buflen-1] = 0;
|
||||
strncpy(buffer, st->extension, buflen);
|
||||
|
||||
P9_DPRINTK(P9_DEBUG_VFS,
|
||||
"%s -> %.*s (%s)\n", dentry->d_name.name, st->extension.len,
|
||||
st->extension.str, buffer);
|
||||
"%s -> %s (%s)\n", dentry->d_name.name, st->extension, buffer);
|
||||
|
||||
retval = buflen;
|
||||
|
||||
|
|
|
@ -111,7 +111,7 @@ static int v9fs_get_sb(struct file_system_type *fs_type, int flags,
|
|||
struct inode *inode = NULL;
|
||||
struct dentry *root = NULL;
|
||||
struct v9fs_session_info *v9ses = NULL;
|
||||
struct p9_stat *st = NULL;
|
||||
struct p9_wstat *st = NULL;
|
||||
int mode = S_IRWXUGO | S_ISVTX;
|
||||
uid_t uid = current->fsuid;
|
||||
gid_t gid = current->fsgid;
|
||||
|
@ -161,10 +161,14 @@ static int v9fs_get_sb(struct file_system_type *fs_type, int flags,
|
|||
|
||||
sb->s_root = root;
|
||||
root->d_inode->i_ino = v9fs_qid2ino(&st->qid);
|
||||
|
||||
v9fs_stat2inode(st, root->d_inode, sb);
|
||||
|
||||
v9fs_fid_add(root, fid);
|
||||
p9stat_free(st);
|
||||
kfree(st);
|
||||
|
||||
P9_DPRINTK(P9_DEBUG_VFS, " return simple set mount\n");
|
||||
return simple_set_mnt(mnt, sb);
|
||||
|
||||
release_sb:
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
* @P9_DEBUG_TRANS: transport tracing
|
||||
* @P9_DEBUG_SLABS: memory management tracing
|
||||
* @P9_DEBUG_FCALL: verbose dump of protocol messages
|
||||
* @P9_DEBUG_FID: fid allocation/deallocation tracking
|
||||
*
|
||||
* These flags are passed at mount time to turn on various levels of
|
||||
* verbosity and tracing which will be output to the system logs.
|
||||
|
@ -53,13 +54,17 @@ enum p9_debug_flags {
|
|||
P9_DEBUG_TRANS = (1<<6),
|
||||
P9_DEBUG_SLABS = (1<<7),
|
||||
P9_DEBUG_FCALL = (1<<8),
|
||||
P9_DEBUG_FID = (1<<9),
|
||||
};
|
||||
|
||||
extern unsigned int p9_debug_level;
|
||||
|
||||
#define P9_DPRINTK(level, format, arg...) \
|
||||
do { \
|
||||
if ((p9_debug_level & level) == level) \
|
||||
if (level == P9_DEBUG_9P) \
|
||||
printk(KERN_NOTICE "(%8.8d) " \
|
||||
format , task_pid_nr(current) , ## arg); \
|
||||
else if ((p9_debug_level & level) == level) \
|
||||
printk(KERN_NOTICE "-- %s (%d): " \
|
||||
format , __func__, task_pid_nr(current) , ## arg); \
|
||||
} while (0)
|
||||
|
|
|
@ -77,6 +77,7 @@ enum p9_req_status_t {
|
|||
* struct p9_req_t - request slots
|
||||
* @status: status of this request slot
|
||||
* @t_err: transport error
|
||||
* @flush_tag: tag of request being flushed (for flush requests)
|
||||
* @wq: wait_queue for the client to block on for this request
|
||||
* @tc: the request fcall structure
|
||||
* @rc: the response fcall structure
|
||||
|
@ -97,10 +98,10 @@ enum p9_req_status_t {
|
|||
struct p9_req_t {
|
||||
int status;
|
||||
int t_err;
|
||||
u16 flush_tag;
|
||||
wait_queue_head_t *wq;
|
||||
struct p9_fcall *tc;
|
||||
struct p9_fcall *rc;
|
||||
u16 flush_tag;
|
||||
void *aux;
|
||||
|
||||
struct list_head req_list;
|
||||
|
@ -199,10 +200,12 @@ int p9_client_read(struct p9_fid *fid, char *data, char __user *udata,
|
|||
u64 offset, u32 count);
|
||||
int p9_client_write(struct p9_fid *fid, char *data, const char __user *udata,
|
||||
u64 offset, u32 count);
|
||||
struct p9_stat *p9_client_stat(struct p9_fid *fid);
|
||||
struct p9_wstat *p9_client_stat(struct p9_fid *fid);
|
||||
int p9_client_wstat(struct p9_fid *fid, struct p9_wstat *wst);
|
||||
|
||||
struct p9_req_t *p9_tag_lookup(struct p9_client *, u16);
|
||||
void p9_client_cb(struct p9_client *c, struct p9_req_t *req);
|
||||
|
||||
void p9stat_free(struct p9_wstat *);
|
||||
|
||||
#endif /* NET_9P_CLIENT_H */
|
||||
|
|
895
net/9p/client.c
895
net/9p/client.c
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -27,6 +27,7 @@
|
|||
|
||||
#include <linux/module.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <net/9p/9p.h>
|
||||
#include <net/9p/client.h>
|
||||
#include "protocol.h"
|
||||
|
@ -51,6 +52,38 @@
|
|||
static int
|
||||
p9pdu_writef(struct p9_fcall *pdu, int optional, const char *fmt, ...);
|
||||
|
||||
#define PACKET_DEBUG 0
|
||||
|
||||
void
|
||||
p9pdu_dump(int way, struct p9_fcall *pdu)
|
||||
{
|
||||
int i, n;
|
||||
u8 *data = pdu->sdata;
|
||||
int datalen = pdu->size;
|
||||
char buf[255];
|
||||
int buflen = 255;
|
||||
|
||||
i = n = 0;
|
||||
if (datalen > (buflen-16))
|
||||
datalen = buflen-16;
|
||||
while (i < datalen) {
|
||||
n += scnprintf(buf + n, buflen - n, "%02x ", data[i]);
|
||||
if (i%4 == 3)
|
||||
n += scnprintf(buf + n, buflen - n, " ");
|
||||
if (i%32 == 31)
|
||||
n += scnprintf(buf + n, buflen - n, "\n");
|
||||
|
||||
i++;
|
||||
}
|
||||
n += scnprintf(buf + n, buflen - n, "\n");
|
||||
|
||||
if (way)
|
||||
printk(KERN_NOTICE "[[(%d)[ %s\n", datalen, buf);
|
||||
else
|
||||
printk(KERN_NOTICE "]](%d)] %s\n", datalen, buf);
|
||||
}
|
||||
EXPORT_SYMBOL(p9pdu_dump);
|
||||
|
||||
void p9stat_free(struct p9_wstat *stbuf)
|
||||
{
|
||||
kfree(stbuf->name);
|
||||
|
@ -77,6 +110,18 @@ static size_t pdu_write(struct p9_fcall *pdu, const void *data, size_t size)
|
|||
return size - len;
|
||||
}
|
||||
|
||||
static size_t
|
||||
pdu_write_u(struct p9_fcall *pdu, const char __user *udata, size_t size)
|
||||
{
|
||||
size_t len = MIN(pdu->capacity - pdu->size, size);
|
||||
int err = copy_from_user(&pdu->sdata[pdu->size], udata, len);
|
||||
if (err)
|
||||
printk(KERN_WARNING "pdu_write_u returning: %d\n", err);
|
||||
|
||||
pdu->size += len;
|
||||
return size - len;
|
||||
}
|
||||
|
||||
/*
|
||||
b - int8_t
|
||||
w - int16_t
|
||||
|
@ -174,7 +219,6 @@ p9pdu_vreadf(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap)
|
|||
stbuf->extension = NULL;
|
||||
stbuf->n_uid = stbuf->n_gid = stbuf->n_muid =
|
||||
-1;
|
||||
|
||||
errcode =
|
||||
p9pdu_readf(pdu, optional,
|
||||
"wwdQdddqssss?sddd",
|
||||
|
@ -332,7 +376,6 @@ p9pdu_vwritef(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap)
|
|||
case 's':{
|
||||
const char *ptr = va_arg(ap, const char *);
|
||||
int16_t len = 0;
|
||||
|
||||
if (ptr)
|
||||
len = MIN(strlen(ptr), USHORT_MAX);
|
||||
|
||||
|
@ -356,7 +399,7 @@ p9pdu_vwritef(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap)
|
|||
p9pdu_writef(pdu, optional,
|
||||
"wwdQdddqssss?sddd",
|
||||
stbuf->size, stbuf->type,
|
||||
stbuf->dev, stbuf->qid,
|
||||
stbuf->dev, &stbuf->qid,
|
||||
stbuf->mode, stbuf->atime,
|
||||
stbuf->mtime, stbuf->length,
|
||||
stbuf->name, stbuf->uid,
|
||||
|
@ -374,6 +417,16 @@ p9pdu_vwritef(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap)
|
|||
errcode = -EFAULT;
|
||||
}
|
||||
break;
|
||||
case 'U':{
|
||||
int32_t count = va_arg(ap, int32_t);
|
||||
const char __user *udata =
|
||||
va_arg(ap, const void *);
|
||||
errcode =
|
||||
p9pdu_writef(pdu, optional, "d", count);
|
||||
if (!errcode && pdu_write_u(pdu, udata, count))
|
||||
errcode = -EFAULT;
|
||||
}
|
||||
break;
|
||||
case 'T':{
|
||||
int16_t nwname = va_arg(ap, int);
|
||||
const char **wnames = va_arg(ap, const char **);
|
||||
|
@ -455,3 +508,29 @@ p9pdu_writef(struct p9_fcall *pdu, int optional, const char *fmt, ...)
|
|||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int p9pdu_prepare(struct p9_fcall *pdu, int16_t tag, int8_t type)
|
||||
{
|
||||
return p9pdu_writef(pdu, 0, "dbw", 0, type, tag);
|
||||
}
|
||||
|
||||
int p9pdu_finalize(struct p9_fcall *pdu)
|
||||
{
|
||||
int size = pdu->size;
|
||||
int err;
|
||||
|
||||
pdu->size = 0;
|
||||
err = p9pdu_writef(pdu, 0, "d", size);
|
||||
pdu->size = size;
|
||||
|
||||
if (PACKET_DEBUG)
|
||||
p9pdu_dump(0, pdu);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
void p9pdu_reset(struct p9_fcall *pdu)
|
||||
{
|
||||
pdu->offset = 0;
|
||||
pdu->size = 0;
|
||||
}
|
||||
|
|
|
@ -27,5 +27,8 @@
|
|||
|
||||
int
|
||||
p9pdu_vwritef(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap);
|
||||
|
||||
int p9pdu_readf(struct p9_fcall *pdu, int optional, const char *fmt, ...);
|
||||
int p9pdu_prepare(struct p9_fcall *pdu, int16_t tag, int8_t type);
|
||||
int p9pdu_finalize(struct p9_fcall *pdu);
|
||||
void p9pdu_dump(int, struct p9_fcall *);
|
||||
void p9pdu_reset(struct p9_fcall *pdu);
|
||||
|
|
|
@ -181,7 +181,7 @@ static void p9_mux_poll_stop(struct p9_conn *m)
|
|||
*
|
||||
*/
|
||||
|
||||
void p9_conn_cancel(struct p9_conn *m, int err)
|
||||
static void p9_conn_cancel(struct p9_conn *m, int err)
|
||||
{
|
||||
struct p9_req_t *req, *rtmp;
|
||||
unsigned long flags;
|
||||
|
@ -287,7 +287,7 @@ static void p9_read_work(struct work_struct *work)
|
|||
if (m->err < 0)
|
||||
return;
|
||||
|
||||
P9_DPRINTK(P9_DEBUG_MUX, "start mux %p pos %d\n", m, m->rpos);
|
||||
P9_DPRINTK(P9_DEBUG_TRANS, "start mux %p pos %d\n", m, m->rpos);
|
||||
|
||||
if (!m->rbuf) {
|
||||
m->rbuf = m->tmp_buf;
|
||||
|
@ -296,11 +296,11 @@ static void p9_read_work(struct work_struct *work)
|
|||
}
|
||||
|
||||
clear_bit(Rpending, &m->wsched);
|
||||
P9_DPRINTK(P9_DEBUG_MUX, "read mux %p pos %d size: %d = %d\n", m,
|
||||
P9_DPRINTK(P9_DEBUG_TRANS, "read mux %p pos %d size: %d = %d\n", m,
|
||||
m->rpos, m->rsize, m->rsize-m->rpos);
|
||||
err = p9_fd_read(m->client, m->rbuf + m->rpos,
|
||||
m->rsize - m->rpos);
|
||||
P9_DPRINTK(P9_DEBUG_MUX, "mux %p got %d bytes\n", m, err);
|
||||
P9_DPRINTK(P9_DEBUG_TRANS, "mux %p got %d bytes\n", m, err);
|
||||
if (err == -EAGAIN) {
|
||||
clear_bit(Rworksched, &m->wsched);
|
||||
return;
|
||||
|
@ -313,7 +313,7 @@ static void p9_read_work(struct work_struct *work)
|
|||
|
||||
if ((!m->req) && (m->rpos == m->rsize)) { /* header read in */
|
||||
u16 tag;
|
||||
P9_DPRINTK(P9_DEBUG_MUX, "got new header\n");
|
||||
P9_DPRINTK(P9_DEBUG_TRANS, "got new header\n");
|
||||
|
||||
n = le32_to_cpu(*(__le32 *) m->rbuf); /* read packet size */
|
||||
if (n >= m->client->msize) {
|
||||
|
@ -324,8 +324,8 @@ static void p9_read_work(struct work_struct *work)
|
|||
}
|
||||
|
||||
tag = le16_to_cpu(*(__le16 *) (m->rbuf+5)); /* read tag */
|
||||
P9_DPRINTK(P9_DEBUG_MUX, "mux %p pkt: size: %d bytes tag: %d\n",
|
||||
m, n, tag);
|
||||
P9_DPRINTK(P9_DEBUG_TRANS,
|
||||
"mux %p pkt: size: %d bytes tag: %d\n", m, n, tag);
|
||||
|
||||
m->req = p9_tag_lookup(m->client, tag);
|
||||
if (!m->req) {
|
||||
|
@ -351,7 +351,7 @@ static void p9_read_work(struct work_struct *work)
|
|||
|
||||
/* not an else because some packets (like clunk) have no payload */
|
||||
if ((m->req) && (m->rpos == m->rsize)) { /* packet is read in */
|
||||
P9_DPRINTK(P9_DEBUG_MUX, "got new packet\n");
|
||||
P9_DPRINTK(P9_DEBUG_TRANS, "got new packet\n");
|
||||
|
||||
list_del(&m->req->req_list);
|
||||
p9_client_cb(m->client, m->req);
|
||||
|
@ -369,7 +369,7 @@ static void p9_read_work(struct work_struct *work)
|
|||
n = p9_fd_poll(m->client, NULL);
|
||||
|
||||
if (n & POLLIN) {
|
||||
P9_DPRINTK(P9_DEBUG_MUX, "schedule read work %p\n", m);
|
||||
P9_DPRINTK(P9_DEBUG_TRANS, "sched read work %p\n", m);
|
||||
queue_work(p9_mux_wq, &m->rq);
|
||||
} else
|
||||
clear_bit(Rworksched, &m->wsched);
|
||||
|
@ -453,11 +453,11 @@ static void p9_write_work(struct work_struct *work)
|
|||
spin_unlock(&m->client->lock);
|
||||
}
|
||||
|
||||
P9_DPRINTK(P9_DEBUG_MUX, "mux %p pos %d size %d\n", m, m->wpos,
|
||||
P9_DPRINTK(P9_DEBUG_TRANS, "mux %p pos %d size %d\n", m, m->wpos,
|
||||
m->wsize);
|
||||
clear_bit(Wpending, &m->wsched);
|
||||
err = p9_fd_write(m->client, m->wbuf + m->wpos, m->wsize - m->wpos);
|
||||
P9_DPRINTK(P9_DEBUG_MUX, "mux %p sent %d bytes\n", m, err);
|
||||
P9_DPRINTK(P9_DEBUG_TRANS, "mux %p sent %d bytes\n", m, err);
|
||||
if (err == -EAGAIN) {
|
||||
clear_bit(Wworksched, &m->wsched);
|
||||
return;
|
||||
|
@ -481,7 +481,7 @@ static void p9_write_work(struct work_struct *work)
|
|||
n = p9_fd_poll(m->client, NULL);
|
||||
|
||||
if (n & POLLOUT) {
|
||||
P9_DPRINTK(P9_DEBUG_MUX, "schedule write work %p\n", m);
|
||||
P9_DPRINTK(P9_DEBUG_TRANS, "sched write work %p\n", m);
|
||||
queue_work(p9_mux_wq, &m->wq);
|
||||
} else
|
||||
clear_bit(Wworksched, &m->wsched);
|
||||
|
@ -558,7 +558,8 @@ static struct p9_conn *p9_conn_create(struct p9_client *client)
|
|||
int n;
|
||||
struct p9_conn *m;
|
||||
|
||||
P9_DPRINTK(P9_DEBUG_MUX, "client %p msize %d\n", client, client->msize);
|
||||
P9_DPRINTK(P9_DEBUG_TRANS, "client %p msize %d\n", client,
|
||||
client->msize);
|
||||
m = kzalloc(sizeof(struct p9_conn), GFP_KERNEL);
|
||||
if (!m)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
@ -575,12 +576,12 @@ static struct p9_conn *p9_conn_create(struct p9_client *client)
|
|||
|
||||
n = p9_fd_poll(client, &m->pt);
|
||||
if (n & POLLIN) {
|
||||
P9_DPRINTK(P9_DEBUG_MUX, "mux %p can read\n", m);
|
||||
P9_DPRINTK(P9_DEBUG_TRANS, "mux %p can read\n", m);
|
||||
set_bit(Rpending, &m->wsched);
|
||||
}
|
||||
|
||||
if (n & POLLOUT) {
|
||||
P9_DPRINTK(P9_DEBUG_MUX, "mux %p can write\n", m);
|
||||
P9_DPRINTK(P9_DEBUG_TRANS, "mux %p can write\n", m);
|
||||
set_bit(Wpending, &m->wsched);
|
||||
}
|
||||
|
||||
|
@ -602,7 +603,7 @@ static void p9_poll_mux(struct p9_conn *m)
|
|||
|
||||
n = p9_fd_poll(m->client, NULL);
|
||||
if (n < 0 || n & (POLLERR | POLLHUP | POLLNVAL)) {
|
||||
P9_DPRINTK(P9_DEBUG_MUX, "error mux %p err %d\n", m, n);
|
||||
P9_DPRINTK(P9_DEBUG_TRANS, "error mux %p err %d\n", m, n);
|
||||
if (n >= 0)
|
||||
n = -ECONNRESET;
|
||||
p9_conn_cancel(m, n);
|
||||
|
@ -610,19 +611,19 @@ static void p9_poll_mux(struct p9_conn *m)
|
|||
|
||||
if (n & POLLIN) {
|
||||
set_bit(Rpending, &m->wsched);
|
||||
P9_DPRINTK(P9_DEBUG_MUX, "mux %p can read\n", m);
|
||||
P9_DPRINTK(P9_DEBUG_TRANS, "mux %p can read\n", m);
|
||||
if (!test_and_set_bit(Rworksched, &m->wsched)) {
|
||||
P9_DPRINTK(P9_DEBUG_MUX, "schedule read work %p\n", m);
|
||||
P9_DPRINTK(P9_DEBUG_TRANS, "sched read work %p\n", m);
|
||||
queue_work(p9_mux_wq, &m->rq);
|
||||
}
|
||||
}
|
||||
|
||||
if (n & POLLOUT) {
|
||||
set_bit(Wpending, &m->wsched);
|
||||
P9_DPRINTK(P9_DEBUG_MUX, "mux %p can write\n", m);
|
||||
P9_DPRINTK(P9_DEBUG_TRANS, "mux %p can write\n", m);
|
||||
if ((m->wsize || !list_empty(&m->unsent_req_list))
|
||||
&& !test_and_set_bit(Wworksched, &m->wsched)) {
|
||||
P9_DPRINTK(P9_DEBUG_MUX, "schedule write work %p\n", m);
|
||||
P9_DPRINTK(P9_DEBUG_TRANS, "sched write work %p\n", m);
|
||||
queue_work(p9_mux_wq, &m->wq);
|
||||
}
|
||||
}
|
||||
|
@ -645,8 +646,8 @@ static int p9_fd_request(struct p9_client *client, struct p9_req_t *req)
|
|||
struct p9_trans_fd *ts = client->trans;
|
||||
struct p9_conn *m = ts->conn;
|
||||
|
||||
P9_DPRINTK(P9_DEBUG_MUX, "mux %p task %p tcall %p id %d\n", m, current,
|
||||
req->tc, req->tc->id);
|
||||
P9_DPRINTK(P9_DEBUG_TRANS, "mux %p task %p tcall %p id %d\n", m,
|
||||
current, req->tc, req->tc->id);
|
||||
if (m->err < 0)
|
||||
return m->err;
|
||||
|
||||
|
@ -672,19 +673,12 @@ static int p9_fd_cancel(struct p9_client *client, struct p9_req_t *req)
|
|||
struct p9_trans_fd *ts = client->trans;
|
||||
struct p9_conn *m = ts->conn;
|
||||
|
||||
P9_DPRINTK(P9_DEBUG_MUX, "mux %p req %p\n", m, req);
|
||||
P9_DPRINTK(P9_DEBUG_TRANS, "mux %p req %p\n", m, req);
|
||||
|
||||
spin_lock(&client->lock);
|
||||
list_del(&req->req_list);
|
||||
spin_unlock(&client->lock);
|
||||
|
||||
/* if a response was received for a request, do nothing */
|
||||
if (req->rc || req->t_err) {
|
||||
P9_DPRINTK(P9_DEBUG_MUX,
|
||||
"mux %p req %p response already received\n", m, req);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (req->status == REQ_STATUS_UNSENT) {
|
||||
req->status = REQ_STATUS_FLSHD;
|
||||
return 0;
|
||||
|
@ -809,7 +803,7 @@ static int p9_socket_open(struct p9_client *client, struct socket *csocket)
|
|||
|
||||
static void p9_conn_destroy(struct p9_conn *m)
|
||||
{
|
||||
P9_DPRINTK(P9_DEBUG_MUX, "mux %p prev %p next %p\n", m,
|
||||
P9_DPRINTK(P9_DEBUG_TRANS, "mux %p prev %p next %p\n", m,
|
||||
m->mux_list.prev, m->mux_list.next);
|
||||
|
||||
p9_mux_poll_stop(m);
|
||||
|
@ -1060,7 +1054,7 @@ static int p9_poll_proc(void *a)
|
|||
{
|
||||
unsigned long flags;
|
||||
|
||||
P9_DPRINTK(P9_DEBUG_MUX, "start %p\n", current);
|
||||
P9_DPRINTK(P9_DEBUG_TRANS, "start %p\n", current);
|
||||
repeat:
|
||||
spin_lock_irqsave(&p9_poll_lock, flags);
|
||||
while (!list_empty(&p9_poll_pending_list)) {
|
||||
|
@ -1078,7 +1072,7 @@ static int p9_poll_proc(void *a)
|
|||
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
if (list_empty(&p9_poll_pending_list)) {
|
||||
P9_DPRINTK(P9_DEBUG_MUX, "sleeping...\n");
|
||||
P9_DPRINTK(P9_DEBUG_TRANS, "sleeping...\n");
|
||||
schedule();
|
||||
}
|
||||
__set_current_state(TASK_RUNNING);
|
||||
|
@ -1086,7 +1080,7 @@ static int p9_poll_proc(void *a)
|
|||
if (!kthread_should_stop())
|
||||
goto repeat;
|
||||
|
||||
P9_DPRINTK(P9_DEBUG_MUX, "finish\n");
|
||||
P9_DPRINTK(P9_DEBUG_TRANS, "finish\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -105,6 +105,7 @@ retry:
|
|||
else if (error)
|
||||
return -1;
|
||||
|
||||
P9_DPRINTK(P9_DEBUG_MUX, " id %d pool %p\n", i, p);
|
||||
return i;
|
||||
}
|
||||
EXPORT_SYMBOL(p9_idpool_get);
|
||||
|
@ -121,6 +122,9 @@ EXPORT_SYMBOL(p9_idpool_get);
|
|||
void p9_idpool_put(int id, struct p9_idpool *p)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
P9_DPRINTK(P9_DEBUG_MUX, " id %d pool %p\n", id, p);
|
||||
|
||||
spin_lock_irqsave(&p->lock, flags);
|
||||
idr_remove(&p->pool, id);
|
||||
spin_unlock_irqrestore(&p->lock, flags);
|
||||
|
|
Загрузка…
Ссылка в новой задаче