/** * enum p9_trans_status - different states of underlying transports * @Connected: transport is connected and healthy * @Disconnected: transport has been disconnected * @Hung: transport is connected by wedged * * This enumeration details the various states a transport * instatiation can be in.
*/
/** * enum p9_req_status_t - status of a request * @REQ_STATUS_ALLOC: request has been allocated but not sent * @REQ_STATUS_UNSENT: request waiting to be sent * @REQ_STATUS_SENT: request sent to server * @REQ_STATUS_RCVD: response received from server * @REQ_STATUS_FLSHD: request has been flushed * @REQ_STATUS_ERROR: request encountered an error on the client side
*/
/** * struct p9_req_t - request slots * @status: status of this request slot * @t_err: transport error * @wq: wait_queue for the client to block on for this request * @tc: the request fcall structure * @rc: the response fcall structure * @req_list: link for higher level objects to chain requests
*/ struct p9_req_t { int status; int t_err;
refcount_t refcount;
wait_queue_head_t wq; struct p9_fcall tc; struct p9_fcall rc; struct list_head req_list;
};
/** * struct p9_client - per client instance state * @lock: protect @fids and @reqs * @msize: maximum data size negotiated by protocol * @proto_version: 9P protocol version to use * @trans_mod: module API instantiated with this client * @status: connection state * @trans: tranport instance state and API * @fids: All active FID handles * @reqs: All active requests. * @name: node name used as client id * * The client structure is used to keep track of various per-client * state that has been instantiated.
*/ struct p9_client {
spinlock_t lock; unsignedint msize; unsignedchar proto_version; struct p9_trans_module *trans_mod; enum p9_trans_status status; void *trans; struct kmem_cache *fcall_cache;
union { struct { int rfd; int wfd;
} fd; struct {
u16 port; bool privport;
} tcp;
} trans_opts;
struct idr fids; struct idr reqs;
char name[__NEW_UTS_LEN + 1];
};
/** * struct p9_fid - file system entity handle * @clnt: back pointer to instantiating &p9_client * @fid: numeric identifier for this handle * @mode: current mode of this fid (enum?) * @qid: the &p9_qid server identifier this handle points to * @iounit: the server reported maximum transaction size for this file * @uid: the numeric uid of the local user who owns this handle * @rdir: readdir accounting structure (allocated on demand) * @dlist: per-dentry fid tracking * * TODO: This needs lots of explanation.
*/ enum fid_source {
FID_FROM_OTHER,
FID_FROM_INODE,
FID_FROM_DENTRY,
};
struct hlist_node dlist; /* list of all fids attached to a dentry */ struct hlist_node ilist;
};
/** * struct p9_dirent - directory entry structure * @qid: The p9 server qid for this dirent * @d_off: offset to the next dirent * @d_type: type of file * @d_name: file name
*/
int p9_req_put(struct p9_client *c, struct p9_req_t *r);
/* We cannot have the real tracepoints in header files,
* use a wrapper function */
DECLARE_TRACEPOINT(9p_fid_ref); void do_trace_9p_fid_get(struct p9_fid *fid); void do_trace_9p_fid_put(struct p9_fid *fid);
/* fid reference counting helpers: * - fids used for any length of time should always be referenced through * p9_fid_get(), and released with p9_fid_put() * - v9fs_fid_lookup() or similar will automatically call get for you * and also require a put * - the *_fid_add() helpers will stash the fid in the inode, * at which point it is the responsibility of evict_inode() * to call the put * - the last put will automatically send a clunk to the server
*/ staticinlinestruct p9_fid *p9_fid_get(struct p9_fid *fid)
{ if (tracepoint_enabled(9p_fid_ref))
do_trace_9p_fid_get(fid);
refcount_inc(&fid->count);
return fid;
}
staticinlineint p9_fid_put(struct p9_fid *fid)
{ if (!fid || IS_ERR(fid)) return0;
if (tracepoint_enabled(9p_fid_ref))
do_trace_9p_fid_put(fid);
if (!refcount_dec_and_test(&fid->count)) return0;
return p9_client_clunk(fid);
}
void p9_client_cb(struct p9_client *c, struct p9_req_t *req, int status);
int p9_parse_header(struct p9_fcall *pdu, int32_t *size, int8_t *type,
int16_t *tag, int rewind); int p9stat_read(struct p9_client *clnt, char *buf, int len, struct p9_wstat *st); void p9stat_free(struct p9_wstat *stbuf);
int p9_is_proto_dotu(struct p9_client *clnt); int p9_is_proto_dotl(struct p9_client *clnt); struct p9_fid *p9_client_xattrwalk(struct p9_fid *file_fid, constchar *attr_name, u64 *attr_size); int p9_client_xattrcreate(struct p9_fid *fid, constchar *name,
u64 attr_size, int flags); int p9_client_readlink(struct p9_fid *fid, char **target);
int p9_client_init(void); void p9_client_exit(void);
#endif/* NET_9P_CLIENT_H */
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-06-07)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.