summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2017-07-05 11:25:37 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2017-07-11 06:08:58 -0400
commitc4fac9100456995c10b65c13be84554258ed7fc8 (patch)
treeea395c955dfac2337eff1a4608caea5f3a26701b
parent86a1da6d30ad727c2a9cc5d6a51bff6d830036b5 (diff)
9p: Implement show_options
Implement the show_options superblock op for 9p as part of a bid to get rid of s_options and generic_show_options() to make it easier to implement a context-based mount where the mount options can be passed individually over a file descriptor. Signed-off-by: David Howells <dhowells@redhat.com> cc: Eric Van Hensbergen <ericvh@gmail.com> cc: Ron Minnich <rminnich@sandia.gov> cc: Latchesar Ionkov <lucho@ionkov.net> cc: v9fs-developer@lists.sourceforge.net Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--fs/9p/v9fs.c61
-rw-r--r--fs/9p/v9fs.h3
-rw-r--r--fs/9p/vfs_super.c6
-rw-r--r--include/net/9p/client.h13
-rw-r--r--include/net/9p/transport.h1
-rw-r--r--net/9p/client.c25
-rw-r--r--net/9p/trans_fd.c31
-rw-r--r--net/9p/trans_rdma.c31
8 files changed, 161 insertions, 10 deletions
diff --git a/fs/9p/v9fs.c b/fs/9p/v9fs.c
index c202930086ed..8fb89ddc6cc7 100644
--- a/fs/9p/v9fs.c
+++ b/fs/9p/v9fs.c
@@ -33,6 +33,7 @@
33#include <linux/parser.h> 33#include <linux/parser.h>
34#include <linux/idr.h> 34#include <linux/idr.h>
35#include <linux/slab.h> 35#include <linux/slab.h>
36#include <linux/seq_file.h>
36#include <net/9p/9p.h> 37#include <net/9p/9p.h>
37#include <net/9p/client.h> 38#include <net/9p/client.h>
38#include <net/9p/transport.h> 39#include <net/9p/transport.h>
@@ -82,6 +83,13 @@ static const match_table_t tokens = {
82 {Opt_err, NULL} 83 {Opt_err, NULL}
83}; 84};
84 85
86static const char *const v9fs_cache_modes[nr__p9_cache_modes] = {
87 [CACHE_NONE] = "none",
88 [CACHE_MMAP] = "mmap",
89 [CACHE_LOOSE] = "loose",
90 [CACHE_FSCACHE] = "fscache",
91};
92
85/* Interpret mount options for cache mode */ 93/* Interpret mount options for cache mode */
86static int get_cache_mode(char *s) 94static int get_cache_mode(char *s)
87{ 95{
@@ -104,6 +112,58 @@ static int get_cache_mode(char *s)
104 return version; 112 return version;
105} 113}
106 114
115/*
116 * Display the mount options in /proc/mounts.
117 */
118int v9fs_show_options(struct seq_file *m, struct dentry *root)
119{
120 struct v9fs_session_info *v9ses = root->d_sb->s_fs_info;
121
122 if (v9ses->debug)
123 seq_printf(m, ",debug=%x", v9ses->debug);
124 if (!uid_eq(v9ses->dfltuid, V9FS_DEFUID))
125 seq_printf(m, ",dfltuid=%u",
126 from_kuid_munged(&init_user_ns, v9ses->dfltuid));
127 if (!gid_eq(v9ses->dfltgid, V9FS_DEFGID))
128 seq_printf(m, ",dfltgid=%u",
129 from_kgid_munged(&init_user_ns, v9ses->dfltgid));
130 if (v9ses->afid != ~0)
131 seq_printf(m, ",afid=%u", v9ses->afid);
132 if (strcmp(v9ses->uname, V9FS_DEFUSER) != 0)
133 seq_printf(m, ",uname=%s", v9ses->uname);
134 if (strcmp(v9ses->aname, V9FS_DEFANAME) != 0)
135 seq_printf(m, ",aname=%s", v9ses->aname);
136 if (v9ses->nodev)
137 seq_puts(m, ",nodevmap");
138 if (v9ses->cache)
139 seq_printf(m, ",%s", v9fs_cache_modes[v9ses->cache]);
140#ifdef CONFIG_9P_FSCACHE
141 if (v9ses->cachetag && v9ses->cache == CACHE_FSCACHE)
142 seq_printf(m, ",cachetag=%s", v9ses->cachetag);
143#endif
144
145 switch (v9ses->flags & V9FS_ACCESS_MASK) {
146 case V9FS_ACCESS_USER:
147 seq_puts(m, ",access=user");
148 break;
149 case V9FS_ACCESS_ANY:
150 seq_puts(m, ",access=any");
151 break;
152 case V9FS_ACCESS_CLIENT:
153 seq_puts(m, ",access=client");
154 break;
155 case V9FS_ACCESS_SINGLE:
156 seq_printf(m, ",access=%u",
157 from_kuid_munged(&init_user_ns, v9ses->uid));
158 break;
159 }
160
161 if (v9ses->flags & V9FS_POSIX_ACL)
162 seq_puts(m, ",posixacl");
163
164 return p9_show_client_options(m, v9ses->clnt);
165}
166
107/** 167/**
108 * v9fs_parse_options - parse mount options into session structure 168 * v9fs_parse_options - parse mount options into session structure
109 * @v9ses: existing v9fs session information 169 * @v9ses: existing v9fs session information
@@ -230,6 +290,7 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts)
230 break; 290 break;
231 case Opt_cachetag: 291 case Opt_cachetag:
232#ifdef CONFIG_9P_FSCACHE 292#ifdef CONFIG_9P_FSCACHE
293 kfree(v9ses->cachetag);
233 v9ses->cachetag = match_strdup(&args[0]); 294 v9ses->cachetag = match_strdup(&args[0]);
234#endif 295#endif
235 break; 296 break;
diff --git a/fs/9p/v9fs.h b/fs/9p/v9fs.h
index 76eaf49abd3a..982e017acadb 100644
--- a/fs/9p/v9fs.h
+++ b/fs/9p/v9fs.h
@@ -67,6 +67,7 @@ enum p9_cache_modes {
67 CACHE_MMAP, 67 CACHE_MMAP,
68 CACHE_LOOSE, 68 CACHE_LOOSE,
69 CACHE_FSCACHE, 69 CACHE_FSCACHE,
70 nr__p9_cache_modes
70}; 71};
71 72
72/** 73/**
@@ -137,6 +138,8 @@ static inline struct v9fs_inode *V9FS_I(const struct inode *inode)
137 return container_of(inode, struct v9fs_inode, vfs_inode); 138 return container_of(inode, struct v9fs_inode, vfs_inode);
138} 139}
139 140
141extern int v9fs_show_options(struct seq_file *m, struct dentry *root);
142
140struct p9_fid *v9fs_session_init(struct v9fs_session_info *, const char *, 143struct p9_fid *v9fs_session_init(struct v9fs_session_info *, const char *,
141 char *); 144 char *);
142extern void v9fs_session_close(struct v9fs_session_info *v9ses); 145extern void v9fs_session_close(struct v9fs_session_info *v9ses);
diff --git a/fs/9p/vfs_super.c b/fs/9p/vfs_super.c
index a0965fb587a5..8b75463cb211 100644
--- a/fs/9p/vfs_super.c
+++ b/fs/9p/vfs_super.c
@@ -33,7 +33,6 @@
33#include <linux/string.h> 33#include <linux/string.h>
34#include <linux/inet.h> 34#include <linux/inet.h>
35#include <linux/pagemap.h> 35#include <linux/pagemap.h>
36#include <linux/seq_file.h>
37#include <linux/mount.h> 36#include <linux/mount.h>
38#include <linux/idr.h> 37#include <linux/idr.h>
39#include <linux/sched.h> 38#include <linux/sched.h>
@@ -104,7 +103,6 @@ v9fs_fill_super(struct super_block *sb, struct v9fs_session_info *v9ses,
104 sb->s_flags |= MS_POSIXACL; 103 sb->s_flags |= MS_POSIXACL;
105#endif 104#endif
106 105
107 save_mount_options(sb, data);
108 return 0; 106 return 0;
109} 107}
110 108
@@ -349,7 +347,7 @@ static const struct super_operations v9fs_super_ops = {
349 .destroy_inode = v9fs_destroy_inode, 347 .destroy_inode = v9fs_destroy_inode,
350 .statfs = simple_statfs, 348 .statfs = simple_statfs,
351 .evict_inode = v9fs_evict_inode, 349 .evict_inode = v9fs_evict_inode,
352 .show_options = generic_show_options, 350 .show_options = v9fs_show_options,
353 .umount_begin = v9fs_umount_begin, 351 .umount_begin = v9fs_umount_begin,
354 .write_inode = v9fs_write_inode, 352 .write_inode = v9fs_write_inode,
355}; 353};
@@ -360,7 +358,7 @@ static const struct super_operations v9fs_super_ops_dotl = {
360 .statfs = v9fs_statfs, 358 .statfs = v9fs_statfs,
361 .drop_inode = v9fs_drop_inode, 359 .drop_inode = v9fs_drop_inode,
362 .evict_inode = v9fs_evict_inode, 360 .evict_inode = v9fs_evict_inode,
363 .show_options = generic_show_options, 361 .show_options = v9fs_show_options,
364 .umount_begin = v9fs_umount_begin, 362 .umount_begin = v9fs_umount_begin,
365 .write_inode = v9fs_write_inode_dotl, 363 .write_inode = v9fs_write_inode_dotl,
366}; 364};
diff --git a/include/net/9p/client.h b/include/net/9p/client.h
index b582339ccef5..7af9d769b97d 100644
--- a/include/net/9p/client.h
+++ b/include/net/9p/client.h
@@ -157,6 +157,18 @@ struct p9_client {
157 enum p9_trans_status status; 157 enum p9_trans_status status;
158 void *trans; 158 void *trans;
159 159
160 union {
161 struct {
162 int rfd;
163 int wfd;
164 } fd;
165 struct {
166 u16 port;
167 bool privport;
168
169 } tcp;
170 } trans_opts;
171
160 struct p9_idpool *fidpool; 172 struct p9_idpool *fidpool;
161 struct list_head fidlist; 173 struct list_head fidlist;
162 174
@@ -213,6 +225,7 @@ struct p9_dirent {
213 225
214struct iov_iter; 226struct iov_iter;
215 227
228int p9_show_client_options(struct seq_file *m, struct p9_client *clnt);
216int p9_client_statfs(struct p9_fid *fid, struct p9_rstatfs *sb); 229int p9_client_statfs(struct p9_fid *fid, struct p9_rstatfs *sb);
217int p9_client_rename(struct p9_fid *fid, struct p9_fid *newdirfid, 230int p9_client_rename(struct p9_fid *fid, struct p9_fid *newdirfid,
218 const char *name); 231 const char *name);
diff --git a/include/net/9p/transport.h b/include/net/9p/transport.h
index 5122b5e40f78..1625fb842ac4 100644
--- a/include/net/9p/transport.h
+++ b/include/net/9p/transport.h
@@ -62,6 +62,7 @@ struct p9_trans_module {
62 int (*cancelled)(struct p9_client *, struct p9_req_t *req); 62 int (*cancelled)(struct p9_client *, struct p9_req_t *req);
63 int (*zc_request)(struct p9_client *, struct p9_req_t *, 63 int (*zc_request)(struct p9_client *, struct p9_req_t *,
64 struct iov_iter *, struct iov_iter *, int , int, int); 64 struct iov_iter *, struct iov_iter *, int , int, int);
65 int (*show_options)(struct seq_file *, struct p9_client *);
65}; 66};
66 67
67void v9fs_register_trans(struct p9_trans_module *m); 68void v9fs_register_trans(struct p9_trans_module *m);
diff --git a/net/9p/client.c b/net/9p/client.c
index 1218fb3b52da..4674235b0d9b 100644
--- a/net/9p/client.c
+++ b/net/9p/client.c
@@ -37,6 +37,7 @@
37#include <linux/uio.h> 37#include <linux/uio.h>
38#include <net/9p/9p.h> 38#include <net/9p/9p.h>
39#include <linux/parser.h> 39#include <linux/parser.h>
40#include <linux/seq_file.h>
40#include <net/9p/client.h> 41#include <net/9p/client.h>
41#include <net/9p/transport.h> 42#include <net/9p/transport.h>
42#include "protocol.h" 43#include "protocol.h"
@@ -77,6 +78,30 @@ inline int p9_is_proto_dotu(struct p9_client *clnt)
77} 78}
78EXPORT_SYMBOL(p9_is_proto_dotu); 79EXPORT_SYMBOL(p9_is_proto_dotu);
79 80
81int p9_show_client_options(struct seq_file *m, struct p9_client *clnt)
82{
83 if (clnt->msize != 8192)
84 seq_printf(m, ",msize=%u", clnt->msize);
85 seq_printf(m, "trans=%s", clnt->trans_mod->name);
86
87 switch (clnt->proto_version) {
88 case p9_proto_legacy:
89 seq_puts(m, ",noextend");
90 break;
91 case p9_proto_2000u:
92 seq_puts(m, ",version=9p2000.u");
93 break;
94 case p9_proto_2000L:
95 /* Default */
96 break;
97 }
98
99 if (clnt->trans_mod->show_options)
100 return clnt->trans_mod->show_options(m, clnt);
101 return 0;
102}
103EXPORT_SYMBOL(p9_show_client_options);
104
80/* 105/*
81 * Some error codes are taken directly from the server replies, 106 * Some error codes are taken directly from the server replies,
82 * make sure they are valid. 107 * make sure they are valid.
diff --git a/net/9p/trans_fd.c b/net/9p/trans_fd.c
index 7bc2208b6cc4..f2e0eaf58018 100644
--- a/net/9p/trans_fd.c
+++ b/net/9p/trans_fd.c
@@ -41,6 +41,7 @@
41#include <linux/file.h> 41#include <linux/file.h>
42#include <linux/parser.h> 42#include <linux/parser.h>
43#include <linux/slab.h> 43#include <linux/slab.h>
44#include <linux/seq_file.h>
44#include <net/9p/9p.h> 45#include <net/9p/9p.h>
45#include <net/9p/client.h> 46#include <net/9p/client.h>
46#include <net/9p/transport.h> 47#include <net/9p/transport.h>
@@ -51,6 +52,9 @@
51#define MAX_SOCK_BUF (64*1024) 52#define MAX_SOCK_BUF (64*1024)
52#define MAXPOLLWADDR 2 53#define MAXPOLLWADDR 2
53 54
55static struct p9_trans_module p9_tcp_trans;
56static struct p9_trans_module p9_fd_trans;
57
54/** 58/**
55 * struct p9_fd_opts - per-transport options 59 * struct p9_fd_opts - per-transport options
56 * @rfd: file descriptor for reading (trans=fd) 60 * @rfd: file descriptor for reading (trans=fd)
@@ -63,7 +67,7 @@ struct p9_fd_opts {
63 int rfd; 67 int rfd;
64 int wfd; 68 int wfd;
65 u16 port; 69 u16 port;
66 int privport; 70 bool privport;
67}; 71};
68 72
69/* 73/*
@@ -720,6 +724,20 @@ static int p9_fd_cancelled(struct p9_client *client, struct p9_req_t *req)
720 return 0; 724 return 0;
721} 725}
722 726
727static int p9_fd_show_options(struct seq_file *m, struct p9_client *clnt)
728{
729 if (clnt->trans_mod == &p9_tcp_trans) {
730 if (clnt->trans_opts.tcp.port != P9_PORT)
731 seq_printf(m, "port=%u", clnt->trans_opts.tcp.port);
732 } else if (clnt->trans_mod == &p9_fd_trans) {
733 if (clnt->trans_opts.fd.rfd != ~0)
734 seq_printf(m, "rfd=%u", clnt->trans_opts.fd.rfd);
735 if (clnt->trans_opts.fd.wfd != ~0)
736 seq_printf(m, "wfd=%u", clnt->trans_opts.fd.wfd);
737 }
738 return 0;
739}
740
723/** 741/**
724 * parse_opts - parse mount options into p9_fd_opts structure 742 * parse_opts - parse mount options into p9_fd_opts structure
725 * @params: options string passed from mount 743 * @params: options string passed from mount
@@ -738,7 +756,7 @@ static int parse_opts(char *params, struct p9_fd_opts *opts)
738 opts->port = P9_PORT; 756 opts->port = P9_PORT;
739 opts->rfd = ~0; 757 opts->rfd = ~0;
740 opts->wfd = ~0; 758 opts->wfd = ~0;
741 opts->privport = 0; 759 opts->privport = false;
742 760
743 if (!params) 761 if (!params)
744 return 0; 762 return 0;
@@ -776,7 +794,7 @@ static int parse_opts(char *params, struct p9_fd_opts *opts)
776 opts->wfd = option; 794 opts->wfd = option;
777 break; 795 break;
778 case Opt_privport: 796 case Opt_privport:
779 opts->privport = 1; 797 opts->privport = true;
780 break; 798 break;
781 default: 799 default:
782 continue; 800 continue;
@@ -942,6 +960,8 @@ p9_fd_create_tcp(struct p9_client *client, const char *addr, char *args)
942 960
943 csocket = NULL; 961 csocket = NULL;
944 962
963 client->trans_opts.tcp.port = opts.port;
964 client->trans_opts.tcp.privport = opts.privport;
945 sin_server.sin_family = AF_INET; 965 sin_server.sin_family = AF_INET;
946 sin_server.sin_addr.s_addr = in_aton(addr); 966 sin_server.sin_addr.s_addr = in_aton(addr);
947 sin_server.sin_port = htons(opts.port); 967 sin_server.sin_port = htons(opts.port);
@@ -1020,6 +1040,8 @@ p9_fd_create(struct p9_client *client, const char *addr, char *args)
1020 struct p9_fd_opts opts; 1040 struct p9_fd_opts opts;
1021 1041
1022 parse_opts(args, &opts); 1042 parse_opts(args, &opts);
1043 client->trans_opts.fd.rfd = opts.rfd;
1044 client->trans_opts.fd.wfd = opts.wfd;
1023 1045
1024 if (opts.rfd == ~0 || opts.wfd == ~0) { 1046 if (opts.rfd == ~0 || opts.wfd == ~0) {
1025 pr_err("Insufficient options for proto=fd\n"); 1047 pr_err("Insufficient options for proto=fd\n");
@@ -1044,6 +1066,7 @@ static struct p9_trans_module p9_tcp_trans = {
1044 .request = p9_fd_request, 1066 .request = p9_fd_request,
1045 .cancel = p9_fd_cancel, 1067 .cancel = p9_fd_cancel,
1046 .cancelled = p9_fd_cancelled, 1068 .cancelled = p9_fd_cancelled,
1069 .show_options = p9_fd_show_options,
1047 .owner = THIS_MODULE, 1070 .owner = THIS_MODULE,
1048}; 1071};
1049 1072
@@ -1056,6 +1079,7 @@ static struct p9_trans_module p9_unix_trans = {
1056 .request = p9_fd_request, 1079 .request = p9_fd_request,
1057 .cancel = p9_fd_cancel, 1080 .cancel = p9_fd_cancel,
1058 .cancelled = p9_fd_cancelled, 1081 .cancelled = p9_fd_cancelled,
1082 .show_options = p9_fd_show_options,
1059 .owner = THIS_MODULE, 1083 .owner = THIS_MODULE,
1060}; 1084};
1061 1085
@@ -1068,6 +1092,7 @@ static struct p9_trans_module p9_fd_trans = {
1068 .request = p9_fd_request, 1092 .request = p9_fd_request,
1069 .cancel = p9_fd_cancel, 1093 .cancel = p9_fd_cancel,
1070 .cancelled = p9_fd_cancelled, 1094 .cancelled = p9_fd_cancelled,
1095 .show_options = p9_fd_show_options,
1071 .owner = THIS_MODULE, 1096 .owner = THIS_MODULE,
1072}; 1097};
1073 1098
diff --git a/net/9p/trans_rdma.c b/net/9p/trans_rdma.c
index 553ed4ecb6a0..6d8e3031978f 100644
--- a/net/9p/trans_rdma.c
+++ b/net/9p/trans_rdma.c
@@ -43,6 +43,7 @@
43#include <linux/parser.h> 43#include <linux/parser.h>
44#include <linux/semaphore.h> 44#include <linux/semaphore.h>
45#include <linux/slab.h> 45#include <linux/slab.h>
46#include <linux/seq_file.h>
46#include <net/9p/9p.h> 47#include <net/9p/9p.h>
47#include <net/9p/client.h> 48#include <net/9p/client.h>
48#include <net/9p/transport.h> 49#include <net/9p/transport.h>
@@ -70,6 +71,8 @@
70 * @dm_mr: DMA Memory Region pointer 71 * @dm_mr: DMA Memory Region pointer
71 * @lkey: The local access only memory region key 72 * @lkey: The local access only memory region key
72 * @timeout: Number of uSecs to wait for connection management events 73 * @timeout: Number of uSecs to wait for connection management events
74 * @privport: Whether a privileged port may be used
75 * @port: The port to use
73 * @sq_depth: The depth of the Send Queue 76 * @sq_depth: The depth of the Send Queue
74 * @sq_sem: Semaphore for the SQ 77 * @sq_sem: Semaphore for the SQ
75 * @rq_depth: The depth of the Receive Queue. 78 * @rq_depth: The depth of the Receive Queue.
@@ -95,6 +98,8 @@ struct p9_trans_rdma {
95 struct ib_qp *qp; 98 struct ib_qp *qp;
96 struct ib_cq *cq; 99 struct ib_cq *cq;
97 long timeout; 100 long timeout;
101 bool privport;
102 u16 port;
98 int sq_depth; 103 int sq_depth;
99 struct semaphore sq_sem; 104 struct semaphore sq_sem;
100 int rq_depth; 105 int rq_depth;
@@ -133,10 +138,10 @@ struct p9_rdma_context {
133 */ 138 */
134struct p9_rdma_opts { 139struct p9_rdma_opts {
135 short port; 140 short port;
141 bool privport;
136 int sq_depth; 142 int sq_depth;
137 int rq_depth; 143 int rq_depth;
138 long timeout; 144 long timeout;
139 int privport;
140}; 145};
141 146
142/* 147/*
@@ -159,6 +164,23 @@ static match_table_t tokens = {
159 {Opt_err, NULL}, 164 {Opt_err, NULL},
160}; 165};
161 166
167static int p9_rdma_show_options(struct seq_file *m, struct p9_client *clnt)
168{
169 struct p9_trans_rdma *rdma = clnt->trans;
170
171 if (rdma->port != P9_PORT)
172 seq_printf(m, ",port=%u", rdma->port);
173 if (rdma->sq_depth != P9_RDMA_SQ_DEPTH)
174 seq_printf(m, ",sq=%u", rdma->sq_depth);
175 if (rdma->rq_depth != P9_RDMA_RQ_DEPTH)
176 seq_printf(m, ",rq=%u", rdma->rq_depth);
177 if (rdma->timeout != P9_RDMA_TIMEOUT)
178 seq_printf(m, ",timeout=%lu", rdma->timeout);
179 if (rdma->privport)
180 seq_puts(m, ",privport");
181 return 0;
182}
183
162/** 184/**
163 * parse_opts - parse mount options into rdma options structure 185 * parse_opts - parse mount options into rdma options structure
164 * @params: options string passed from mount 186 * @params: options string passed from mount
@@ -177,7 +199,7 @@ static int parse_opts(char *params, struct p9_rdma_opts *opts)
177 opts->sq_depth = P9_RDMA_SQ_DEPTH; 199 opts->sq_depth = P9_RDMA_SQ_DEPTH;
178 opts->rq_depth = P9_RDMA_RQ_DEPTH; 200 opts->rq_depth = P9_RDMA_RQ_DEPTH;
179 opts->timeout = P9_RDMA_TIMEOUT; 201 opts->timeout = P9_RDMA_TIMEOUT;
180 opts->privport = 0; 202 opts->privport = false;
181 203
182 if (!params) 204 if (!params)
183 return 0; 205 return 0;
@@ -218,7 +240,7 @@ static int parse_opts(char *params, struct p9_rdma_opts *opts)
218 opts->timeout = option; 240 opts->timeout = option;
219 break; 241 break;
220 case Opt_privport: 242 case Opt_privport:
221 opts->privport = 1; 243 opts->privport = true;
222 break; 244 break;
223 default: 245 default:
224 continue; 246 continue;
@@ -560,6 +582,8 @@ static struct p9_trans_rdma *alloc_rdma(struct p9_rdma_opts *opts)
560 if (!rdma) 582 if (!rdma)
561 return NULL; 583 return NULL;
562 584
585 rdma->port = opts->port;
586 rdma->privport = opts->privport;
563 rdma->sq_depth = opts->sq_depth; 587 rdma->sq_depth = opts->sq_depth;
564 rdma->rq_depth = opts->rq_depth; 588 rdma->rq_depth = opts->rq_depth;
565 rdma->timeout = opts->timeout; 589 rdma->timeout = opts->timeout;
@@ -733,6 +757,7 @@ static struct p9_trans_module p9_rdma_trans = {
733 .request = rdma_request, 757 .request = rdma_request,
734 .cancel = rdma_cancel, 758 .cancel = rdma_cancel,
735 .cancelled = rdma_cancelled, 759 .cancelled = rdma_cancelled,
760 .show_options = p9_rdma_show_options,
736}; 761};
737 762
738/** 763/**