btrfs: migrate get_eb_page_index() and get_eb_offset_in_page() to folios
[sfrench/cifs-2.6.git] / fs / btrfs / extent_io.h
index a5fd5cb20a3ce9e04d55ec67acb4992579ab25c9..46050500529bff3720c3f117ca593646abaadc65 100644 (file)
@@ -121,29 +121,43 @@ struct btrfs_eb_write_context {
  *
  * Will handle both sectorsize == PAGE_SIZE and sectorsize < PAGE_SIZE cases.
  */
-static inline size_t get_eb_offset_in_page(const struct extent_buffer *eb,
-                                          unsigned long offset)
+static inline size_t get_eb_offset_in_folio(const struct extent_buffer *eb,
+                                           unsigned long offset)
 {
        /*
-        * For sectorsize == PAGE_SIZE case, eb->start will always be aligned
-        * to PAGE_SIZE, thus adding it won't cause any difference.
+        * 1) sectorsize == PAGE_SIZE and nodesize >= PAGE_SIZE case
+        *    1.1) One large folio covering the whole eb
+        *         The eb->start is aligned to folio size, thus adding it
+        *         won't cause any difference.
+        *    1.2) Several page sized folios
+        *         The eb->start is aligned to folio (page) size, thus
+        *         adding it won't cause any difference.
         *
-        * For sectorsize < PAGE_SIZE, we must only read the data that belongs
-        * to the eb, thus we have to take the eb->start into consideration.
+        * 2) sectorsize < PAGE_SIZE and nodesize < PAGE_SIZE case
+        *    In this case there would only be one page sized folio, and there
+        *    may be several different extent buffers in the page/folio.
+        *    We need to add eb->start to properly access the offset inside
+        *    that eb.
         */
-       return offset_in_page(offset + eb->start);
+       return offset_in_folio(eb->folios[0], offset + eb->start);
 }
 
-static inline unsigned long get_eb_page_index(unsigned long offset)
+static inline unsigned long get_eb_folio_index(const struct extent_buffer *eb,
+                                              unsigned long offset)
 {
        /*
-        * For sectorsize == PAGE_SIZE case, plain >> PAGE_SHIFT is enough.
+        * 1) sectorsize == PAGE_SIZE and nodesize >= PAGE_SIZE case
+        *    1.1) One large folio covering the whole eb.
+        *         the folio_shift would be large enough to always make us
+        *         return 0 as index.
+        *    1.2) Several page sized folios
+        *         The folio_shift() would be PAGE_SHIFT, giving us the correct
+        *         index.
         *
-        * For sectorsize < PAGE_SIZE case, we only support 64K PAGE_SIZE,
-        * and have ensured that all tree blocks are contained in one page,
-        * thus we always get index == 0.
+        * 2) sectorsize < PAGE_SIZE and nodesize < PAGE_SIZE case
+        *    The folio would only be page sized, and always give us 0 as index.
         */
-       return offset >> PAGE_SHIFT;
+       return offset >> folio_shift(eb->folios[0]);
 }
 
 /*