aboutsummaryrefslogtreecommitdiffstats
path: root/net/9p/trans_fd.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/9p/trans_fd.c')
-rw-r--r--net/9p/trans_fd.c71
1 files changed, 25 insertions, 46 deletions
diff --git a/net/9p/trans_fd.c b/net/9p/trans_fd.c
index 9c806428e91a..80d08f6664cb 100644
--- a/net/9p/trans_fd.c
+++ b/net/9p/trans_fd.c
@@ -66,20 +66,6 @@ struct p9_fd_opts {
66 int privport; 66 int privport;
67}; 67};
68 68
69/**
70 * struct p9_trans_fd - transport state
71 * @rd: reference to file to read from
72 * @wr: reference of file to write to
73 * @conn: connection state reference
74 *
75 */
76
77struct p9_trans_fd {
78 struct file *rd;
79 struct file *wr;
80 struct p9_conn *conn;
81};
82
83/* 69/*
84 * Option Parsing (code inspired by NFS code) 70 * Option Parsing (code inspired by NFS code)
85 * - a little lazy - parse all fd-transport options 71 * - a little lazy - parse all fd-transport options
@@ -159,6 +145,20 @@ struct p9_conn {
159 unsigned long wsched; 145 unsigned long wsched;
160}; 146};
161 147
148/**
149 * struct p9_trans_fd - transport state
150 * @rd: reference to file to read from
151 * @wr: reference of file to write to
152 * @conn: connection state reference
153 *
154 */
155
156struct p9_trans_fd {
157 struct file *rd;
158 struct file *wr;
159 struct p9_conn conn;
160};
161
162static void p9_poll_workfn(struct work_struct *work); 162static void p9_poll_workfn(struct work_struct *work);
163 163
164static DEFINE_SPINLOCK(p9_poll_lock); 164static DEFINE_SPINLOCK(p9_poll_lock);
@@ -569,21 +569,19 @@ p9_pollwait(struct file *filp, wait_queue_head_t *wait_address, poll_table *p)
569} 569}
570 570
571/** 571/**
572 * p9_conn_create - allocate and initialize the per-session mux data 572 * p9_conn_create - initialize the per-session mux data
573 * @client: client instance 573 * @client: client instance
574 * 574 *
575 * Note: Creates the polling task if this is the first session. 575 * Note: Creates the polling task if this is the first session.
576 */ 576 */
577 577
578static struct p9_conn *p9_conn_create(struct p9_client *client) 578static void p9_conn_create(struct p9_client *client)
579{ 579{
580 int n; 580 int n;
581 struct p9_conn *m; 581 struct p9_trans_fd *ts = client->trans;
582 struct p9_conn *m = &ts->conn;
582 583
583 p9_debug(P9_DEBUG_TRANS, "client %p msize %d\n", client, client->msize); 584 p9_debug(P9_DEBUG_TRANS, "client %p msize %d\n", client, client->msize);
584 m = kzalloc(sizeof(struct p9_conn), GFP_KERNEL);
585 if (!m)
586 return ERR_PTR(-ENOMEM);
587 585
588 INIT_LIST_HEAD(&m->mux_list); 586 INIT_LIST_HEAD(&m->mux_list);
589 m->client = client; 587 m->client = client;
@@ -605,8 +603,6 @@ static struct p9_conn *p9_conn_create(struct p9_client *client)
605 p9_debug(P9_DEBUG_TRANS, "mux %p can write\n", m); 603 p9_debug(P9_DEBUG_TRANS, "mux %p can write\n", m);
606 set_bit(Wpending, &m->wsched); 604 set_bit(Wpending, &m->wsched);
607 } 605 }
608
609 return m;
610} 606}
611 607
612/** 608/**
@@ -665,7 +661,7 @@ static int p9_fd_request(struct p9_client *client, struct p9_req_t *req)
665{ 661{
666 int n; 662 int n;
667 struct p9_trans_fd *ts = client->trans; 663 struct p9_trans_fd *ts = client->trans;
668 struct p9_conn *m = ts->conn; 664 struct p9_conn *m = &ts->conn;
669 665
670 p9_debug(P9_DEBUG_TRANS, "mux %p task %p tcall %p id %d\n", 666 p9_debug(P9_DEBUG_TRANS, "mux %p task %p tcall %p id %d\n",
671 m, current, req->tc, req->tc->id); 667 m, current, req->tc, req->tc->id);
@@ -788,7 +784,7 @@ static int parse_opts(char *params, struct p9_fd_opts *opts)
788 784
789static int p9_fd_open(struct p9_client *client, int rfd, int wfd) 785static int p9_fd_open(struct p9_client *client, int rfd, int wfd)
790{ 786{
791 struct p9_trans_fd *ts = kmalloc(sizeof(struct p9_trans_fd), 787 struct p9_trans_fd *ts = kzalloc(sizeof(struct p9_trans_fd),
792 GFP_KERNEL); 788 GFP_KERNEL);
793 if (!ts) 789 if (!ts)
794 return -ENOMEM; 790 return -ENOMEM;
@@ -814,9 +810,8 @@ static int p9_socket_open(struct p9_client *client, struct socket *csocket)
814{ 810{
815 struct p9_trans_fd *p; 811 struct p9_trans_fd *p;
816 struct file *file; 812 struct file *file;
817 int ret;
818 813
819 p = kmalloc(sizeof(struct p9_trans_fd), GFP_KERNEL); 814 p = kzalloc(sizeof(struct p9_trans_fd), GFP_KERNEL);
820 if (!p) 815 if (!p)
821 return -ENOMEM; 816 return -ENOMEM;
822 817
@@ -837,20 +832,12 @@ static int p9_socket_open(struct p9_client *client, struct socket *csocket)
837 832
838 p->rd->f_flags |= O_NONBLOCK; 833 p->rd->f_flags |= O_NONBLOCK;
839 834
840 p->conn = p9_conn_create(client); 835 p9_conn_create(client);
841 if (IS_ERR(p->conn)) {
842 ret = PTR_ERR(p->conn);
843 p->conn = NULL;
844 kfree(p);
845 sockfd_put(csocket);
846 sockfd_put(csocket);
847 return ret;
848 }
849 return 0; 836 return 0;
850} 837}
851 838
852/** 839/**
853 * p9_mux_destroy - cancels all pending requests and frees mux resources 840 * p9_mux_destroy - cancels all pending requests of mux
854 * @m: mux to destroy 841 * @m: mux to destroy
855 * 842 *
856 */ 843 */
@@ -867,7 +854,6 @@ static void p9_conn_destroy(struct p9_conn *m)
867 p9_conn_cancel(m, -ECONNRESET); 854 p9_conn_cancel(m, -ECONNRESET);
868 855
869 m->client = NULL; 856 m->client = NULL;
870 kfree(m);
871} 857}
872 858
873/** 859/**
@@ -889,7 +875,7 @@ static void p9_fd_close(struct p9_client *client)
889 875
890 client->status = Disconnected; 876 client->status = Disconnected;
891 877
892 p9_conn_destroy(ts->conn); 878 p9_conn_destroy(&ts->conn);
893 879
894 if (ts->rd) 880 if (ts->rd)
895 fput(ts->rd); 881 fput(ts->rd);
@@ -1041,14 +1027,7 @@ p9_fd_create(struct p9_client *client, const char *addr, char *args)
1041 return err; 1027 return err;
1042 1028
1043 p = (struct p9_trans_fd *) client->trans; 1029 p = (struct p9_trans_fd *) client->trans;
1044 p->conn = p9_conn_create(client); 1030 p9_conn_create(client);
1045 if (IS_ERR(p->conn)) {
1046 err = PTR_ERR(p->conn);
1047 p->conn = NULL;
1048 fput(p->rd);
1049 fput(p->wr);
1050 return err;
1051 }
1052 1031
1053 return 0; 1032 return 0;
1054} 1033}