linux/include/linux/ceph/osd_client.h
<<
>>
Prefs
   1#ifndef _FS_CEPH_OSD_CLIENT_H
   2#define _FS_CEPH_OSD_CLIENT_H
   3
   4#include <linux/completion.h>
   5#include <linux/kref.h>
   6#include <linux/mempool.h>
   7#include <linux/rbtree.h>
   8
   9#include "types.h"
  10#include "osdmap.h"
  11#include "messenger.h"
  12
  13/* 
  14 * Maximum object name size 
  15 * (must be at least as big as RBD_MAX_MD_NAME_LEN -- currently 100) 
  16 */
  17#define MAX_OBJ_NAME_SIZE 100
  18
  19struct ceph_msg;
  20struct ceph_snap_context;
  21struct ceph_osd_request;
  22struct ceph_osd_client;
  23struct ceph_authorizer;
  24struct ceph_pagelist;
  25
  26/*
  27 * completion callback for async writepages
  28 */
  29typedef void (*ceph_osdc_callback_t)(struct ceph_osd_request *,
  30                                     struct ceph_msg *);
  31
  32/* a given osd we're communicating with */
  33struct ceph_osd {
  34        atomic_t o_ref;
  35        struct ceph_osd_client *o_osdc;
  36        int o_osd;
  37        int o_incarnation;
  38        struct rb_node o_node;
  39        struct ceph_connection o_con;
  40        struct list_head o_requests;
  41        struct list_head o_linger_requests;
  42        struct list_head o_osd_lru;
  43        struct ceph_authorizer *o_authorizer;
  44        void *o_authorizer_buf, *o_authorizer_reply_buf;
  45        size_t o_authorizer_buf_len, o_authorizer_reply_buf_len;
  46        unsigned long lru_ttl;
  47        int o_marked_for_keepalive;
  48        struct list_head o_keepalive_item;
  49};
  50
  51/* an in-flight request */
  52struct ceph_osd_request {
  53        u64             r_tid;              /* unique for this client */
  54        struct rb_node  r_node;
  55        struct list_head r_req_lru_item;
  56        struct list_head r_osd_item;
  57        struct list_head r_linger_item;
  58        struct list_head r_linger_osd;
  59        struct ceph_osd *r_osd;
  60        struct ceph_pg   r_pgid;
  61        int              r_pg_osds[CEPH_PG_MAX_SIZE];
  62        int              r_num_pg_osds;
  63
  64        struct ceph_connection *r_con_filling_msg;
  65
  66        struct ceph_msg  *r_request, *r_reply;
  67        int               r_result;
  68        int               r_flags;     /* any additional flags for the osd */
  69        u32               r_sent;      /* >0 if r_request is sending/sent */
  70        int               r_got_reply;
  71        int               r_linger;
  72
  73        struct ceph_osd_client *r_osdc;
  74        struct kref       r_kref;
  75        bool              r_mempool;
  76        struct completion r_completion, r_safe_completion;
  77        ceph_osdc_callback_t r_callback, r_safe_callback;
  78        struct ceph_eversion r_reassert_version;
  79        struct list_head  r_unsafe_item;
  80
  81        struct inode *r_inode;                /* for use by callbacks */
  82        void *r_priv;                         /* ditto */
  83
  84        char              r_oid[MAX_OBJ_NAME_SIZE];          /* object name */
  85        int               r_oid_len;
  86        unsigned long     r_stamp;            /* send OR check time */
  87
  88        struct ceph_file_layout r_file_layout;
  89        struct ceph_snap_context *r_snapc;    /* snap context for writes */
  90        unsigned          r_num_pages;        /* size of page array (follows) */
  91        unsigned          r_page_alignment;   /* io offset in first page */
  92        struct page     **r_pages;            /* pages for data payload */
  93        int               r_pages_from_pool;
  94        int               r_own_pages;        /* if true, i own page list */
  95#ifdef CONFIG_BLOCK
  96        struct bio       *r_bio;              /* instead of pages */
  97#endif
  98
  99        struct ceph_pagelist *r_trail;        /* trailing part of the data */
 100};
 101
 102struct ceph_osd_event {
 103        u64 cookie;
 104        int one_shot;
 105        struct ceph_osd_client *osdc;
 106        void (*cb)(u64, u64, u8, void *);
 107        void *data;
 108        struct rb_node node;
 109        struct list_head osd_node;
 110        struct kref kref;
 111        struct completion completion;
 112};
 113
 114struct ceph_osd_event_work {
 115        struct work_struct work;
 116        struct ceph_osd_event *event;
 117        u64 ver;
 118        u64 notify_id;
 119        u8 opcode;
 120};
 121
 122struct ceph_osd_client {
 123        struct ceph_client     *client;
 124
 125        struct ceph_osdmap     *osdmap;       /* current map */
 126        struct rw_semaphore    map_sem;
 127        struct completion      map_waiters;
 128        u64                    last_requested_map;
 129
 130        struct mutex           request_mutex;
 131        struct rb_root         osds;          /* osds */
 132        struct list_head       osd_lru;       /* idle osds */
 133        u64                    timeout_tid;   /* tid of timeout triggering rq */
 134        u64                    last_tid;      /* tid of last request */
 135        struct rb_root         requests;      /* pending requests */
 136        struct list_head       req_lru;       /* in-flight lru */
 137        struct list_head       req_unsent;    /* unsent/need-resend queue */
 138        struct list_head       req_notarget;  /* map to no osd */
 139        struct list_head       req_linger;    /* lingering requests */
 140        int                    num_requests;
 141        struct delayed_work    timeout_work;
 142        struct delayed_work    osds_timeout_work;
 143#ifdef CONFIG_DEBUG_FS
 144        struct dentry          *debugfs_file;
 145#endif
 146
 147        mempool_t              *req_mempool;
 148
 149        struct ceph_msgpool     msgpool_op;
 150        struct ceph_msgpool     msgpool_op_reply;
 151
 152        spinlock_t              event_lock;
 153        struct rb_root          event_tree;
 154        u64                     event_count;
 155
 156        struct workqueue_struct *notify_wq;
 157};
 158
 159struct ceph_osd_req_op {
 160        u16 op;           /* CEPH_OSD_OP_* */
 161        u32 flags;        /* CEPH_OSD_FLAG_* */
 162        union {
 163                struct {
 164                        u64 offset, length;
 165                        u64 truncate_size;
 166                        u32 truncate_seq;
 167                } extent;
 168                struct {
 169                        const char *name;
 170                        u32 name_len;
 171                        const char  *val;
 172                        u32 value_len;
 173                        __u8 cmp_op;       /* CEPH_OSD_CMPXATTR_OP_* */
 174                        __u8 cmp_mode;     /* CEPH_OSD_CMPXATTR_MODE_* */
 175                } xattr;
 176                struct {
 177                        const char *class_name;
 178                        __u8 class_len;
 179                        const char *method_name;
 180                        __u8 method_len;
 181                        __u8 argc;
 182                        const char *indata;
 183                        u32 indata_len;
 184                } cls;
 185                struct {
 186                        u64 cookie, count;
 187                } pgls;
 188                struct {
 189                        u64 snapid;
 190                } snap;
 191                struct {
 192                        u64 cookie;
 193                        u64 ver;
 194                        __u8 flag;
 195                        u32 prot_ver;
 196                        u32 timeout;
 197                } watch;
 198        };
 199        u32 payload_len;
 200};
 201
 202extern int ceph_osdc_init(struct ceph_osd_client *osdc,
 203                          struct ceph_client *client);
 204extern void ceph_osdc_stop(struct ceph_osd_client *osdc);
 205
 206extern void ceph_osdc_handle_reply(struct ceph_osd_client *osdc,
 207                                   struct ceph_msg *msg);
 208extern void ceph_osdc_handle_map(struct ceph_osd_client *osdc,
 209                                 struct ceph_msg *msg);
 210
 211extern void ceph_calc_raw_layout(struct ceph_osd_client *osdc,
 212                        struct ceph_file_layout *layout,
 213                        u64 snapid,
 214                        u64 off, u64 *plen, u64 *bno,
 215                        struct ceph_osd_request *req,
 216                        struct ceph_osd_req_op *op);
 217
 218extern struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc,
 219                                               int flags,
 220                                               struct ceph_snap_context *snapc,
 221                                               struct ceph_osd_req_op *ops,
 222                                               bool use_mempool,
 223                                               gfp_t gfp_flags,
 224                                               struct page **pages,
 225                                               struct bio *bio);
 226
 227extern void ceph_osdc_build_request(struct ceph_osd_request *req,
 228                                    u64 off, u64 *plen,
 229                                    struct ceph_osd_req_op *src_ops,
 230                                    struct ceph_snap_context *snapc,
 231                                    struct timespec *mtime,
 232                                    const char *oid,
 233                                    int oid_len);
 234
 235extern struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *,
 236                                      struct ceph_file_layout *layout,
 237                                      struct ceph_vino vino,
 238                                      u64 offset, u64 *len, int op, int flags,
 239                                      struct ceph_snap_context *snapc,
 240                                      int do_sync, u32 truncate_seq,
 241                                      u64 truncate_size,
 242                                      struct timespec *mtime,
 243                                      bool use_mempool, int num_reply,
 244                                      int page_align);
 245
 246extern void ceph_osdc_set_request_linger(struct ceph_osd_client *osdc,
 247                                         struct ceph_osd_request *req);
 248extern void ceph_osdc_unregister_linger_request(struct ceph_osd_client *osdc,
 249                                                struct ceph_osd_request *req);
 250
 251static inline void ceph_osdc_get_request(struct ceph_osd_request *req)
 252{
 253        kref_get(&req->r_kref);
 254}
 255extern void ceph_osdc_release_request(struct kref *kref);
 256static inline void ceph_osdc_put_request(struct ceph_osd_request *req)
 257{
 258        kref_put(&req->r_kref, ceph_osdc_release_request);
 259}
 260
 261extern int ceph_osdc_start_request(struct ceph_osd_client *osdc,
 262                                   struct ceph_osd_request *req,
 263                                   bool nofail);
 264extern int ceph_osdc_wait_request(struct ceph_osd_client *osdc,
 265                                  struct ceph_osd_request *req);
 266extern void ceph_osdc_sync(struct ceph_osd_client *osdc);
 267
 268extern int ceph_osdc_readpages(struct ceph_osd_client *osdc,
 269                               struct ceph_vino vino,
 270                               struct ceph_file_layout *layout,
 271                               u64 off, u64 *plen,
 272                               u32 truncate_seq, u64 truncate_size,
 273                               struct page **pages, int nr_pages,
 274                               int page_align);
 275
 276extern int ceph_osdc_writepages(struct ceph_osd_client *osdc,
 277                                struct ceph_vino vino,
 278                                struct ceph_file_layout *layout,
 279                                struct ceph_snap_context *sc,
 280                                u64 off, u64 len,
 281                                u32 truncate_seq, u64 truncate_size,
 282                                struct timespec *mtime,
 283                                struct page **pages, int nr_pages,
 284                                int flags, int do_sync, bool nofail);
 285
 286/* watch/notify events */
 287extern int ceph_osdc_create_event(struct ceph_osd_client *osdc,
 288                                  void (*event_cb)(u64, u64, u8, void *),
 289                                  int one_shot, void *data,
 290                                  struct ceph_osd_event **pevent);
 291extern void ceph_osdc_cancel_event(struct ceph_osd_event *event);
 292extern int ceph_osdc_wait_event(struct ceph_osd_event *event,
 293                                unsigned long timeout);
 294extern void ceph_osdc_put_event(struct ceph_osd_event *event);
 295#endif
 296
 297