~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/fs/bcachefs/fs-io-pagecache.h

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0 */
  2 #ifndef _BCACHEFS_FS_IO_PAGECACHE_H
  3 #define _BCACHEFS_FS_IO_PAGECACHE_H
  4 
  5 #include <linux/pagemap.h>
  6 
  7 typedef DARRAY(struct folio *) folios;
  8 
  9 int bch2_filemap_get_contig_folios_d(struct address_space *, loff_t,
 10                                      u64, fgf_t, gfp_t, folios *);
 11 int bch2_write_invalidate_inode_pages_range(struct address_space *, loff_t, loff_t);
 12 
 13 /*
 14  * Use u64 for the end pos and sector helpers because if the folio covers the
 15  * max supported range of the mapping, the start offset of the next folio
 16  * overflows loff_t. This breaks much of the range based processing in the
 17  * buffered write path.
 18  */
 19 static inline u64 folio_end_pos(struct folio *folio)
 20 {
 21         return folio_pos(folio) + folio_size(folio);
 22 }
 23 
 24 static inline size_t folio_sectors(struct folio *folio)
 25 {
 26         return PAGE_SECTORS << folio_order(folio);
 27 }
 28 
 29 static inline loff_t folio_sector(struct folio *folio)
 30 {
 31         return folio_pos(folio) >> 9;
 32 }
 33 
 34 static inline u64 folio_end_sector(struct folio *folio)
 35 {
 36         return folio_end_pos(folio) >> 9;
 37 }
 38 
 39 #define BCH_FOLIO_SECTOR_STATE()        \
 40         x(unallocated)                  \
 41         x(reserved)                     \
 42         x(dirty)                        \
 43         x(dirty_reserved)               \
 44         x(allocated)
 45 
 46 enum bch_folio_sector_state {
 47 #define x(n)    SECTOR_##n,
 48         BCH_FOLIO_SECTOR_STATE()
 49 #undef x
 50 };
 51 
 52 struct bch_folio_sector {
 53         /* Uncompressed, fully allocated replicas (or on disk reservation): */
 54         u8                      nr_replicas:4,
 55         /* Owns PAGE_SECTORS * replicas_reserved sized in memory reservation: */
 56                                 replicas_reserved:4;
 57         u8                      state;
 58 };
 59 
 60 struct bch_folio {
 61         spinlock_t              lock;
 62         atomic_t                write_count;
 63         /*
 64          * Is the sector state up to date with the btree?
 65          * (Not the data itself)
 66          */
 67         bool                    uptodate;
 68         struct bch_folio_sector s[];
 69 };
 70 
 71 /* Helper for when we need to add debug instrumentation: */
 72 static inline void bch2_folio_sector_set(struct folio *folio,
 73                              struct bch_folio *s,
 74                              unsigned i, unsigned n)
 75 {
 76         s->s[i].state = n;
 77 }
 78 
 79 /* file offset (to folio offset) to bch_folio_sector index */
 80 static inline int folio_pos_to_s(struct folio *folio, loff_t pos)
 81 {
 82         u64 f_offset = pos - folio_pos(folio);
 83 
 84         BUG_ON(pos < folio_pos(folio) || pos >= folio_end_pos(folio));
 85         return f_offset >> SECTOR_SHIFT;
 86 }
 87 
 88 /* for newly allocated folios: */
 89 static inline void __bch2_folio_release(struct folio *folio)
 90 {
 91         kfree(folio_detach_private(folio));
 92 }
 93 
 94 static inline void bch2_folio_release(struct folio *folio)
 95 {
 96         EBUG_ON(!folio_test_locked(folio));
 97         __bch2_folio_release(folio);
 98 }
 99 
100 static inline struct bch_folio *__bch2_folio(struct folio *folio)
101 {
102         return folio_has_private(folio)
103                 ? (struct bch_folio *) folio_get_private(folio)
104                 : NULL;
105 }
106 
107 static inline struct bch_folio *bch2_folio(struct folio *folio)
108 {
109         EBUG_ON(!folio_test_locked(folio));
110 
111         return __bch2_folio(folio);
112 }
113 
114 struct bch_folio *__bch2_folio_create(struct folio *, gfp_t);
115 struct bch_folio *bch2_folio_create(struct folio *, gfp_t);
116 
117 struct bch2_folio_reservation {
118         struct disk_reservation disk;
119         struct quota_res        quota;
120 };
121 
122 static inline unsigned inode_nr_replicas(struct bch_fs *c, struct bch_inode_info *inode)
123 {
124         /* XXX: this should not be open coded */
125         return inode->ei_inode.bi_data_replicas
126                 ? inode->ei_inode.bi_data_replicas - 1
127                 : c->opts.data_replicas;
128 }
129 
130 static inline void bch2_folio_reservation_init(struct bch_fs *c,
131                         struct bch_inode_info *inode,
132                         struct bch2_folio_reservation *res)
133 {
134         memset(res, 0, sizeof(*res));
135 
136         res->disk.nr_replicas = inode_nr_replicas(c, inode);
137 }
138 
139 int bch2_folio_set(struct bch_fs *, subvol_inum, struct folio **, unsigned);
140 void bch2_bio_page_state_set(struct bio *, struct bkey_s_c);
141 
142 void bch2_mark_pagecache_unallocated(struct bch_inode_info *, u64, u64);
143 int bch2_mark_pagecache_reserved(struct bch_inode_info *, u64 *, u64, bool);
144 
145 int bch2_get_folio_disk_reservation(struct bch_fs *,
146                                 struct bch_inode_info *,
147                                 struct folio *, bool);
148 
149 void bch2_folio_reservation_put(struct bch_fs *,
150                         struct bch_inode_info *,
151                         struct bch2_folio_reservation *);
152 int bch2_folio_reservation_get(struct bch_fs *,
153                         struct bch_inode_info *,
154                         struct folio *,
155                         struct bch2_folio_reservation *,
156                         size_t, size_t);
157 ssize_t bch2_folio_reservation_get_partial(struct bch_fs *,
158                         struct bch_inode_info *,
159                         struct folio *,
160                         struct bch2_folio_reservation *,
161                         size_t, size_t);
162 
163 void bch2_set_folio_dirty(struct bch_fs *,
164                           struct bch_inode_info *,
165                           struct folio *,
166                           struct bch2_folio_reservation *,
167                           unsigned, unsigned);
168 
169 vm_fault_t bch2_page_fault(struct vm_fault *);
170 vm_fault_t bch2_page_mkwrite(struct vm_fault *);
171 void bch2_invalidate_folio(struct folio *, size_t, size_t);
172 bool bch2_release_folio(struct folio *, gfp_t);
173 
174 loff_t bch2_seek_pagecache_data(struct inode *, loff_t, loff_t, unsigned, bool);
175 loff_t bch2_seek_pagecache_hole(struct inode *, loff_t, loff_t, unsigned, bool);
176 int bch2_clamp_data_hole(struct inode *, u64 *, u64 *, unsigned, bool);
177 
178 #endif /* _BCACHEFS_FS_IO_PAGECACHE_H */
179 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php