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