Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / ceph / src / client / Client.h
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- 
2 // vim: ts=8 sw=2 smarttab
3 /*
4  * Ceph - scalable distributed file system
5  *
6  * Copyright (C) 2004-2006 Sage Weil <sage@newdream.net>
7  *
8  * This is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License version 2.1, as published by the Free Software
11  * Foundation.  See file COPYING.
12  *
13  */
14
15
16 #ifndef CEPH_CLIENT_H
17 #define CEPH_CLIENT_H
18
19 #include "include/types.h"
20
21 // stl
22 #include <string>
23 #include <memory>
24 #include <set>
25 #include <map>
26 #include <fstream>
27 using std::set;
28 using std::map;
29 using std::fstream;
30
31 #include "include/unordered_set.h"
32 #include "include/unordered_map.h"
33 #include "include/filepath.h"
34 #include "include/interval_set.h"
35 #include "include/lru.h"
36 #include "mds/mdstypes.h"
37 #include "msg/Dispatcher.h"
38 #include "msg/Messenger.h"
39
40 #include "common/Mutex.h"
41 #include "common/Timer.h"
42 #include "common/Finisher.h"
43 #include "common/compiler_extensions.h"
44 #include "common/cmdparse.h"
45 #include "common/CommandTable.h"
46
47 #include "osdc/ObjectCacher.h"
48
49 #include "InodeRef.h"
50 #include "UserPerm.h"
51 #include "include/cephfs/ceph_statx.h"
52
53 class FSMap;
54 class FSMapUser;
55 class MonClient;
56
57 class CephContext;
58 class MClientReply;
59 class MClientRequest;
60 class MClientSession;
61 class MClientRequest;
62 class MClientRequestForward;
63 struct MClientLease;
64 class MClientCaps;
65 class MClientCapRelease;
66
67 struct DirStat;
68 struct LeaseStat;
69 struct InodeStat;
70
71 class Filer;
72 class Objecter;
73 class WritebackHandler;
74
75 class PerfCounters;
76 class MDSMap;
77 class Message;
78
79 enum {
80   l_c_first = 20000,
81   l_c_reply,
82   l_c_lat,
83   l_c_wrlat,
84   l_c_last,
85 };
86
87
88 class MDSCommandOp : public CommandOp
89 {
90   public:
91   mds_gid_t     mds_gid;
92
93   MDSCommandOp(ceph_tid_t t) : CommandOp(t) {}
94 };
95
96 /* error code for ceph_fuse */
97 #define CEPH_FUSE_NO_MDS_UP    -(1<<2) /* no mds up deteced in ceph_fuse */
98
99 // ============================================
100 // types for my local metadata cache
101 /* basic structure:
102    
103  - Dentries live in an LRU loop.  they get expired based on last access.
104       see include/lru.h.  items can be bumped to "mid" or "top" of list, etc.
105  - Inode has ref count for each Fh, Dir, or Dentry that points to it.
106  - when Inode ref goes to 0, it's expired.
107  - when Dir is empty, it's removed (and it's Inode ref--)
108  
109 */
110
111 /* getdir result */
112 struct DirEntry {
113   string d_name;
114   struct stat st;
115   int stmask;
116   explicit DirEntry(const string &s) : d_name(s), stmask(0) {}
117   DirEntry(const string &n, struct stat& s, int stm) : d_name(n), st(s), stmask(stm) {}
118 };
119
120 struct Cap;
121 class Dir;
122 class Dentry;
123 struct SnapRealm;
124 struct Fh;
125 struct CapSnap;
126
127 struct MetaSession;
128 struct MetaRequest;
129 class ceph_lock_state_t;
130
131
132 typedef void (*client_ino_callback_t)(void *handle, vinodeno_t ino, int64_t off, int64_t len);
133
134 typedef void (*client_dentry_callback_t)(void *handle, vinodeno_t dirino,
135                                          vinodeno_t ino, string& name);
136 typedef int (*client_remount_callback_t)(void *handle);
137
138 typedef int (*client_getgroups_callback_t)(void *handle, gid_t **sgids);
139 typedef void(*client_switch_interrupt_callback_t)(void *handle, void *data);
140 typedef mode_t (*client_umask_callback_t)(void *handle);
141
142 struct client_callback_args {
143   void *handle;
144   client_ino_callback_t ino_cb;
145   client_dentry_callback_t dentry_cb;
146   client_switch_interrupt_callback_t switch_intr_cb;
147   client_remount_callback_t remount_cb;
148   client_getgroups_callback_t getgroups_cb;
149   client_umask_callback_t umask_cb;
150 };
151
152 // ========================================================
153 // client interface
154
155 struct dir_result_t {
156   static const int SHIFT = 28;
157   static const int64_t MASK = (1 << SHIFT) - 1;
158   static const int64_t HASH = 0xFFULL << (SHIFT + 24); // impossible frag bits
159   static const loff_t END = 1ULL << (SHIFT + 32);
160
161   static uint64_t make_fpos(unsigned h, unsigned l, bool hash) {
162     uint64_t v =  ((uint64_t)h<< SHIFT) | (uint64_t)l;
163     if (hash)
164       v |= HASH;
165     else
166       assert((v & HASH) != HASH);
167     return v;
168   }
169   static unsigned fpos_high(uint64_t p) {
170     unsigned v = (p & (END-1)) >> SHIFT;
171     if ((p & HASH) == HASH)
172       return ceph_frag_value(v);
173     return v;
174   }
175   static unsigned fpos_low(uint64_t p) {
176     return p & MASK;
177   }
178   static int fpos_cmp(uint64_t l, uint64_t r) {
179     int c = ceph_frag_compare(fpos_high(l), fpos_high(r));
180     if (c)
181       return c;
182     if (fpos_low(l) == fpos_low(r))
183       return 0;
184     return fpos_low(l) < fpos_low(r) ? -1 : 1;
185   }
186
187   InodeRef inode;
188   int64_t offset;        // hash order:
189                          //   (0xff << 52) | ((24 bits hash) << 28) |
190                          //   (the nth entry has hash collision);
191                          // frag+name order;
192                          //   ((frag value) << 28) | (the nth entry in frag);
193
194   unsigned next_offset;  // offset of next chunk (last_name's + 1)
195   string last_name;      // last entry in previous chunk
196
197   uint64_t release_count;
198   uint64_t ordered_count;
199   unsigned cache_index;
200   int start_shared_gen;  // dir shared_gen at start of readdir
201   UserPerm perms;
202
203   frag_t buffer_frag;
204
205   struct dentry {
206     int64_t offset;
207     string name;
208     InodeRef inode;
209     dentry(int64_t o) : offset(o) {}
210     dentry(int64_t o, const string& n, const InodeRef& in) :
211       offset(o), name(n), inode(in) {}
212   };
213   struct dentry_off_lt {
214     bool operator()(const dentry& d, int64_t off) const {
215       return dir_result_t::fpos_cmp(d.offset, off) < 0;
216     }
217   };
218   vector<dentry> buffer;
219
220   explicit dir_result_t(Inode *in, const UserPerm& perms);
221
222   unsigned offset_high() { return fpos_high(offset); }
223   unsigned offset_low() { return fpos_low(offset); }
224
225   void set_end() { offset |= END; }
226   bool at_end() { return (offset & END); }
227
228   void set_hash_order() { offset |= HASH; }
229   bool hash_order() { return (offset & HASH) == HASH; }
230
231   bool is_cached() {
232     if (buffer.empty())
233       return false;
234     if (hash_order()) {
235       return buffer_frag.contains(offset_high());
236     } else {
237       return buffer_frag == frag_t(offset_high());
238     }
239   }
240
241   void reset() {
242     last_name.clear();
243     next_offset = 2;
244     offset = 0;
245     ordered_count = 0;
246     cache_index = 0;
247     buffer.clear();
248   }
249 };
250
251 class Client : public Dispatcher, public md_config_obs_t {
252  public:
253   using Dispatcher::cct;
254
255   std::unique_ptr<PerfCounters> logger;
256
257   class CommandHook : public AdminSocketHook {
258     Client *m_client;
259   public:
260     explicit CommandHook(Client *client);
261     bool call(std::string command, cmdmap_t &cmdmap, std::string format,
262               bufferlist& out) override;
263   };
264   CommandHook m_command_hook;
265
266   // cluster descriptors
267   std::unique_ptr<MDSMap> mdsmap;
268
269   SafeTimer timer;
270
271   void *callback_handle;
272   client_switch_interrupt_callback_t switch_interrupt_cb;
273   client_remount_callback_t remount_cb;
274   client_ino_callback_t ino_invalidate_cb;
275   client_dentry_callback_t dentry_invalidate_cb;
276   client_getgroups_callback_t getgroups_cb;
277   client_umask_callback_t umask_cb;
278   bool can_invalidate_dentries;
279   bool require_remount;
280
281   Finisher async_ino_invalidator;
282   Finisher async_dentry_invalidator;
283   Finisher interrupt_finisher;
284   Finisher remount_finisher;
285   Finisher objecter_finisher;
286
287   Context *tick_event;
288   utime_t last_cap_renew;
289   void renew_caps();
290   void renew_caps(MetaSession *session);
291   void flush_cap_releases();
292 public:
293   void tick();
294
295   UserPerm pick_my_perms() {
296     uid_t uid = user_id >= 0 ? user_id : -1;
297     gid_t gid = group_id >= 0 ? group_id : -1;
298     return UserPerm(uid, gid);
299   }
300
301   static UserPerm pick_my_perms(CephContext *c) {
302     uid_t uid = c->_conf->client_mount_uid >= 0 ? c->_conf->client_mount_uid : -1;
303     gid_t gid = c->_conf->client_mount_gid >= 0 ? c->_conf->client_mount_gid : -1;
304     return UserPerm(uid, gid);
305   }
306 protected:
307   Messenger *messenger;  
308   MonClient *monclient;
309   Objecter  *objecter;
310
311   client_t whoami;
312
313   int user_id, group_id;
314   int acl_type;
315
316   void set_cap_epoch_barrier(epoch_t e);
317   epoch_t cap_epoch_barrier;
318
319   // mds sessions
320   map<mds_rank_t, MetaSession*> mds_sessions;  // mds -> push seq
321   list<Cond*> waiting_for_mdsmap;
322
323   // FSMap, for when using mds_command
324   list<Cond*> waiting_for_fsmap;
325   std::unique_ptr<FSMap> fsmap;
326   std::unique_ptr<FSMapUser> fsmap_user;
327
328   // MDS command state
329   CommandTable<MDSCommandOp> command_table;
330   void handle_command_reply(MCommandReply *m);
331   int fetch_fsmap(bool user);
332   int resolve_mds(
333       const std::string &mds_spec,
334       std::vector<mds_gid_t> *targets);
335
336   void get_session_metadata(std::map<std::string, std::string> *meta) const;
337   bool have_open_session(mds_rank_t mds);
338   void got_mds_push(MetaSession *s);
339   MetaSession *_get_mds_session(mds_rank_t mds, Connection *con);  ///< return session for mds *and* con; null otherwise
340   MetaSession *_get_or_open_mds_session(mds_rank_t mds);
341   MetaSession *_open_mds_session(mds_rank_t mds);
342   void _close_mds_session(MetaSession *s);
343   void _closed_mds_session(MetaSession *s);
344   bool _any_stale_sessions() const;
345   void _kick_stale_sessions();
346   void handle_client_session(MClientSession *m);
347   void send_reconnect(MetaSession *s);
348   void resend_unsafe_requests(MetaSession *s);
349   void wait_unsafe_requests();
350
351   // mds requests
352   ceph_tid_t last_tid;
353   ceph_tid_t oldest_tid; // oldest incomplete mds request, excluding setfilelock requests
354   map<ceph_tid_t, MetaRequest*> mds_requests;
355
356   // cap flushing
357   ceph_tid_t last_flush_tid;
358
359   void dump_mds_requests(Formatter *f);
360   void dump_mds_sessions(Formatter *f);
361
362   int make_request(MetaRequest *req, const UserPerm& perms,
363                    InodeRef *ptarget = 0, bool *pcreated = 0,
364                    mds_rank_t use_mds=-1, bufferlist *pdirbl=0);
365   void put_request(MetaRequest *request);
366   void unregister_request(MetaRequest *request);
367
368   int verify_reply_trace(int r, MetaRequest *request, MClientReply *reply,
369                          InodeRef *ptarget, bool *pcreated,
370                          const UserPerm& perms);
371   void encode_cap_releases(MetaRequest *request, mds_rank_t mds);
372   int encode_inode_release(Inode *in, MetaRequest *req,
373                            mds_rank_t mds, int drop,
374                            int unless,int force=0);
375   void encode_dentry_release(Dentry *dn, MetaRequest *req,
376                              mds_rank_t mds, int drop, int unless);
377   mds_rank_t choose_target_mds(MetaRequest *req, Inode** phash_diri=NULL);
378   void connect_mds_targets(mds_rank_t mds);
379   void send_request(MetaRequest *request, MetaSession *session,
380                     bool drop_cap_releases=false);
381   MClientRequest *build_client_request(MetaRequest *request);
382   void kick_requests(MetaSession *session);
383   void kick_requests_closed(MetaSession *session);
384   void handle_client_request_forward(MClientRequestForward *reply);
385   void handle_client_reply(MClientReply *reply);
386   bool is_dir_operation(MetaRequest *request);
387
388   bool   initialized;
389   bool   mounted;
390   bool   unmounting;
391   bool   blacklisted;
392
393   // When an MDS has sent us a REJECT, remember that and don't
394   // contact it again.  Remember which inst rejected us, so that
395   // when we talk to another inst with the same rank we can
396   // try again.
397   std::map<mds_rank_t, entity_inst_t> rejected_by_mds;
398
399   int local_osd;
400   epoch_t local_osd_epoch;
401
402   int unsafe_sync_write;
403
404 public:
405   entity_name_t get_myname() { return messenger->get_myname(); } 
406   void _sync_write_commit(Inode *in);
407
408 protected:
409   std::unique_ptr<Filer>             filer;
410   std::unique_ptr<ObjectCacher>      objectcacher;
411   std::unique_ptr<WritebackHandler>  writeback_handler;
412
413   // cache
414   ceph::unordered_map<vinodeno_t, Inode*> inode_map;
415
416   // fake inode number for 32-bits ino_t
417   ceph::unordered_map<ino_t, vinodeno_t> faked_ino_map;
418   interval_set<ino_t> free_faked_inos;
419   ino_t last_used_faked_ino;
420   void _assign_faked_ino(Inode *in);
421   void _release_faked_ino(Inode *in);
422   bool _use_faked_inos;
423   void _reset_faked_inos();
424   vinodeno_t _map_faked_ino(ino_t ino);
425
426   Inode*                 root;
427   map<Inode*, InodeRef>  root_parents;
428   Inode*                 root_ancestor;
429   LRU                    lru;    // lru list of Dentry's in our local metadata cache.
430
431   // all inodes with caps sit on either cap_list or delayed_caps.
432   xlist<Inode*> delayed_caps, cap_list;
433   int num_flushing_caps;
434   ceph::unordered_map<inodeno_t,SnapRealm*> snap_realms;
435
436   // Optional extra metadata about me to send to the MDS
437   std::map<std::string, std::string> metadata;
438   void populate_metadata(const std::string &mount_root);
439
440
441   /* async block write barrier support */
442   //map<uint64_t, BarrierContext* > barriers;
443
444   SnapRealm *get_snap_realm(inodeno_t r);
445   SnapRealm *get_snap_realm_maybe(inodeno_t r);
446   void put_snap_realm(SnapRealm *realm);
447   bool adjust_realm_parent(SnapRealm *realm, inodeno_t parent);
448   void update_snap_trace(bufferlist& bl, SnapRealm **realm_ret, bool must_flush=true);
449   void invalidate_snaprealm_and_children(SnapRealm *realm);
450
451   Inode *open_snapdir(Inode *diri);
452
453
454   // file handles, etc.
455   interval_set<int> free_fd_set;  // unused fds
456   ceph::unordered_map<int, Fh*> fd_map;
457   set<Fh*> ll_unclosed_fh_set;
458   ceph::unordered_set<dir_result_t*> opened_dirs;
459   
460   int get_fd() {
461     int fd = free_fd_set.range_start();
462     free_fd_set.erase(fd, 1);
463     return fd;
464   }
465   void put_fd(int fd) {
466     free_fd_set.insert(fd, 1);
467   }
468
469   /*
470    * Resolve file descriptor, or return NULL.
471    */
472   Fh *get_filehandle(int fd) {
473     ceph::unordered_map<int, Fh*>::iterator p = fd_map.find(fd);
474     if (p == fd_map.end())
475       return NULL;
476     return p->second;
477   }
478
479   // global client lock
480   //  - protects Client and buffer cache both!
481   Mutex                  client_lock;
482
483   // helpers
484   void wake_inode_waiters(MetaSession *s);
485   void wait_on_list(list<Cond*>& ls);
486   void signal_cond_list(list<Cond*>& ls);
487
488   void wait_on_context_list(list<Context*>& ls);
489   void signal_context_list(list<Context*>& ls);
490
491   // -- metadata cache stuff
492
493   // decrease inode ref.  delete if dangling.
494   void put_inode(Inode *in, int n=1);
495   void close_dir(Dir *dir);
496
497   friend class C_Client_FlushComplete; // calls put_inode()
498   friend class C_Client_CacheInvalidate;  // calls ino_invalidate_cb
499   friend class C_Client_DentryInvalidate;  // calls dentry_invalidate_cb
500   friend class C_Block_Sync; // Calls block map and protected helpers
501   friend class C_Client_RequestInterrupt;
502   friend class C_Client_Remount;
503   friend void intrusive_ptr_release(Inode *in);
504
505   //int get_cache_size() { return lru.lru_get_size(); }
506
507   /**
508    * Don't call this with in==NULL, use get_or_create for that
509    * leave dn set to default NULL unless you're trying to add
510    * a new inode to a pre-created Dentry
511    */
512   Dentry* link(Dir *dir, const string& name, Inode *in, Dentry *dn);
513   void unlink(Dentry *dn, bool keepdir, bool keepdentry);
514
515   // path traversal for high-level interface
516   InodeRef cwd;
517   int path_walk(const filepath& fp, InodeRef *end, const UserPerm& perms,
518                 bool followsym=true, int mask=0);
519                 
520   int fill_stat(Inode *in, struct stat *st, frag_info_t *dirstat=0, nest_info_t *rstat=0);
521   int fill_stat(InodeRef& in, struct stat *st, frag_info_t *dirstat=0, nest_info_t *rstat=0) {
522     return fill_stat(in.get(), st, dirstat, rstat);
523   }
524
525   void fill_statx(Inode *in, unsigned int mask, struct ceph_statx *stx);
526   void fill_statx(InodeRef& in, unsigned int mask, struct ceph_statx *stx) {
527     return fill_statx(in.get(), mask, stx);
528   }
529
530   void touch_dn(Dentry *dn);
531
532   // trim cache.
533   void trim_cache(bool trim_kernel_dcache=false);
534   void trim_cache_for_reconnect(MetaSession *s);
535   void trim_dentry(Dentry *dn);
536   void trim_caps(MetaSession *s, int max);
537   void _invalidate_kernel_dcache();
538   
539   void dump_inode(Formatter *f, Inode *in, set<Inode*>& did, bool disconnected);
540   void dump_cache(Formatter *f);  // debug
541
542   // force read-only
543   void force_session_readonly(MetaSession *s);
544
545   void dump_status(Formatter *f);  // debug
546   
547   // trace generation
548   ofstream traceout;
549
550
551   Cond mount_cond, sync_cond;
552
553
554   // friends
555   friend class SyntheticClient;
556   bool ms_dispatch(Message *m) override;
557
558   void ms_handle_connect(Connection *con) override;
559   bool ms_handle_reset(Connection *con) override;
560   void ms_handle_remote_reset(Connection *con) override;
561   bool ms_handle_refused(Connection *con) override;
562   bool ms_get_authorizer(int dest_type, AuthAuthorizer **authorizer, bool force_new) override;
563
564   int authenticate();
565
566   Inode* get_quota_root(Inode *in, const UserPerm& perms);
567   bool check_quota_condition(Inode *in, const UserPerm& perms,
568                              std::function<bool (const Inode &)> test);
569   bool is_quota_files_exceeded(Inode *in, const UserPerm& perms);
570   bool is_quota_bytes_exceeded(Inode *in, int64_t new_bytes,
571                                const UserPerm& perms);
572   bool is_quota_bytes_approaching(Inode *in, const UserPerm& perms);
573
574   std::map<std::pair<int64_t,std::string>, int> pool_perms;
575   list<Cond*> waiting_for_pool_perm;
576   int check_pool_perm(Inode *in, int need);
577
578   /**
579    * Call this when an OSDMap is seen with a full flag (global or per pool)
580    * set.
581    *
582    * @param pool the pool ID affected, or -1 if all.
583    */
584   void _handle_full_flag(int64_t pool);
585
586   void _close_sessions();
587
588   /**
589    * The basic housekeeping parts of init (perf counters, admin socket)
590    * that is independent of how objecters/monclient/messengers are
591    * being set up.
592    */
593   void _finish_init();
594
595  public:
596   void set_filer_flags(int flags);
597   void clear_filer_flags(int flags);
598
599   Client(Messenger *m, MonClient *mc, Objecter *objecter_);
600   ~Client() override;
601   void tear_down_cache();
602
603   void update_metadata(std::string const &k, std::string const &v);
604
605   client_t get_nodeid() { return whoami; }
606
607   inodeno_t get_root_ino();
608   Inode *get_root();
609
610   virtual int init();
611   virtual void shutdown();
612
613   // messaging
614   void handle_mds_map(class MMDSMap *m);
615   void handle_fs_map(class MFSMap *m);
616   void handle_fs_map_user(class MFSMapUser *m);
617   void handle_osd_map(class MOSDMap *m);
618
619   void handle_lease(MClientLease *m);
620
621   // inline data
622   int uninline_data(Inode *in, Context *onfinish);
623
624   // file caps
625   void check_cap_issue(Inode *in, Cap *cap, unsigned issued);
626   void add_update_cap(Inode *in, MetaSession *session, uint64_t cap_id,
627                       unsigned issued, unsigned seq, unsigned mseq, inodeno_t realm,
628                       int flags, const UserPerm& perms);
629   void remove_cap(Cap *cap, bool queue_release);
630   void remove_all_caps(Inode *in);
631   void remove_session_caps(MetaSession *session);
632   void mark_caps_dirty(Inode *in, int caps);
633   int mark_caps_flushing(Inode *in, ceph_tid_t *ptid);
634   void adjust_session_flushing_caps(Inode *in, MetaSession *old_s, MetaSession *new_s);
635   void flush_caps_sync();
636   void flush_caps(Inode *in, MetaSession *session, bool sync=false);
637   void kick_flushing_caps(MetaSession *session);
638   void early_kick_flushing_caps(MetaSession *session);
639   void kick_maxsize_requests(MetaSession *session);
640   int get_caps(Inode *in, int need, int want, int *have, loff_t endoff);
641   int get_caps_used(Inode *in);
642
643   void maybe_update_snaprealm(SnapRealm *realm, snapid_t snap_created, snapid_t snap_highwater, 
644                               vector<snapid_t>& snaps);
645
646   void handle_quota(struct MClientQuota *m);
647   void handle_snap(struct MClientSnap *m);
648   void handle_caps(class MClientCaps *m);
649   void handle_cap_import(MetaSession *session, Inode *in, class MClientCaps *m);
650   void handle_cap_export(MetaSession *session, Inode *in, class MClientCaps *m);
651   void handle_cap_trunc(MetaSession *session, Inode *in, class MClientCaps *m);
652   void handle_cap_flush_ack(MetaSession *session, Inode *in, Cap *cap, class MClientCaps *m);
653   void handle_cap_flushsnap_ack(MetaSession *session, Inode *in, class MClientCaps *m);
654   void handle_cap_grant(MetaSession *session, Inode *in, Cap *cap, class MClientCaps *m);
655   void cap_delay_requeue(Inode *in);
656   void send_cap(Inode *in, MetaSession *session, Cap *cap, bool sync,
657                 int used, int want, int retain, int flush,
658                 ceph_tid_t flush_tid);
659
660   /* Flags for check_caps() */
661 #define CHECK_CAPS_NODELAY      (0x1)
662 #define CHECK_CAPS_SYNCHRONOUS  (0x2)
663
664   void check_caps(Inode *in, unsigned flags);
665   void get_cap_ref(Inode *in, int cap);
666   void put_cap_ref(Inode *in, int cap);
667   void flush_snaps(Inode *in, bool all_again=false);
668   void wait_sync_caps(Inode *in, ceph_tid_t want);
669   void wait_sync_caps(ceph_tid_t want);
670   void queue_cap_snap(Inode *in, SnapContext &old_snapc);
671   void finish_cap_snap(Inode *in, CapSnap &capsnap, int used);
672   void _flushed_cap_snap(Inode *in, snapid_t seq);
673
674   void _schedule_invalidate_dentry_callback(Dentry *dn, bool del);
675   void _async_dentry_invalidate(vinodeno_t dirino, vinodeno_t ino, string& name);
676   void _try_to_trim_inode(Inode *in, bool sched_inval);
677
678   void _schedule_invalidate_callback(Inode *in, int64_t off, int64_t len);
679   void _invalidate_inode_cache(Inode *in);
680   void _invalidate_inode_cache(Inode *in, int64_t off, int64_t len);
681   void _async_invalidate(vinodeno_t ino, int64_t off, int64_t len);
682   bool _release(Inode *in);
683   
684   /**
685    * Initiate a flush of the data associated with the given inode.
686    * If you specify a Context, you are responsible for holding an inode
687    * reference for the duration of the flush. If not, _flush() will
688    * take the reference for you.
689    * @param in The Inode whose data you wish to flush.
690    * @param c The Context you wish us to complete once the data is
691    * flushed. If already flushed, this will be called in-line.
692    * 
693    * @returns true if the data was already flushed, false otherwise.
694    */
695   bool _flush(Inode *in, Context *c);
696   void _flush_range(Inode *in, int64_t off, uint64_t size);
697   void _flushed(Inode *in);
698   void flush_set_callback(ObjectCacher::ObjectSet *oset);
699
700   void close_release(Inode *in);
701   void close_safe(Inode *in);
702
703   void lock_fh_pos(Fh *f);
704   void unlock_fh_pos(Fh *f);
705   
706   // metadata cache
707   void update_dir_dist(Inode *in, DirStat *st);
708
709   void clear_dir_complete_and_ordered(Inode *diri, bool complete);
710   void insert_readdir_results(MetaRequest *request, MetaSession *session, Inode *diri);
711   Inode* insert_trace(MetaRequest *request, MetaSession *session);
712   void update_inode_file_bits(Inode *in, uint64_t truncate_seq, uint64_t truncate_size, uint64_t size,
713                               uint64_t change_attr, uint64_t time_warp_seq, utime_t ctime,
714                               utime_t mtime, utime_t atime, version_t inline_version,
715                               bufferlist& inline_data, int issued);
716   Inode *add_update_inode(InodeStat *st, utime_t ttl, MetaSession *session,
717                           const UserPerm& request_perms);
718   Dentry *insert_dentry_inode(Dir *dir, const string& dname, LeaseStat *dlease, 
719                               Inode *in, utime_t from, MetaSession *session,
720                               Dentry *old_dentry = NULL);
721   void update_dentry_lease(Dentry *dn, LeaseStat *dlease, utime_t from, MetaSession *session);
722
723   bool use_faked_inos() { return _use_faked_inos; }
724   vinodeno_t map_faked_ino(ino_t ino);
725  
726   //notify the mds to flush the mdlog
727   void flush_mdlog_sync();
728   void flush_mdlog(MetaSession *session);
729   
730   // ----------------------
731   // fs ops.
732 private:
733
734   void fill_dirent(struct dirent *de, const char *name, int type, uint64_t ino, loff_t next_off);
735
736   // some readdir helpers
737   typedef int (*add_dirent_cb_t)(void *p, struct dirent *de, struct ceph_statx *stx, off_t off, Inode *in);
738
739   int _opendir(Inode *in, dir_result_t **dirpp, const UserPerm& perms);
740   void _readdir_drop_dirp_buffer(dir_result_t *dirp);
741   bool _readdir_have_frag(dir_result_t *dirp);
742   void _readdir_next_frag(dir_result_t *dirp);
743   void _readdir_rechoose_frag(dir_result_t *dirp);
744   int _readdir_get_frag(dir_result_t *dirp);
745   int _readdir_cache_cb(dir_result_t *dirp, add_dirent_cb_t cb, void *p, int caps, bool getref);
746   void _closedir(dir_result_t *dirp);
747
748   // other helpers
749   void _fragmap_remove_non_leaves(Inode *in);
750   void _fragmap_remove_stopped_mds(Inode *in, mds_rank_t mds);
751
752   void _ll_get(Inode *in);
753   int _ll_put(Inode *in, int num);
754   void _ll_drop_pins();
755
756   Fh *_create_fh(Inode *in, int flags, int cmode, const UserPerm& perms);
757   int _release_fh(Fh *fh);
758   void _put_fh(Fh *fh);
759
760
761   struct C_Readahead : public Context {
762     Client *client;
763     Fh *f;
764     C_Readahead(Client *c, Fh *f);
765     ~C_Readahead() override;
766     void finish(int r) override;
767   };
768
769   int _read_sync(Fh *f, uint64_t off, uint64_t len, bufferlist *bl, bool *checkeof);
770   int _read_async(Fh *f, uint64_t off, uint64_t len, bufferlist *bl);
771
772   // internal interface
773   //   call these with client_lock held!
774   int _do_lookup(Inode *dir, const string& name, int mask, InodeRef *target,
775                  const UserPerm& perms);
776
777   int _lookup(Inode *dir, const string& dname, int mask, InodeRef *target,
778               const UserPerm& perm);
779
780   int _link(Inode *in, Inode *dir, const char *name, const UserPerm& perm,
781             InodeRef *inp = 0);
782   int _unlink(Inode *dir, const char *name, const UserPerm& perm);
783   int _rename(Inode *olddir, const char *oname, Inode *ndir, const char *nname, const UserPerm& perm);
784   int _mkdir(Inode *dir, const char *name, mode_t mode, const UserPerm& perm,
785              InodeRef *inp = 0);
786   int _rmdir(Inode *dir, const char *name, const UserPerm& perms);
787   int _symlink(Inode *dir, const char *name, const char *target,
788                const UserPerm& perms, InodeRef *inp = 0);
789   int _mknod(Inode *dir, const char *name, mode_t mode, dev_t rdev,
790              const UserPerm& perms, InodeRef *inp = 0);
791   int _do_setattr(Inode *in, struct ceph_statx *stx, int mask,
792                   const UserPerm& perms, InodeRef *inp);
793   void stat_to_statx(struct stat *st, struct ceph_statx *stx);
794   int __setattrx(Inode *in, struct ceph_statx *stx, int mask,
795                  const UserPerm& perms, InodeRef *inp = 0);
796   int _setattrx(InodeRef &in, struct ceph_statx *stx, int mask,
797                 const UserPerm& perms);
798   int _setattr(InodeRef &in, struct stat *attr, int mask,
799                const UserPerm& perms);
800   int _ll_setattrx(Inode *in, struct ceph_statx *stx, int mask,
801                    const UserPerm& perms, InodeRef *inp = 0);
802   int _getattr(Inode *in, int mask, const UserPerm& perms, bool force=false);
803   int _getattr(InodeRef &in, int mask, const UserPerm& perms, bool force=false) {
804     return _getattr(in.get(), mask, perms, force);
805   }
806   int _readlink(Inode *in, char *buf, size_t size);
807   int _getxattr(Inode *in, const char *name, void *value, size_t len,
808                 const UserPerm& perms);
809   int _getxattr(InodeRef &in, const char *name, void *value, size_t len,
810                 const UserPerm& perms);
811   int _listxattr(Inode *in, char *names, size_t len, const UserPerm& perms);
812   int _do_setxattr(Inode *in, const char *name, const void *value, size_t len,
813                    int flags, const UserPerm& perms);
814   int _setxattr(Inode *in, const char *name, const void *value, size_t len,
815                 int flags, const UserPerm& perms);
816   int _setxattr(InodeRef &in, const char *name, const void *value, size_t len,
817                 int flags, const UserPerm& perms);
818   int _setxattr_check_data_pool(string& name, string& value, const OSDMap *osdmap);
819   void _setxattr_maybe_wait_for_osdmap(const char *name, const void *value, size_t len);
820   int _removexattr(Inode *in, const char *nm, const UserPerm& perms);
821   int _removexattr(InodeRef &in, const char *nm, const UserPerm& perms);
822   int _open(Inode *in, int flags, mode_t mode, Fh **fhp,
823             const UserPerm& perms);
824   int _renew_caps(Inode *in);
825   int _create(Inode *in, const char *name, int flags, mode_t mode, InodeRef *inp,
826               Fh **fhp, int stripe_unit, int stripe_count, int object_size,
827               const char *data_pool, bool *created, const UserPerm &perms);
828
829   loff_t _lseek(Fh *fh, loff_t offset, int whence);
830   int _read(Fh *fh, int64_t offset, uint64_t size, bufferlist *bl);
831   int _write(Fh *fh, int64_t offset, uint64_t size, const char *buf,
832           const struct iovec *iov, int iovcnt);
833   int _preadv_pwritev(int fd, const struct iovec *iov, unsigned iovcnt, int64_t offset, bool write);
834   int _flush(Fh *fh);
835   int _fsync(Fh *fh, bool syncdataonly);
836   int _fsync(Inode *in, bool syncdataonly);
837   int _sync_fs();
838   int _fallocate(Fh *fh, int mode, int64_t offset, int64_t length);
839   int _getlk(Fh *fh, struct flock *fl, uint64_t owner);
840   int _setlk(Fh *fh, struct flock *fl, uint64_t owner, int sleep);
841   int _flock(Fh *fh, int cmd, uint64_t owner);
842
843   int get_or_create(Inode *dir, const char* name,
844                     Dentry **pdn, bool expect_null=false);
845
846   enum {
847     NO_ACL = 0,
848     POSIX_ACL,
849   };
850
851   enum {
852     MAY_EXEC = 1,
853     MAY_WRITE = 2,
854     MAY_READ = 4,
855   };
856
857   void init_groups(UserPerm *groups);
858
859   int inode_permission(Inode *in, const UserPerm& perms, unsigned want);
860   int xattr_permission(Inode *in, const char *name, unsigned want,
861                        const UserPerm& perms);
862   int may_setattr(Inode *in, struct ceph_statx *stx, int mask,
863                   const UserPerm& perms);
864   int may_open(Inode *in, int flags, const UserPerm& perms);
865   int may_lookup(Inode *dir, const UserPerm& perms);
866   int may_create(Inode *dir, const UserPerm& perms);
867   int may_delete(Inode *dir, const char *name, const UserPerm& perms);
868   int may_hardlink(Inode *in, const UserPerm& perms);
869
870   int _getattr_for_perm(Inode *in, const UserPerm& perms);
871   int _getgrouplist(gid_t **sgids, uid_t uid, gid_t gid);
872
873   vinodeno_t _get_vino(Inode *in);
874   inodeno_t _get_inodeno(Inode *in);
875
876   /*
877    * These define virtual xattrs exposing the recursive directory
878    * statistics and layout metadata.
879    */
880   struct VXattr {
881           const string name;
882           size_t (Client::*getxattr_cb)(Inode *in, char *val, size_t size);
883           bool readonly, hidden;
884           bool (Client::*exists_cb)(Inode *in);
885   };
886
887   bool _vxattrcb_quota_exists(Inode *in);
888   size_t _vxattrcb_quota(Inode *in, char *val, size_t size);
889   size_t _vxattrcb_quota_max_bytes(Inode *in, char *val, size_t size);
890   size_t _vxattrcb_quota_max_files(Inode *in, char *val, size_t size);
891
892   bool _vxattrcb_layout_exists(Inode *in);
893   size_t _vxattrcb_layout(Inode *in, char *val, size_t size);
894   size_t _vxattrcb_layout_stripe_unit(Inode *in, char *val, size_t size);
895   size_t _vxattrcb_layout_stripe_count(Inode *in, char *val, size_t size);
896   size_t _vxattrcb_layout_object_size(Inode *in, char *val, size_t size);
897   size_t _vxattrcb_layout_pool(Inode *in, char *val, size_t size);
898   size_t _vxattrcb_layout_pool_namespace(Inode *in, char *val, size_t size);
899   size_t _vxattrcb_dir_entries(Inode *in, char *val, size_t size);
900   size_t _vxattrcb_dir_files(Inode *in, char *val, size_t size);
901   size_t _vxattrcb_dir_subdirs(Inode *in, char *val, size_t size);
902   size_t _vxattrcb_dir_rentries(Inode *in, char *val, size_t size);
903   size_t _vxattrcb_dir_rfiles(Inode *in, char *val, size_t size);
904   size_t _vxattrcb_dir_rsubdirs(Inode *in, char *val, size_t size);
905   size_t _vxattrcb_dir_rbytes(Inode *in, char *val, size_t size);
906   size_t _vxattrcb_dir_rctime(Inode *in, char *val, size_t size);
907   size_t _vxattrs_calcu_name_size(const VXattr *vxattrs);
908
909   static const VXattr _dir_vxattrs[];
910   static const VXattr _file_vxattrs[];
911
912   static const VXattr *_get_vxattrs(Inode *in);
913   static const VXattr *_match_vxattr(Inode *in, const char *name);
914
915   size_t _file_vxattrs_name_size;
916   size_t _dir_vxattrs_name_size;
917   size_t _vxattrs_name_size(const VXattr *vxattrs) {
918           if (vxattrs == _dir_vxattrs)
919                   return _dir_vxattrs_name_size;
920           else if (vxattrs == _file_vxattrs)
921                   return _file_vxattrs_name_size;
922           return 0;
923   }
924
925   int _do_filelock(Inode *in, Fh *fh, int lock_type, int op, int sleep,
926                    struct flock *fl, uint64_t owner, bool removing=false);
927   int _interrupt_filelock(MetaRequest *req);
928   void _encode_filelocks(Inode *in, bufferlist& bl);
929   void _release_filelocks(Fh *fh);
930   void _update_lock_state(struct flock *fl, uint64_t owner, ceph_lock_state_t *lock_state);
931
932   int _posix_acl_create(Inode *dir, mode_t *mode, bufferlist& xattrs_bl,
933                         const UserPerm& perms);
934   int _posix_acl_chmod(Inode *in, mode_t mode, const UserPerm& perms);
935   int _posix_acl_permission(Inode *in, const UserPerm& perms, unsigned want);
936
937   mds_rank_t _get_random_up_mds() const;
938
939   int _ll_getattr(Inode *in, int caps, const UserPerm& perms);
940
941 public:
942   int mount(const std::string &mount_root, const UserPerm& perms,
943             bool require_mds=false);
944   void unmount();
945
946   int mds_command(
947     const std::string &mds_spec,
948     const std::vector<std::string>& cmd,
949     const bufferlist& inbl,
950     bufferlist *poutbl, std::string *prs, Context *onfinish);
951
952   // these shoud (more or less) mirror the actual system calls.
953   int statfs(const char *path, struct statvfs *stbuf, const UserPerm& perms);
954
955   // crap
956   int chdir(const char *s, std::string &new_cwd, const UserPerm& perms);
957   void _getcwd(std::string& cwd, const UserPerm& perms);
958   void getcwd(std::string& cwd, const UserPerm& perms);
959
960   // namespace ops
961   int opendir(const char *name, dir_result_t **dirpp, const UserPerm& perms);
962   int closedir(dir_result_t *dirp);
963
964   /**
965    * Fill a directory listing from dirp, invoking cb for each entry
966    * with the given pointer, the dirent, the struct stat, the stmask,
967    * and the offset.
968    *
969    * Returns 0 if it reached the end of the directory.
970    * If @a cb returns a negative error code, stop and return that.
971    */
972   int readdir_r_cb(dir_result_t *dirp, add_dirent_cb_t cb, void *p,
973                    unsigned want=0, unsigned flags=AT_NO_ATTR_SYNC,
974                    bool getref=false);
975
976   struct dirent * readdir(dir_result_t *d);
977   int readdir_r(dir_result_t *dirp, struct dirent *de);
978   int readdirplus_r(dir_result_t *dirp, struct dirent *de, struct ceph_statx *stx, unsigned want, unsigned flags, Inode **out);
979
980   int getdir(const char *relpath, list<string>& names,
981              const UserPerm& perms);  // get the whole dir at once.
982
983   /**
984    * Returns the length of the buffer that got filled in, or -errno.
985    * If it returns -ERANGE you just need to increase the size of the
986    * buffer and try again.
987    */
988   int _getdents(dir_result_t *dirp, char *buf, int buflen, bool ful);  // get a bunch of dentries at once
989   int getdents(dir_result_t *dirp, char *buf, int buflen) {
990     return _getdents(dirp, buf, buflen, true);
991   }
992   int getdnames(dir_result_t *dirp, char *buf, int buflen) {
993     return _getdents(dirp, buf, buflen, false);
994   }
995
996   void rewinddir(dir_result_t *dirp);
997   loff_t telldir(dir_result_t *dirp);
998   void seekdir(dir_result_t *dirp, loff_t offset);
999
1000   int link(const char *existing, const char *newname, const UserPerm& perm);
1001   int unlink(const char *path, const UserPerm& perm);
1002   int rename(const char *from, const char *to, const UserPerm& perm);
1003
1004   // dirs
1005   int mkdir(const char *path, mode_t mode, const UserPerm& perm);
1006   int mkdirs(const char *path, mode_t mode, const UserPerm& perms);
1007   int rmdir(const char *path, const UserPerm& perms);
1008
1009   // symlinks
1010   int readlink(const char *path, char *buf, loff_t size, const UserPerm& perms);
1011
1012   int symlink(const char *existing, const char *newname, const UserPerm& perms);
1013
1014   // inode stuff
1015   unsigned statx_to_mask(unsigned int flags, unsigned int want);
1016   int stat(const char *path, struct stat *stbuf, const UserPerm& perms,
1017            frag_info_t *dirstat=0, int mask=CEPH_STAT_CAP_INODE_ALL);
1018   int statx(const char *path, struct ceph_statx *stx,
1019             const UserPerm& perms,
1020             unsigned int want, unsigned int flags);
1021   int lstat(const char *path, struct stat *stbuf, const UserPerm& perms,
1022             frag_info_t *dirstat=0, int mask=CEPH_STAT_CAP_INODE_ALL);
1023
1024   int setattr(const char *relpath, struct stat *attr, int mask,
1025               const UserPerm& perms);
1026   int setattrx(const char *relpath, struct ceph_statx *stx, int mask,
1027                const UserPerm& perms, int flags=0);
1028   int fsetattr(int fd, struct stat *attr, int mask, const UserPerm& perms);
1029   int fsetattrx(int fd, struct ceph_statx *stx, int mask, const UserPerm& perms);
1030   int chmod(const char *path, mode_t mode, const UserPerm& perms);
1031   int fchmod(int fd, mode_t mode, const UserPerm& perms);
1032   int lchmod(const char *path, mode_t mode, const UserPerm& perms);
1033   int chown(const char *path, uid_t new_uid, gid_t new_gid,
1034             const UserPerm& perms);
1035   int fchown(int fd, uid_t new_uid, gid_t new_gid, const UserPerm& perms);
1036   int lchown(const char *path, uid_t new_uid, gid_t new_gid,
1037              const UserPerm& perms);
1038   int utime(const char *path, struct utimbuf *buf, const UserPerm& perms);
1039   int lutime(const char *path, struct utimbuf *buf, const UserPerm& perms);
1040   int flock(int fd, int operation, uint64_t owner);
1041   int truncate(const char *path, loff_t size, const UserPerm& perms);
1042
1043   // file ops
1044   int mknod(const char *path, mode_t mode, const UserPerm& perms, dev_t rdev=0);
1045   int open(const char *path, int flags, const UserPerm& perms, mode_t mode=0);
1046   int open(const char *path, int flags, const UserPerm& perms,
1047            mode_t mode, int stripe_unit, int stripe_count, int object_size,
1048            const char *data_pool);
1049   int lookup_hash(inodeno_t ino, inodeno_t dirino, const char *name,
1050                   const UserPerm& perms);
1051   int lookup_ino(inodeno_t ino, const UserPerm& perms, Inode **inode=NULL);
1052   int lookup_parent(Inode *in, const UserPerm& perms, Inode **parent=NULL);
1053   int lookup_name(Inode *in, Inode *parent, const UserPerm& perms);
1054   int close(int fd);
1055   loff_t lseek(int fd, loff_t offset, int whence);
1056   int read(int fd, char *buf, loff_t size, loff_t offset=-1);
1057   int preadv(int fd, const struct iovec *iov, int iovcnt, loff_t offset=-1);
1058   int write(int fd, const char *buf, loff_t size, loff_t offset=-1);
1059   int pwritev(int fd, const struct iovec *iov, int iovcnt, loff_t offset=-1);
1060   int fake_write_size(int fd, loff_t size);
1061   int ftruncate(int fd, loff_t size, const UserPerm& perms);
1062   int fsync(int fd, bool syncdataonly);
1063   int fstat(int fd, struct stat *stbuf, const UserPerm& perms,
1064             int mask=CEPH_STAT_CAP_INODE_ALL);
1065   int fstatx(int fd, struct ceph_statx *stx, const UserPerm& perms,
1066              unsigned int want, unsigned int flags);
1067   int fallocate(int fd, int mode, loff_t offset, loff_t length);
1068
1069   // full path xattr ops
1070   int getxattr(const char *path, const char *name, void *value, size_t size,
1071                const UserPerm& perms);
1072   int lgetxattr(const char *path, const char *name, void *value, size_t size,
1073                 const UserPerm& perms);
1074   int fgetxattr(int fd, const char *name, void *value, size_t size,
1075                 const UserPerm& perms);
1076   int listxattr(const char *path, char *list, size_t size, const UserPerm& perms);
1077   int llistxattr(const char *path, char *list, size_t size, const UserPerm& perms);
1078   int flistxattr(int fd, char *list, size_t size, const UserPerm& perms);
1079   int removexattr(const char *path, const char *name, const UserPerm& perms);
1080   int lremovexattr(const char *path, const char *name, const UserPerm& perms);
1081   int fremovexattr(int fd, const char *name, const UserPerm& perms);
1082   int setxattr(const char *path, const char *name, const void *value,
1083                size_t size, int flags, const UserPerm& perms);
1084   int lsetxattr(const char *path, const char *name, const void *value,
1085                 size_t size, int flags, const UserPerm& perms);
1086   int fsetxattr(int fd, const char *name, const void *value, size_t size,
1087                 int flags, const UserPerm& perms);
1088
1089   int sync_fs();
1090   int64_t drop_caches();
1091
1092   // hpc lazyio
1093   int lazyio_propogate(int fd, loff_t offset, size_t count);
1094   int lazyio_synchronize(int fd, loff_t offset, size_t count);
1095
1096   // expose file layout
1097   int describe_layout(const char *path, file_layout_t* layout,
1098                       const UserPerm& perms);
1099   int fdescribe_layout(int fd, file_layout_t* layout);
1100   int get_file_stripe_address(int fd, loff_t offset, vector<entity_addr_t>& address);
1101   int get_file_extent_osds(int fd, loff_t off, loff_t *len, vector<int>& osds);
1102   int get_osd_addr(int osd, entity_addr_t& addr);
1103   
1104   // expose mdsmap
1105   int64_t get_default_pool_id();
1106
1107   // expose osdmap
1108   int get_local_osd();
1109   int get_pool_replication(int64_t pool);
1110   int64_t get_pool_id(const char *pool_name);
1111   string get_pool_name(int64_t pool);
1112   int get_osd_crush_location(int id, vector<pair<string, string> >& path);
1113
1114   int enumerate_layout(int fd, vector<ObjectExtent>& result,
1115                        loff_t length, loff_t offset);
1116
1117   int mksnap(const char *path, const char *name, const UserPerm& perm);
1118   int rmsnap(const char *path, const char *name, const UserPerm& perm);
1119
1120   // expose caps
1121   int get_caps_issued(int fd);
1122   int get_caps_issued(const char *path, const UserPerm& perms);
1123
1124   // low-level interface v2
1125   inodeno_t ll_get_inodeno(Inode *in) {
1126     Mutex::Locker lock(client_lock);
1127     return _get_inodeno(in);
1128   }
1129   snapid_t ll_get_snapid(Inode *in);
1130   vinodeno_t ll_get_vino(Inode *in) {
1131     Mutex::Locker lock(client_lock);
1132     return _get_vino(in);
1133   }
1134   // get inode from faked ino
1135   Inode *ll_get_inode(ino_t ino);
1136   Inode *ll_get_inode(vinodeno_t vino);
1137   int ll_lookup(Inode *parent, const char *name, struct stat *attr,
1138                 Inode **out, const UserPerm& perms);
1139   int ll_lookupx(Inode *parent, const char *name, Inode **out,
1140                         struct ceph_statx *stx, unsigned want, unsigned flags,
1141                         const UserPerm& perms);
1142   bool ll_forget(Inode *in, int count);
1143   bool ll_put(Inode *in);
1144   int ll_getattr(Inode *in, struct stat *st, const UserPerm& perms);
1145   int ll_getattrx(Inode *in, struct ceph_statx *stx, unsigned int want,
1146                   unsigned int flags, const UserPerm& perms);
1147   int ll_setattrx(Inode *in, struct ceph_statx *stx, int mask,
1148                   const UserPerm& perms);
1149   int ll_setattr(Inode *in, struct stat *st, int mask,
1150                  const UserPerm& perms);
1151   int ll_getxattr(Inode *in, const char *name, void *value, size_t size,
1152                   const UserPerm& perms);
1153   int ll_setxattr(Inode *in, const char *name, const void *value, size_t size,
1154                   int flags, const UserPerm& perms);
1155   int ll_removexattr(Inode *in, const char *name, const UserPerm& perms);
1156   int ll_listxattr(Inode *in, char *list, size_t size, const UserPerm& perms);
1157   int ll_opendir(Inode *in, int flags, dir_result_t **dirpp,
1158                  const UserPerm& perms);
1159   int ll_releasedir(dir_result_t* dirp);
1160   int ll_fsyncdir(dir_result_t* dirp);
1161   int ll_readlink(Inode *in, char *buf, size_t bufsize, const UserPerm& perms);
1162   int ll_mknod(Inode *in, const char *name, mode_t mode, dev_t rdev,
1163                struct stat *attr, Inode **out, const UserPerm& perms);
1164   int ll_mknodx(Inode *parent, const char *name, mode_t mode, dev_t rdev,
1165                 Inode **out, struct ceph_statx *stx, unsigned want,
1166                 unsigned flags, const UserPerm& perms);
1167   int ll_mkdir(Inode *in, const char *name, mode_t mode, struct stat *attr,
1168                Inode **out, const UserPerm& perm);
1169   int ll_mkdirx(Inode *parent, const char *name, mode_t mode, Inode **out,
1170                 struct ceph_statx *stx, unsigned want, unsigned flags,
1171                 const UserPerm& perms);
1172   int ll_symlink(Inode *in, const char *name, const char *value,
1173                  struct stat *attr, Inode **out, const UserPerm& perms);
1174   int ll_symlinkx(Inode *parent, const char *name, const char *value,
1175                   Inode **out, struct ceph_statx *stx, unsigned want,
1176                   unsigned flags, const UserPerm& perms);
1177   int ll_unlink(Inode *in, const char *name, const UserPerm& perm);
1178   int ll_rmdir(Inode *in, const char *name, const UserPerm& perms);
1179   int ll_rename(Inode *parent, const char *name, Inode *newparent,
1180                 const char *newname, const UserPerm& perm);
1181   int ll_link(Inode *in, Inode *newparent, const char *newname,
1182               const UserPerm& perm);
1183   int ll_open(Inode *in, int flags, Fh **fh, const UserPerm& perms);
1184   int _ll_create(Inode *parent, const char *name, mode_t mode,
1185               int flags, InodeRef *in, int caps, Fh **fhp,
1186               const UserPerm& perms);
1187   int ll_create(Inode *parent, const char *name, mode_t mode, int flags,
1188                 struct stat *attr, Inode **out, Fh **fhp,
1189                 const UserPerm& perms);
1190   int ll_createx(Inode *parent, const char *name, mode_t mode,
1191                 int oflags, Inode **outp, Fh **fhp,
1192                 struct ceph_statx *stx, unsigned want, unsigned lflags,
1193                 const UserPerm& perms);
1194   int ll_read_block(Inode *in, uint64_t blockid, char *buf,  uint64_t offset,
1195                     uint64_t length, file_layout_t* layout);
1196
1197   int ll_write_block(Inode *in, uint64_t blockid,
1198                      char* buf, uint64_t offset,
1199                      uint64_t length, file_layout_t* layout,
1200                      uint64_t snapseq, uint32_t sync);
1201   int ll_commit_blocks(Inode *in, uint64_t offset, uint64_t length);
1202
1203   int ll_statfs(Inode *in, struct statvfs *stbuf, const UserPerm& perms);
1204   int ll_walk(const char* name, Inode **i, struct ceph_statx *stx,
1205                unsigned int want, unsigned int flags, const UserPerm& perms);
1206   uint32_t ll_stripe_unit(Inode *in);
1207   int ll_file_layout(Inode *in, file_layout_t *layout);
1208   uint64_t ll_snap_seq(Inode *in);
1209
1210   int ll_read(Fh *fh, loff_t off, loff_t len, bufferlist *bl);
1211   int ll_write(Fh *fh, loff_t off, loff_t len, const char *data);
1212   loff_t ll_lseek(Fh *fh, loff_t offset, int whence);
1213   int ll_flush(Fh *fh);
1214   int ll_fsync(Fh *fh, bool syncdataonly);
1215   int ll_fallocate(Fh *fh, int mode, loff_t offset, loff_t length);
1216   int ll_release(Fh *fh);
1217   int ll_getlk(Fh *fh, struct flock *fl, uint64_t owner);
1218   int ll_setlk(Fh *fh, struct flock *fl, uint64_t owner, int sleep);
1219   int ll_flock(Fh *fh, int cmd, uint64_t owner);
1220   int ll_file_layout(Fh *fh, file_layout_t *layout);
1221   void ll_interrupt(void *d);
1222   bool ll_handle_umask() {
1223     return acl_type != NO_ACL;
1224   }
1225
1226   int ll_get_stripe_osd(struct Inode *in, uint64_t blockno,
1227                         file_layout_t* layout);
1228   uint64_t ll_get_internal_offset(struct Inode *in, uint64_t blockno);
1229
1230   int ll_num_osds(void);
1231   int ll_osdaddr(int osd, uint32_t *addr);
1232   int ll_osdaddr(int osd, char* buf, size_t size);
1233
1234   void ll_register_callbacks(struct client_callback_args *args);
1235   int test_dentry_handling(bool can_invalidate);
1236
1237   const char** get_tracked_conf_keys() const override;
1238   void handle_conf_change(const struct md_config_t *conf,
1239                                   const std::set <std::string> &changed) override;
1240 };
1241
1242 /**
1243  * Specialization of Client that manages its own Objecter instance
1244  * and handles init/shutdown of messenger/monclient
1245  */
1246 class StandaloneClient : public Client
1247 {
1248   public:
1249   StandaloneClient(Messenger *m, MonClient *mc);
1250
1251   ~StandaloneClient() override;
1252
1253   int init() override;
1254   void shutdown() override;
1255 };
1256
1257 #endif