28 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
31 #include <linux/module.h>
32 #include <linux/net.h>
33 #include <linux/ipv6.h>
35 #include <linux/errno.h>
36 #include <linux/kernel.h>
43 #include <linux/slab.h>
51 #define MAX_SOCK_BUF (64*1024)
52 #define MAXPOLLWADDR 2
164 static void p9_mux_poll_stop(
struct p9_conn *
m)
180 spin_unlock_irqrestore(&p9_poll_lock, flags);
190 static void p9_conn_cancel(
struct p9_conn *m,
int err)
201 spin_unlock_irqrestore(&m->
client->lock, flags);
211 list_move(&req->
req_list, &cancel_list);
217 list_move(&req->
req_list, &cancel_list);
219 spin_unlock_irqrestore(&m->
client->lock, flags);
240 if (!ts->
rd->f_op || !ts->
rd->f_op->poll)
243 if (!ts->
wr->f_op || !ts->
wr->f_op->poll)
246 ret = ts->
rd->f_op->poll(ts->
rd, pt);
250 if (ts->
rd != ts->
wr) {
251 n = ts->
wr->f_op->poll(ts->
wr, pt);
268 static int p9_fd_read(
struct p9_client *client,
void *
v,
int len)
332 if (n >= m->
client->msize) {
334 "requested packet size too big: %d\n", n);
341 "mux %p pkt: size: %d bytes tag: %d\n", m, n, tag);
369 spin_lock(&m->
client->lock);
373 spin_unlock(&m->
client->lock);
398 p9_conn_cancel(m, err);
410 static int p9_fd_write(
struct p9_client *client,
void *v,
int len)
442 static void p9_write_work(
struct work_struct *work)
456 spin_lock(&m->
client->lock);
459 spin_unlock(&m->
client->lock);
472 spin_unlock(&m->
client->lock);
514 p9_conn_cancel(m, err);
528 spin_unlock_irqrestore(&p9_poll_lock, flags);
564 init_waitqueue_func_entry(&pwait->
wait, p9_pollwake);
593 init_poll_funcptr(&m->
pt, p9_pollwait);
595 n = p9_fd_poll(client, &m->
pt);
615 static void p9_poll_mux(
struct p9_conn *m)
627 p9_conn_cancel(m, n);
672 spin_lock(&client->
lock);
675 spin_unlock(&client->
lock);
694 spin_lock(&client->
lock);
703 spin_unlock(&client->
lock);
733 "failed to allocate copy of option string\n");
736 options = tmp_options;
748 "integer field, but no integer?\n");
771 static int p9_fd_open(
struct p9_client *client,
int rfd,
int wfd)
780 if (!ts->
rd || !ts->
wr) {
795 static int p9_socket_open(
struct p9_client *client,
struct socket *csocket)
808 pr_err(
"%s (%d): failed to map fd\n",
809 __func__, task_pid_nr(
current));
812 return PTR_ERR(file);
822 p->
conn = p9_conn_create(client);
823 if (IS_ERR(p->
conn)) {
824 ret = PTR_ERR(p->
conn);
840 static void p9_conn_destroy(
struct p9_conn *m)
861 static void p9_fd_close(
struct p9_client *client)
874 p9_conn_destroy(ts->
conn);
887 static inline int valid_ipaddr4(
const char *
buf)
891 rc =
sscanf(buf,
"%d.%d.%d.%d", &in[0], &in[1], &in[2], &in[3]);
894 for (count = 0; count < 4; count++) {
902 p9_fd_create_tcp(
struct p9_client *client,
const char *
addr,
char *args)
909 err = parse_opts(args, &opts);
913 if (valid_ipaddr4(addr) < 0)
918 sin_server.sin_family =
AF_INET;
919 sin_server.sin_addr.s_addr =
in_aton(addr);
924 pr_err(
"%s (%d): problem creating socket\n",
925 __func__, task_pid_nr(
current));
929 err = csocket->
ops->connect(csocket,
933 pr_err(
"%s (%d): problem connecting socket to %s\n",
934 __func__, task_pid_nr(
current), addr);
939 return p9_socket_open(client, csocket);
943 p9_fd_create_unix(
struct p9_client *client,
const char *addr,
char *args)
952 pr_err(
"%s (%d): address too long: %s\n",
953 __func__, task_pid_nr(
current), addr);
957 sun_server.sun_family =
PF_UNIX;
958 strcpy(sun_server.sun_path, addr);
962 pr_err(
"%s (%d): problem creating socket\n",
963 __func__, task_pid_nr(
current));
967 err = csocket->ops->connect(csocket, (
struct sockaddr *)&sun_server,
970 pr_err(
"%s (%d): problem connecting socket: %s: %d\n",
971 __func__, task_pid_nr(
current), addr, err);
976 return p9_socket_open(client, csocket);
980 p9_fd_create(
struct p9_client *client,
const char *addr,
char *args)
986 parse_opts(args, &opts);
988 if (opts.
rfd == ~0 || opts.
wfd == ~0) {
989 pr_err(
"Insufficient options for proto=fd\n");
993 err = p9_fd_open(client, opts.
rfd, opts.
wfd);
998 p->
conn = p9_conn_create(client);
999 if (IS_ERR(p->
conn)) {
1000 err = PTR_ERR(p->
conn);
1014 .create = p9_fd_create_tcp,
1015 .close = p9_fd_close,
1016 .request = p9_fd_request,
1017 .cancel = p9_fd_cancel,
1025 .create = p9_fd_create_unix,
1026 .close = p9_fd_close,
1027 .request = p9_fd_request,
1028 .cancel = p9_fd_cancel,
1036 .create = p9_fd_create,
1037 .close = p9_fd_close,
1038 .request = p9_fd_request,
1039 .cancel = p9_fd_cancel,
1052 static void p9_poll_workfn(
struct work_struct *work)
1054 unsigned long flags;
1059 while (!list_empty(&p9_poll_pending_list)) {
1064 spin_unlock_irqrestore(&p9_poll_lock, flags);
1070 spin_unlock_irqrestore(&p9_poll_lock, flags);