client.h 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. /*
  2. * include/net/9p/client.h
  3. *
  4. * 9P Client Definitions
  5. *
  6. * Copyright (C) 2008 by Eric Van Hensbergen <ericvh@gmail.com>
  7. * Copyright (C) 2007 by Latchesar Ionkov <lucho@ionkov.net>
  8. *
  9. * This program is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License version 2
  11. * as published by the Free Software Foundation.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to:
  20. * Free Software Foundation
  21. * 51 Franklin Street, Fifth Floor
  22. * Boston, MA 02111-1301 USA
  23. *
  24. */
  25. #ifndef NET_9P_CLIENT_H
  26. #define NET_9P_CLIENT_H
  27. /* Number of requests per row */
  28. #define P9_ROW_MAXTAG 255
  29. /**
  30. * enum p9_trans_status - different states of underlying transports
  31. * @Connected: transport is connected and healthy
  32. * @Disconnected: transport has been disconnected
  33. * @Hung: transport is connected by wedged
  34. *
  35. * This enumeration details the various states a transport
  36. * instatiation can be in.
  37. */
  38. enum p9_trans_status {
  39. Connected,
  40. Disconnected,
  41. Hung,
  42. };
  43. /**
  44. * enum p9_req_status_t - virtio request status
  45. * @REQ_STATUS_IDLE: request slot unused
  46. * @REQ_STATUS_ALLOC: request has been allocated but not sent
  47. * @REQ_STATUS_UNSENT: request waiting to be sent
  48. * @REQ_STATUS_SENT: request sent to server
  49. * @REQ_STATUS_FLSH: a flush has been sent for this request
  50. * @REQ_STATUS_RCVD: response received from server
  51. * @REQ_STATUS_FLSHD: request has been flushed
  52. * @REQ_STATUS_ERROR: request encountered an error on the client side
  53. *
  54. * The @REQ_STATUS_IDLE state is used to mark a request slot as unused
  55. * but use is actually tracked by the idpool structure which handles tag
  56. * id allocation.
  57. *
  58. */
  59. enum p9_req_status_t {
  60. REQ_STATUS_IDLE,
  61. REQ_STATUS_ALLOC,
  62. REQ_STATUS_UNSENT,
  63. REQ_STATUS_SENT,
  64. REQ_STATUS_FLSH,
  65. REQ_STATUS_RCVD,
  66. REQ_STATUS_FLSHD,
  67. REQ_STATUS_ERROR,
  68. };
  69. /**
  70. * struct p9_req_t - request slots
  71. * @status: status of this request slot
  72. * @t_err: transport error
  73. * @flush_tag: tag of request being flushed (for flush requests)
  74. * @wq: wait_queue for the client to block on for this request
  75. * @tc: the request fcall structure
  76. * @rc: the response fcall structure
  77. * @aux: transport specific data (provided for trans_fd migration)
  78. * @req_list: link for higher level objects to chain requests
  79. *
  80. * Transport use an array to track outstanding requests
  81. * instead of a list. While this may incurr overhead during initial
  82. * allocation or expansion, it makes request lookup much easier as the
  83. * tag id is a index into an array. (We use tag+1 so that we can accomodate
  84. * the -1 tag for the T_VERSION request).
  85. * This also has the nice effect of only having to allocate wait_queues
  86. * once, instead of constantly allocating and freeing them. Its possible
  87. * other resources could benefit from this scheme as well.
  88. *
  89. */
  90. struct p9_req_t {
  91. int status;
  92. int t_err;
  93. wait_queue_head_t *wq;
  94. struct p9_fcall *tc;
  95. struct p9_fcall *rc;
  96. void *aux;
  97. struct list_head req_list;
  98. };
  99. /**
  100. * struct p9_client - per client instance state
  101. * @lock: protect @fidlist
  102. * @msize: maximum data size negotiated by protocol
  103. * @dotu: extension flags negotiated by protocol
  104. * @trans_mod: module API instantiated with this client
  105. * @trans: tranport instance state and API
  106. * @conn: connection state information used by trans_fd
  107. * @fidpool: fid handle accounting for session
  108. * @fidlist: List of active fid handles
  109. * @tagpool - transaction id accounting for session
  110. * @reqs - 2D array of requests
  111. * @max_tag - current maximum tag id allocated
  112. *
  113. * The client structure is used to keep track of various per-client
  114. * state that has been instantiated.
  115. * In order to minimize per-transaction overhead we use a
  116. * simple array to lookup requests instead of a hash table
  117. * or linked list. In order to support larger number of
  118. * transactions, we make this a 2D array, allocating new rows
  119. * when we need to grow the total number of the transactions.
  120. *
  121. * Each row is 256 requests and we'll support up to 256 rows for
  122. * a total of 64k concurrent requests per session.
  123. *
  124. * Bugs: duplicated data and potentially unnecessary elements.
  125. */
  126. struct p9_client {
  127. spinlock_t lock; /* protect client structure */
  128. int msize;
  129. unsigned char dotu;
  130. struct p9_trans_module *trans_mod;
  131. enum p9_trans_status status;
  132. void *trans;
  133. struct p9_conn *conn;
  134. struct p9_idpool *fidpool;
  135. struct list_head fidlist;
  136. struct p9_idpool *tagpool;
  137. struct p9_req_t *reqs[P9_ROW_MAXTAG];
  138. int max_tag;
  139. };
  140. /**
  141. * struct p9_fid - file system entity handle
  142. * @clnt: back pointer to instantiating &p9_client
  143. * @fid: numeric identifier for this handle
  144. * @mode: current mode of this fid (enum?)
  145. * @qid: the &p9_qid server identifier this handle points to
  146. * @iounit: the server reported maximum transaction size for this file
  147. * @uid: the numeric uid of the local user who owns this handle
  148. * @aux: transport specific information (unused?)
  149. * @rdir_fpos: tracks offset of file position when reading directory contents
  150. * @flist: per-client-instance fid tracking
  151. * @dlist: per-dentry fid tracking
  152. *
  153. * TODO: This needs lots of explanation.
  154. */
  155. struct p9_fid {
  156. struct p9_client *clnt;
  157. u32 fid;
  158. int mode;
  159. struct p9_qid qid;
  160. u32 iounit;
  161. uid_t uid;
  162. void *aux;
  163. int rdir_fpos;
  164. struct list_head flist;
  165. struct list_head dlist; /* list of all fids attached to a dentry */
  166. };
  167. int p9_client_version(struct p9_client *);
  168. struct p9_client *p9_client_create(const char *dev_name, char *options);
  169. void p9_client_destroy(struct p9_client *clnt);
  170. void p9_client_disconnect(struct p9_client *clnt);
  171. struct p9_fid *p9_client_attach(struct p9_client *clnt, struct p9_fid *afid,
  172. char *uname, u32 n_uname, char *aname);
  173. struct p9_fid *p9_client_auth(struct p9_client *clnt, char *uname,
  174. u32 n_uname, char *aname);
  175. struct p9_fid *p9_client_walk(struct p9_fid *oldfid, int nwname, char **wnames,
  176. int clone);
  177. int p9_client_open(struct p9_fid *fid, int mode);
  178. int p9_client_fcreate(struct p9_fid *fid, char *name, u32 perm, int mode,
  179. char *extension);
  180. int p9_client_clunk(struct p9_fid *fid);
  181. int p9_client_remove(struct p9_fid *fid);
  182. int p9_client_read(struct p9_fid *fid, char *data, char __user *udata,
  183. u64 offset, u32 count);
  184. int p9_client_write(struct p9_fid *fid, char *data, const char __user *udata,
  185. u64 offset, u32 count);
  186. struct p9_wstat *p9_client_stat(struct p9_fid *fid);
  187. int p9_client_wstat(struct p9_fid *fid, struct p9_wstat *wst);
  188. struct p9_req_t *p9_tag_lookup(struct p9_client *, u16);
  189. void p9_client_cb(struct p9_client *c, struct p9_req_t *req);
  190. int p9_parse_header(struct p9_fcall *, int32_t *, int8_t *, int16_t *, int);
  191. int p9stat_read(char *, int, struct p9_wstat *, int);
  192. void p9stat_free(struct p9_wstat *);
  193. #endif /* NET_9P_CLIENT_H */