1
2#ifndef _FS_CEPH_SUPER_H
3#define _FS_CEPH_SUPER_H
4
5#include <linux/ceph/ceph_debug.h>
6
7#include <asm/unaligned.h>
8#include <linux/backing-dev.h>
9#include <linux/completion.h>
10#include <linux/exportfs.h>
11#include <linux/fs.h>
12#include <linux/mempool.h>
13#include <linux/pagemap.h>
14#include <linux/wait.h>
15#include <linux/writeback.h>
16#include <linux/slab.h>
17#include <linux/posix_acl.h>
18#include <linux/refcount.h>
19
20#include <linux/ceph/libceph.h>
21
22#ifdef CONFIG_CEPH_FSCACHE
23#include <linux/fscache.h>
24#endif
25
26
27#define CEPH_SUPER_MAGIC 0x00c36400
28
29
30
31#define CEPH_BLOCK_SHIFT 22
32#define CEPH_BLOCK (1 << CEPH_BLOCK_SHIFT)
33
34#define CEPH_MOUNT_OPT_DIRSTAT (1<<4)
35#define CEPH_MOUNT_OPT_RBYTES (1<<5)
36#define CEPH_MOUNT_OPT_NOASYNCREADDIR (1<<7)
37#define CEPH_MOUNT_OPT_INO32 (1<<8)
38#define CEPH_MOUNT_OPT_DCACHE (1<<9)
39#define CEPH_MOUNT_OPT_FSCACHE (1<<10)
40#define CEPH_MOUNT_OPT_NOPOOLPERM (1<<11)
41#define CEPH_MOUNT_OPT_MOUNTWAIT (1<<12)
42#define CEPH_MOUNT_OPT_NOQUOTADF (1<<13)
43#define CEPH_MOUNT_OPT_NOCOPYFROM (1<<14)
44
45#define CEPH_MOUNT_OPT_DEFAULT \
46 (CEPH_MOUNT_OPT_DCACHE | \
47 CEPH_MOUNT_OPT_NOCOPYFROM)
48
49#define ceph_set_mount_opt(fsc, opt) \
50 (fsc)->mount_options->flags |= CEPH_MOUNT_OPT_##opt;
51#define ceph_test_mount_opt(fsc, opt) \
52 (!!((fsc)->mount_options->flags & CEPH_MOUNT_OPT_##opt))
53
54
55#define CEPH_MAX_READ_SIZE CEPH_MSG_MAX_DATA_LEN
56
57
58#define CEPH_MAX_WRITE_SIZE CEPH_MSG_MAX_DATA_LEN
59#define CEPH_RASIZE_DEFAULT (8192*1024)
60#define CEPH_MAX_READDIR_DEFAULT 1024
61#define CEPH_MAX_READDIR_BYTES_DEFAULT (512*1024)
62#define CEPH_SNAPDIRNAME_DEFAULT ".snap"
63
64
65
66
67
68
69
70#define CEPH_CAPS_WANTED_DELAY_MIN_DEFAULT 5
71#define CEPH_CAPS_WANTED_DELAY_MAX_DEFAULT 60
72
73struct ceph_mount_options {
74 int flags;
75 int sb_flags;
76
77 int wsize;
78 int rsize;
79 int rasize;
80 int congestion_kb;
81 int caps_wanted_delay_min, caps_wanted_delay_max;
82 int caps_max;
83 int max_readdir;
84 int max_readdir_bytes;
85
86
87
88
89
90
91 char *snapdir_name;
92 char *mds_namespace;
93 char *server_path;
94 char *fscache_uniq;
95};
96
97struct ceph_fs_client {
98 struct super_block *sb;
99
100 struct ceph_mount_options *mount_options;
101 struct ceph_client *client;
102
103 unsigned long mount_state;
104 loff_t max_file_size;
105
106 struct ceph_mds_client *mdsc;
107
108
109 mempool_t *wb_pagevec_pool;
110 atomic_long_t writeback_count;
111
112 struct workqueue_struct *inode_wq;
113 struct workqueue_struct *cap_wq;
114
115#ifdef CONFIG_DEBUG_FS
116 struct dentry *debugfs_dentry_lru, *debugfs_caps;
117 struct dentry *debugfs_congestion_kb;
118 struct dentry *debugfs_bdi;
119 struct dentry *debugfs_mdsc, *debugfs_mdsmap;
120 struct dentry *debugfs_mds_sessions;
121#endif
122
123#ifdef CONFIG_CEPH_FSCACHE
124 struct fscache_cookie *fscache;
125#endif
126};
127
128
129
130
131
132
133
134
135
136
137
138
139struct ceph_cap {
140 struct ceph_inode_info *ci;
141 struct rb_node ci_node;
142 struct ceph_mds_session *session;
143 struct list_head session_caps;
144 u64 cap_id;
145 union {
146
147 struct {
148 int issued;
149 int implemented;
150
151 int mds, mds_wanted;
152 };
153
154 struct {
155 u64 cap_ino;
156 int queue_release;
157 };
158 };
159 u32 seq, issue_seq, mseq;
160 u32 cap_gen;
161 unsigned long last_used;
162 struct list_head caps_item;
163};
164
165#define CHECK_CAPS_NODELAY 1
166#define CHECK_CAPS_AUTHONLY 2
167#define CHECK_CAPS_FLUSH 4
168
169struct ceph_cap_flush {
170 u64 tid;
171 int caps;
172 bool wake;
173 struct list_head g_list;
174 struct list_head i_list;
175};
176
177
178
179
180
181
182struct ceph_cap_snap {
183 refcount_t nref;
184 struct list_head ci_item;
185
186 struct ceph_cap_flush cap_flush;
187
188 u64 follows;
189 int issued, dirty;
190 struct ceph_snap_context *context;
191
192 umode_t mode;
193 kuid_t uid;
194 kgid_t gid;
195
196 struct ceph_buffer *xattr_blob;
197 u64 xattr_version;
198
199 u64 size;
200 u64 change_attr;
201 struct timespec64 mtime, atime, ctime, btime;
202 u64 time_warp_seq;
203 u64 truncate_size;
204 u32 truncate_seq;
205 int writing;
206 int dirty_pages;
207 bool inline_data;
208 bool need_flush;
209};
210
211static inline void ceph_put_cap_snap(struct ceph_cap_snap *capsnap)
212{
213 if (refcount_dec_and_test(&capsnap->nref)) {
214 if (capsnap->xattr_blob)
215 ceph_buffer_put(capsnap->xattr_blob);
216 kfree(capsnap);
217 }
218}
219
220
221
222
223
224
225
226
227
228#define CEPH_MAX_DIRFRAG_REP 4
229
230struct ceph_inode_frag {
231 struct rb_node node;
232
233
234 u32 frag;
235 int split_by;
236
237
238 int mds;
239 int ndist;
240 int dist[CEPH_MAX_DIRFRAG_REP];
241};
242
243
244
245
246
247struct ceph_inode_xattr {
248 struct rb_node node;
249
250 const char *name;
251 int name_len;
252 const char *val;
253 int val_len;
254 int dirty;
255
256 int should_free_name;
257 int should_free_val;
258};
259
260
261
262
263struct ceph_dentry_info {
264 struct dentry *dentry;
265 struct ceph_mds_session *lease_session;
266 struct list_head lease_list;
267 unsigned flags;
268 int lease_shared_gen;
269 u32 lease_gen;
270 u32 lease_seq;
271 unsigned long lease_renew_after, lease_renew_from;
272 unsigned long time;
273 u64 offset;
274};
275
276#define CEPH_DENTRY_REFERENCED 1
277#define CEPH_DENTRY_LEASE_LIST 2
278#define CEPH_DENTRY_SHRINK_LIST 4
279
280struct ceph_inode_xattrs_info {
281
282
283
284
285
286
287
288 struct ceph_buffer *blob, *prealloc_blob;
289
290 struct rb_root index;
291 bool dirty;
292 int count;
293 int names_size;
294 int vals_size;
295 u64 version, index_version;
296};
297
298
299
300
301struct ceph_inode_info {
302 struct ceph_vino i_vino;
303
304 spinlock_t i_ceph_lock;
305
306 u64 i_version;
307 u64 i_inline_version;
308 u32 i_time_warp_seq;
309
310 unsigned i_ceph_flags;
311 atomic64_t i_release_count;
312 atomic64_t i_ordered_count;
313 atomic64_t i_complete_seq[2];
314
315 struct ceph_dir_layout i_dir_layout;
316 struct ceph_file_layout i_layout;
317 char *i_symlink;
318
319
320 struct timespec64 i_rctime;
321 u64 i_rbytes, i_rfiles, i_rsubdirs;
322 u64 i_files, i_subdirs;
323
324
325 u64 i_max_bytes, i_max_files;
326
327 s32 i_dir_pin;
328
329 struct rb_root i_fragtree;
330 int i_fragtree_nsplits;
331 struct mutex i_fragtree_mutex;
332
333 struct ceph_inode_xattrs_info i_xattrs;
334
335
336
337 struct rb_root i_caps;
338 struct ceph_cap *i_auth_cap;
339 unsigned i_dirty_caps, i_flushing_caps;
340 struct list_head i_dirty_item, i_flushing_item;
341
342
343
344 struct ceph_cap_flush *i_prealloc_cap_flush;
345 struct list_head i_cap_flush_list;
346 wait_queue_head_t i_cap_wq;
347 unsigned long i_hold_caps_min;
348 unsigned long i_hold_caps_max;
349 struct list_head i_cap_delay_list;
350 struct ceph_cap_reservation i_cap_migration_resv;
351 struct list_head i_cap_snaps;
352 struct ceph_snap_context *i_head_snapc;
353
354 unsigned i_snap_caps;
355
356 int i_nr_by_mode[CEPH_FILE_MODE_BITS];
357
358 struct mutex i_truncate_mutex;
359 u32 i_truncate_seq;
360 u64 i_truncate_size;
361 int i_truncate_pending;
362
363 u64 i_max_size;
364 u64 i_reported_size;
365 u64 i_wanted_max_size;
366 u64 i_requested_max_size;
367
368
369 int i_pin_ref;
370 int i_rd_ref, i_rdcache_ref, i_wr_ref, i_wb_ref;
371 int i_wrbuffer_ref, i_wrbuffer_ref_head;
372 atomic_t i_filelock_ref;
373 atomic_t i_shared_gen;
374 u32 i_rdcache_gen;
375 u32 i_rdcache_revoking;
376
377 struct list_head i_unsafe_dirops;
378 struct list_head i_unsafe_iops;
379 spinlock_t i_unsafe_lock;
380
381 union {
382 struct ceph_snap_realm *i_snap_realm;
383 struct ceph_snapid_map *i_snapid_map;
384 };
385 int i_snap_realm_counter;
386 struct list_head i_snap_realm_item;
387 struct list_head i_snap_flush_item;
388 struct timespec64 i_btime;
389 struct timespec64 i_snap_btime;
390
391 struct work_struct i_work;
392 unsigned long i_work_mask;
393
394#ifdef CONFIG_CEPH_FSCACHE
395 struct fscache_cookie *fscache;
396 u32 i_fscache_gen;
397#endif
398 struct inode vfs_inode;
399};
400
401static inline struct ceph_inode_info *ceph_inode(struct inode *inode)
402{
403 return container_of(inode, struct ceph_inode_info, vfs_inode);
404}
405
406static inline struct ceph_fs_client *ceph_inode_to_client(struct inode *inode)
407{
408 return (struct ceph_fs_client *)inode->i_sb->s_fs_info;
409}
410
411static inline struct ceph_fs_client *ceph_sb_to_client(struct super_block *sb)
412{
413 return (struct ceph_fs_client *)sb->s_fs_info;
414}
415
416static inline struct ceph_vino ceph_vino(struct inode *inode)
417{
418 return ceph_inode(inode)->i_vino;
419}
420
421
422
423
424
425
426
427
428
429static inline u32 ceph_ino_to_ino32(__u64 vino)
430{
431 u32 ino = vino & 0xffffffff;
432 ino ^= vino >> 32;
433 if (!ino)
434 ino = 2;
435 return ino;
436}
437
438
439
440
441static inline ino_t ceph_vino_to_ino(struct ceph_vino vino)
442{
443#if BITS_PER_LONG == 32
444 return ceph_ino_to_ino32(vino.ino);
445#else
446 return (ino_t)vino.ino;
447#endif
448}
449
450
451
452
453#if BITS_PER_LONG == 32
454static inline ino_t ceph_translate_ino(struct super_block *sb, ino_t ino)
455{
456 return ino;
457}
458#else
459static inline ino_t ceph_translate_ino(struct super_block *sb, ino_t ino)
460{
461 if (ceph_test_mount_opt(ceph_sb_to_client(sb), INO32))
462 ino = ceph_ino_to_ino32(ino);
463 return ino;
464}
465#endif
466
467
468
469#define ceph_vinop(i) ceph_inode(i)->i_vino.ino, ceph_inode(i)->i_vino.snap
470
471static inline u64 ceph_ino(struct inode *inode)
472{
473 return ceph_inode(inode)->i_vino.ino;
474}
475static inline u64 ceph_snap(struct inode *inode)
476{
477 return ceph_inode(inode)->i_vino.snap;
478}
479
480static inline int ceph_ino_compare(struct inode *inode, void *data)
481{
482 struct ceph_vino *pvino = (struct ceph_vino *)data;
483 struct ceph_inode_info *ci = ceph_inode(inode);
484 return ci->i_vino.ino == pvino->ino &&
485 ci->i_vino.snap == pvino->snap;
486}
487
488static inline struct inode *ceph_find_inode(struct super_block *sb,
489 struct ceph_vino vino)
490{
491 ino_t t = ceph_vino_to_ino(vino);
492 return ilookup5(sb, t, ceph_ino_compare, &vino);
493}
494
495
496
497
498
499#define CEPH_I_DIR_ORDERED (1 << 0)
500#define CEPH_I_NODELAY (1 << 1)
501#define CEPH_I_FLUSH (1 << 2)
502#define CEPH_I_NOFLUSH (1 << 3)
503#define CEPH_I_POOL_PERM (1 << 4)
504#define CEPH_I_POOL_RD (1 << 5)
505#define CEPH_I_POOL_WR (1 << 6)
506#define CEPH_I_SEC_INITED (1 << 7)
507#define CEPH_I_CAP_DROPPED (1 << 8)
508#define CEPH_I_KICK_FLUSH (1 << 9)
509#define CEPH_I_FLUSH_SNAPS (1 << 10)
510#define CEPH_I_ERROR_WRITE (1 << 11)
511#define CEPH_I_ERROR_FILELOCK (1 << 12)
512
513
514
515
516
517#define CEPH_I_WORK_WRITEBACK 0
518#define CEPH_I_WORK_INVALIDATE_PAGES 1
519#define CEPH_I_WORK_VMTRUNCATE 2
520
521
522
523
524
525
526
527
528static inline void ceph_set_error_write(struct ceph_inode_info *ci)
529{
530 if (!(READ_ONCE(ci->i_ceph_flags) & CEPH_I_ERROR_WRITE)) {
531 spin_lock(&ci->i_ceph_lock);
532 ci->i_ceph_flags |= CEPH_I_ERROR_WRITE;
533 spin_unlock(&ci->i_ceph_lock);
534 }
535}
536
537static inline void ceph_clear_error_write(struct ceph_inode_info *ci)
538{
539 if (READ_ONCE(ci->i_ceph_flags) & CEPH_I_ERROR_WRITE) {
540 spin_lock(&ci->i_ceph_lock);
541 ci->i_ceph_flags &= ~CEPH_I_ERROR_WRITE;
542 spin_unlock(&ci->i_ceph_lock);
543 }
544}
545
546static inline void __ceph_dir_set_complete(struct ceph_inode_info *ci,
547 long long release_count,
548 long long ordered_count)
549{
550
551
552
553
554
555 smp_mb();
556 atomic64_set(&ci->i_complete_seq[0], release_count);
557 atomic64_set(&ci->i_complete_seq[1], ordered_count);
558}
559
560static inline void __ceph_dir_clear_complete(struct ceph_inode_info *ci)
561{
562 atomic64_inc(&ci->i_release_count);
563}
564
565static inline void __ceph_dir_clear_ordered(struct ceph_inode_info *ci)
566{
567 atomic64_inc(&ci->i_ordered_count);
568}
569
570static inline bool __ceph_dir_is_complete(struct ceph_inode_info *ci)
571{
572 return atomic64_read(&ci->i_complete_seq[0]) ==
573 atomic64_read(&ci->i_release_count);
574}
575
576static inline bool __ceph_dir_is_complete_ordered(struct ceph_inode_info *ci)
577{
578 return atomic64_read(&ci->i_complete_seq[0]) ==
579 atomic64_read(&ci->i_release_count) &&
580 atomic64_read(&ci->i_complete_seq[1]) ==
581 atomic64_read(&ci->i_ordered_count);
582}
583
584static inline void ceph_dir_clear_complete(struct inode *inode)
585{
586 __ceph_dir_clear_complete(ceph_inode(inode));
587}
588
589static inline void ceph_dir_clear_ordered(struct inode *inode)
590{
591 __ceph_dir_clear_ordered(ceph_inode(inode));
592}
593
594static inline bool ceph_dir_is_complete_ordered(struct inode *inode)
595{
596 bool ret = __ceph_dir_is_complete_ordered(ceph_inode(inode));
597 smp_rmb();
598 return ret;
599}
600
601
602extern struct ceph_inode_frag *__ceph_find_frag(struct ceph_inode_info *ci,
603 u32 f);
604
605
606
607
608
609extern u32 ceph_choose_frag(struct ceph_inode_info *ci, u32 v,
610 struct ceph_inode_frag *pfrag,
611 int *found);
612
613static inline struct ceph_dentry_info *ceph_dentry(const struct dentry *dentry)
614{
615 return (struct ceph_dentry_info *)dentry->d_fsdata;
616}
617
618
619
620
621static inline bool __ceph_is_any_real_caps(struct ceph_inode_info *ci)
622{
623 return !RB_EMPTY_ROOT(&ci->i_caps);
624}
625
626extern int __ceph_caps_issued(struct ceph_inode_info *ci, int *implemented);
627extern int __ceph_caps_issued_mask(struct ceph_inode_info *ci, int mask, int t);
628extern int __ceph_caps_issued_other(struct ceph_inode_info *ci,
629 struct ceph_cap *cap);
630
631static inline int ceph_caps_issued(struct ceph_inode_info *ci)
632{
633 int issued;
634 spin_lock(&ci->i_ceph_lock);
635 issued = __ceph_caps_issued(ci, NULL);
636 spin_unlock(&ci->i_ceph_lock);
637 return issued;
638}
639
640static inline int ceph_caps_issued_mask(struct ceph_inode_info *ci, int mask,
641 int touch)
642{
643 int r;
644 spin_lock(&ci->i_ceph_lock);
645 r = __ceph_caps_issued_mask(ci, mask, touch);
646 spin_unlock(&ci->i_ceph_lock);
647 return r;
648}
649
650static inline int __ceph_caps_dirty(struct ceph_inode_info *ci)
651{
652 return ci->i_dirty_caps | ci->i_flushing_caps;
653}
654extern struct ceph_cap_flush *ceph_alloc_cap_flush(void);
655extern void ceph_free_cap_flush(struct ceph_cap_flush *cf);
656extern int __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask,
657 struct ceph_cap_flush **pcf);
658
659extern int __ceph_caps_revoking_other(struct ceph_inode_info *ci,
660 struct ceph_cap *ocap, int mask);
661extern int ceph_caps_revoking(struct ceph_inode_info *ci, int mask);
662extern int __ceph_caps_used(struct ceph_inode_info *ci);
663
664extern int __ceph_caps_file_wanted(struct ceph_inode_info *ci);
665
666
667
668
669static inline int __ceph_caps_wanted(struct ceph_inode_info *ci)
670{
671 int w = __ceph_caps_file_wanted(ci) | __ceph_caps_used(ci);
672 if (w & CEPH_CAP_FILE_BUFFER)
673 w |= CEPH_CAP_FILE_EXCL;
674 return w;
675}
676
677
678extern int __ceph_caps_mds_wanted(struct ceph_inode_info *ci, bool check);
679
680extern void ceph_caps_init(struct ceph_mds_client *mdsc);
681extern void ceph_caps_finalize(struct ceph_mds_client *mdsc);
682extern void ceph_adjust_caps_max_min(struct ceph_mds_client *mdsc,
683 struct ceph_mount_options *fsopt);
684extern int ceph_reserve_caps(struct ceph_mds_client *mdsc,
685 struct ceph_cap_reservation *ctx, int need);
686extern void ceph_unreserve_caps(struct ceph_mds_client *mdsc,
687 struct ceph_cap_reservation *ctx);
688extern void ceph_reservation_status(struct ceph_fs_client *client,
689 int *total, int *avail, int *used,
690 int *reserved, int *min);
691
692
693
694
695
696
697#define CEPH_F_SYNC 1
698#define CEPH_F_ATEND 2
699
700struct ceph_file_info {
701 short fmode;
702 short flags;
703
704 spinlock_t rw_contexts_lock;
705 struct list_head rw_contexts;
706};
707
708struct ceph_dir_file_info {
709 struct ceph_file_info file_info;
710
711
712 u32 frag;
713 struct ceph_mds_request *last_readdir;
714
715
716 unsigned next_offset;
717 char *last_name;
718 long long dir_release_count;
719 long long dir_ordered_count;
720 int readdir_cache_idx;
721
722
723 char *dir_info;
724 int dir_info_len;
725};
726
727struct ceph_rw_context {
728 struct list_head list;
729 struct task_struct *thread;
730 int caps;
731};
732
733#define CEPH_DEFINE_RW_CONTEXT(_name, _caps) \
734 struct ceph_rw_context _name = { \
735 .thread = current, \
736 .caps = _caps, \
737 }
738
739static inline void ceph_add_rw_context(struct ceph_file_info *cf,
740 struct ceph_rw_context *ctx)
741{
742 spin_lock(&cf->rw_contexts_lock);
743 list_add(&ctx->list, &cf->rw_contexts);
744 spin_unlock(&cf->rw_contexts_lock);
745}
746
747static inline void ceph_del_rw_context(struct ceph_file_info *cf,
748 struct ceph_rw_context *ctx)
749{
750 spin_lock(&cf->rw_contexts_lock);
751 list_del(&ctx->list);
752 spin_unlock(&cf->rw_contexts_lock);
753}
754
755static inline struct ceph_rw_context*
756ceph_find_rw_context(struct ceph_file_info *cf)
757{
758 struct ceph_rw_context *ctx, *found = NULL;
759 spin_lock(&cf->rw_contexts_lock);
760 list_for_each_entry(ctx, &cf->rw_contexts, list) {
761 if (ctx->thread == current) {
762 found = ctx;
763 break;
764 }
765 }
766 spin_unlock(&cf->rw_contexts_lock);
767 return found;
768}
769
770struct ceph_readdir_cache_control {
771 struct page *page;
772 struct dentry **dentries;
773 int index;
774};
775
776
777
778
779
780
781
782
783
784
785struct ceph_snap_realm {
786 u64 ino;
787 struct inode *inode;
788 atomic_t nref;
789 struct rb_node node;
790
791 u64 created, seq;
792 u64 parent_ino;
793 u64 parent_since;
794
795 u64 *prior_parent_snaps;
796 u32 num_prior_parent_snaps;
797 u64 *snaps;
798 u32 num_snaps;
799
800 struct ceph_snap_realm *parent;
801 struct list_head children;
802 struct list_head child_item;
803
804 struct list_head empty_item;
805
806 struct list_head dirty_item;
807
808
809 struct ceph_snap_context *cached_context;
810
811 struct list_head inodes_with_caps;
812 spinlock_t inodes_with_caps_lock;
813};
814
815static inline int default_congestion_kb(void)
816{
817 int congestion_kb;
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837 congestion_kb = (16*int_sqrt(totalram_pages())) << (PAGE_SHIFT-10);
838 if (congestion_kb > 256*1024)
839 congestion_kb = 256*1024;
840
841 return congestion_kb;
842}
843
844
845
846
847struct ceph_snap_realm *ceph_lookup_snap_realm(struct ceph_mds_client *mdsc,
848 u64 ino);
849extern void ceph_get_snap_realm(struct ceph_mds_client *mdsc,
850 struct ceph_snap_realm *realm);
851extern void ceph_put_snap_realm(struct ceph_mds_client *mdsc,
852 struct ceph_snap_realm *realm);
853extern int ceph_update_snap_trace(struct ceph_mds_client *m,
854 void *p, void *e, bool deletion,
855 struct ceph_snap_realm **realm_ret);
856extern void ceph_handle_snap(struct ceph_mds_client *mdsc,
857 struct ceph_mds_session *session,
858 struct ceph_msg *msg);
859extern void ceph_queue_cap_snap(struct ceph_inode_info *ci);
860extern int __ceph_finish_cap_snap(struct ceph_inode_info *ci,
861 struct ceph_cap_snap *capsnap);
862extern void ceph_cleanup_empty_realms(struct ceph_mds_client *mdsc);
863
864extern struct ceph_snapid_map *ceph_get_snapid_map(struct ceph_mds_client *mdsc,
865 u64 snap);
866extern void ceph_put_snapid_map(struct ceph_mds_client* mdsc,
867 struct ceph_snapid_map *sm);
868extern void ceph_trim_snapid_map(struct ceph_mds_client *mdsc);
869extern void ceph_cleanup_snapid_map(struct ceph_mds_client *mdsc);
870
871
872
873
874
875
876static inline bool __ceph_have_pending_cap_snap(struct ceph_inode_info *ci)
877{
878 return !list_empty(&ci->i_cap_snaps) &&
879 list_last_entry(&ci->i_cap_snaps, struct ceph_cap_snap,
880 ci_item)->writing;
881}
882
883
884extern const struct inode_operations ceph_file_iops;
885
886extern struct inode *ceph_alloc_inode(struct super_block *sb);
887extern void ceph_evict_inode(struct inode *inode);
888extern void ceph_free_inode(struct inode *inode);
889
890extern struct inode *ceph_get_inode(struct super_block *sb,
891 struct ceph_vino vino);
892extern struct inode *ceph_get_snapdir(struct inode *parent);
893extern int ceph_fill_file_size(struct inode *inode, int issued,
894 u32 truncate_seq, u64 truncate_size, u64 size);
895extern void ceph_fill_file_time(struct inode *inode, int issued,
896 u64 time_warp_seq, struct timespec64 *ctime,
897 struct timespec64 *mtime,
898 struct timespec64 *atime);
899extern int ceph_fill_trace(struct super_block *sb,
900 struct ceph_mds_request *req);
901extern int ceph_readdir_prepopulate(struct ceph_mds_request *req,
902 struct ceph_mds_session *session);
903
904extern int ceph_inode_holds_cap(struct inode *inode, int mask);
905
906extern bool ceph_inode_set_size(struct inode *inode, loff_t size);
907extern void __ceph_do_pending_vmtruncate(struct inode *inode);
908extern void ceph_queue_vmtruncate(struct inode *inode);
909extern void ceph_queue_invalidate(struct inode *inode);
910extern void ceph_queue_writeback(struct inode *inode);
911extern void ceph_async_iput(struct inode *inode);
912
913extern int __ceph_do_getattr(struct inode *inode, struct page *locked_page,
914 int mask, bool force);
915static inline int ceph_do_getattr(struct inode *inode, int mask, bool force)
916{
917 return __ceph_do_getattr(inode, NULL, mask, force);
918}
919extern int ceph_permission(struct inode *inode, int mask);
920extern int __ceph_setattr(struct inode *inode, struct iattr *attr);
921extern int ceph_setattr(struct dentry *dentry, struct iattr *attr);
922extern int ceph_getattr(const struct path *path, struct kstat *stat,
923 u32 request_mask, unsigned int flags);
924
925
926int __ceph_setxattr(struct inode *, const char *, const void *, size_t, int);
927ssize_t __ceph_getxattr(struct inode *, const char *, void *, size_t);
928extern ssize_t ceph_listxattr(struct dentry *, char *, size_t);
929extern struct ceph_buffer *__ceph_build_xattrs_blob(struct ceph_inode_info *ci);
930extern void __ceph_destroy_xattrs(struct ceph_inode_info *ci);
931extern const struct xattr_handler *ceph_xattr_handlers[];
932
933struct ceph_acl_sec_ctx {
934#ifdef CONFIG_CEPH_FS_POSIX_ACL
935 void *default_acl;
936 void *acl;
937#endif
938#ifdef CONFIG_CEPH_FS_SECURITY_LABEL
939 void *sec_ctx;
940 u32 sec_ctxlen;
941#endif
942 struct ceph_pagelist *pagelist;
943};
944
945#ifdef CONFIG_SECURITY
946extern bool ceph_security_xattr_deadlock(struct inode *in);
947extern bool ceph_security_xattr_wanted(struct inode *in);
948#else
949static inline bool ceph_security_xattr_deadlock(struct inode *in)
950{
951 return false;
952}
953static inline bool ceph_security_xattr_wanted(struct inode *in)
954{
955 return false;
956}
957#endif
958
959#ifdef CONFIG_CEPH_FS_SECURITY_LABEL
960extern int ceph_security_init_secctx(struct dentry *dentry, umode_t mode,
961 struct ceph_acl_sec_ctx *ctx);
962extern void ceph_security_invalidate_secctx(struct inode *inode);
963#else
964static inline int ceph_security_init_secctx(struct dentry *dentry, umode_t mode,
965 struct ceph_acl_sec_ctx *ctx)
966{
967 return 0;
968}
969static inline void ceph_security_invalidate_secctx(struct inode *inode)
970{
971}
972#endif
973
974void ceph_release_acl_sec_ctx(struct ceph_acl_sec_ctx *as_ctx);
975
976
977#ifdef CONFIG_CEPH_FS_POSIX_ACL
978
979struct posix_acl *ceph_get_acl(struct inode *, int);
980int ceph_set_acl(struct inode *inode, struct posix_acl *acl, int type);
981int ceph_pre_init_acls(struct inode *dir, umode_t *mode,
982 struct ceph_acl_sec_ctx *as_ctx);
983void ceph_init_inode_acls(struct inode *inode,
984 struct ceph_acl_sec_ctx *as_ctx);
985
986static inline void ceph_forget_all_cached_acls(struct inode *inode)
987{
988 forget_all_cached_acls(inode);
989}
990
991#else
992
993#define ceph_get_acl NULL
994#define ceph_set_acl NULL
995
996static inline int ceph_pre_init_acls(struct inode *dir, umode_t *mode,
997 struct ceph_acl_sec_ctx *as_ctx)
998{
999 return 0;
1000}
1001static inline void ceph_init_inode_acls(struct inode *inode,
1002 struct ceph_acl_sec_ctx *as_ctx)
1003{
1004}
1005static inline int ceph_acl_chmod(struct dentry *dentry, struct inode *inode)
1006{
1007 return 0;
1008}
1009
1010static inline void ceph_forget_all_cached_acls(struct inode *inode)
1011{
1012}
1013
1014#endif
1015
1016
1017extern const char *ceph_cap_string(int c);
1018extern void ceph_handle_caps(struct ceph_mds_session *session,
1019 struct ceph_msg *msg);
1020extern struct ceph_cap *ceph_get_cap(struct ceph_mds_client *mdsc,
1021 struct ceph_cap_reservation *ctx);
1022extern void ceph_add_cap(struct inode *inode,
1023 struct ceph_mds_session *session, u64 cap_id,
1024 int fmode, unsigned issued, unsigned wanted,
1025 unsigned cap, unsigned seq, u64 realmino, int flags,
1026 struct ceph_cap **new_cap);
1027extern void __ceph_remove_cap(struct ceph_cap *cap, bool queue_release);
1028extern void __ceph_remove_caps(struct ceph_inode_info *ci);
1029extern void ceph_put_cap(struct ceph_mds_client *mdsc,
1030 struct ceph_cap *cap);
1031extern int ceph_is_any_caps(struct inode *inode);
1032
1033extern int ceph_write_inode(struct inode *inode, struct writeback_control *wbc);
1034extern int ceph_fsync(struct file *file, loff_t start, loff_t end,
1035 int datasync);
1036extern void ceph_early_kick_flushing_caps(struct ceph_mds_client *mdsc,
1037 struct ceph_mds_session *session);
1038extern void ceph_kick_flushing_caps(struct ceph_mds_client *mdsc,
1039 struct ceph_mds_session *session);
1040extern struct ceph_cap *ceph_get_cap_for_mds(struct ceph_inode_info *ci,
1041 int mds);
1042extern int ceph_get_cap_mds(struct inode *inode);
1043extern void ceph_get_cap_refs(struct ceph_inode_info *ci, int caps);
1044extern void ceph_put_cap_refs(struct ceph_inode_info *ci, int had);
1045extern void ceph_put_wrbuffer_cap_refs(struct ceph_inode_info *ci, int nr,
1046 struct ceph_snap_context *snapc);
1047extern void ceph_flush_snaps(struct ceph_inode_info *ci,
1048 struct ceph_mds_session **psession);
1049extern bool __ceph_should_report_size(struct ceph_inode_info *ci);
1050extern void ceph_check_caps(struct ceph_inode_info *ci, int flags,
1051 struct ceph_mds_session *session);
1052extern void ceph_check_delayed_caps(struct ceph_mds_client *mdsc);
1053extern void ceph_flush_dirty_caps(struct ceph_mds_client *mdsc);
1054extern int ceph_drop_caps_for_unlink(struct inode *inode);
1055extern int ceph_encode_inode_release(void **p, struct inode *inode,
1056 int mds, int drop, int unless, int force);
1057extern int ceph_encode_dentry_release(void **p, struct dentry *dn,
1058 struct inode *dir,
1059 int mds, int drop, int unless);
1060
1061extern int ceph_get_caps(struct ceph_inode_info *ci, int need, int want,
1062 loff_t endoff, int *got, struct page **pinned_page);
1063extern int ceph_try_get_caps(struct ceph_inode_info *ci,
1064 int need, int want, bool nonblock, int *got);
1065
1066
1067extern void __ceph_get_fmode(struct ceph_inode_info *ci, int mode);
1068extern void ceph_put_fmode(struct ceph_inode_info *ci, int mode);
1069
1070
1071extern const struct address_space_operations ceph_aops;
1072extern int ceph_mmap(struct file *file, struct vm_area_struct *vma);
1073extern int ceph_uninline_data(struct file *filp, struct page *locked_page);
1074extern int ceph_pool_perm_check(struct ceph_inode_info *ci, int need);
1075extern void ceph_pool_perm_destroy(struct ceph_mds_client* mdsc);
1076
1077
1078extern const struct file_operations ceph_file_fops;
1079
1080extern int ceph_renew_caps(struct inode *inode);
1081extern int ceph_open(struct inode *inode, struct file *file);
1082extern int ceph_atomic_open(struct inode *dir, struct dentry *dentry,
1083 struct file *file, unsigned flags, umode_t mode);
1084extern int ceph_release(struct inode *inode, struct file *filp);
1085extern void ceph_fill_inline_data(struct inode *inode, struct page *locked_page,
1086 char *data, size_t len);
1087
1088
1089extern const struct file_operations ceph_dir_fops;
1090extern const struct file_operations ceph_snapdir_fops;
1091extern const struct inode_operations ceph_dir_iops;
1092extern const struct inode_operations ceph_snapdir_iops;
1093extern const struct dentry_operations ceph_dentry_ops;
1094
1095extern loff_t ceph_make_fpos(unsigned high, unsigned off, bool hash_order);
1096extern int ceph_handle_notrace_create(struct inode *dir, struct dentry *dentry);
1097extern int ceph_handle_snapdir(struct ceph_mds_request *req,
1098 struct dentry *dentry, int err);
1099extern struct dentry *ceph_finish_lookup(struct ceph_mds_request *req,
1100 struct dentry *dentry, int err);
1101
1102extern void __ceph_dentry_lease_touch(struct ceph_dentry_info *di);
1103extern void __ceph_dentry_dir_lease_touch(struct ceph_dentry_info *di);
1104extern void ceph_invalidate_dentry_lease(struct dentry *dentry);
1105extern int ceph_trim_dentries(struct ceph_mds_client *mdsc);
1106extern unsigned ceph_dentry_hash(struct inode *dir, struct dentry *dn);
1107extern void ceph_readdir_cache_release(struct ceph_readdir_cache_control *ctl);
1108
1109
1110extern long ceph_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
1111
1112
1113extern const struct export_operations ceph_export_ops;
1114struct inode *ceph_lookup_inode(struct super_block *sb, u64 ino);
1115
1116
1117extern __init void ceph_flock_init(void);
1118extern int ceph_lock(struct file *file, int cmd, struct file_lock *fl);
1119extern int ceph_flock(struct file *file, int cmd, struct file_lock *fl);
1120extern void ceph_count_locks(struct inode *inode, int *p_num, int *f_num);
1121extern int ceph_encode_locks_to_buffer(struct inode *inode,
1122 struct ceph_filelock *flocks,
1123 int num_fcntl_locks,
1124 int num_flock_locks);
1125extern int ceph_locks_to_pagelist(struct ceph_filelock *flocks,
1126 struct ceph_pagelist *pagelist,
1127 int num_fcntl_locks, int num_flock_locks);
1128
1129
1130extern void ceph_fs_debugfs_init(struct ceph_fs_client *client);
1131extern void ceph_fs_debugfs_cleanup(struct ceph_fs_client *client);
1132
1133
1134static inline bool __ceph_has_any_quota(struct ceph_inode_info *ci)
1135{
1136 return ci->i_max_files || ci->i_max_bytes;
1137}
1138
1139extern void ceph_adjust_quota_realms_count(struct inode *inode, bool inc);
1140
1141static inline void __ceph_update_quota(struct ceph_inode_info *ci,
1142 u64 max_bytes, u64 max_files)
1143{
1144 bool had_quota, has_quota;
1145 had_quota = __ceph_has_any_quota(ci);
1146 ci->i_max_bytes = max_bytes;
1147 ci->i_max_files = max_files;
1148 has_quota = __ceph_has_any_quota(ci);
1149
1150 if (had_quota != has_quota)
1151 ceph_adjust_quota_realms_count(&ci->vfs_inode, has_quota);
1152}
1153
1154extern void ceph_handle_quota(struct ceph_mds_client *mdsc,
1155 struct ceph_mds_session *session,
1156 struct ceph_msg *msg);
1157extern bool ceph_quota_is_max_files_exceeded(struct inode *inode);
1158extern bool ceph_quota_is_same_realm(struct inode *old, struct inode *new);
1159extern bool ceph_quota_is_max_bytes_exceeded(struct inode *inode,
1160 loff_t newlen);
1161extern bool ceph_quota_is_max_bytes_approaching(struct inode *inode,
1162 loff_t newlen);
1163extern bool ceph_quota_update_statfs(struct ceph_fs_client *fsc,
1164 struct kstatfs *buf);
1165extern void ceph_cleanup_quotarealms_inodes(struct ceph_mds_client *mdsc);
1166
1167#endif
1168