Whamcloud - gitweb
LU-13300 ldiskfs: port patches to improve extent status shrink
[fs/lustre-release.git] / ldiskfs / kernel_patches / patches / rhel7.6 / ext4-cleanup-flag-definitions-for-extent-status-tree.patch
diff --git a/ldiskfs/kernel_patches/patches/rhel7.6/ext4-cleanup-flag-definitions-for-extent-status-tree.patch b/ldiskfs/kernel_patches/patches/rhel7.6/ext4-cleanup-flag-definitions-for-extent-status-tree.patch
new file mode 100644 (file)
index 0000000..4d28b12
--- /dev/null
@@ -0,0 +1,139 @@
+From dd5c7af957dd0b9b3b04ef8aacffd601b46bc26c Mon Sep 17 00:00:00 2001
+From: Jan Kara <jack@suse.cz>
+Date: Tue, 25 Nov 2014 11:53:47 -0500
+Subject: [PATCH 6/7] ext4: cleanup flag definitions for extent status tree
+
+Currently flags for extent status tree are defined twice, once shifted
+and once without a being shifted. Consolidate these definitions into one
+place and make some computations automatic to make adding flags less
+error prone. Compiler should be clever enough to figure out these are
+constants and generate the same code.
+
+Signed-off-by: Jan Kara <jack@suse.cz>
+Signed-off-by: Theodore Ts'o <tytso@mit.edu>
+---
+ fs/ext4/extents_status.c |  2 ++
+ fs/ext4/extents_status.h | 58 ++++++++++++++++++----------------------
+ 2 files changed, 28 insertions(+), 32 deletions(-)
+
+diff --git a/fs/ext4/extents_status.c b/fs/ext4/extents_status.c
+index b78eec2a..a29708c0 100644
+--- a/fs/ext4/extents_status.c
++++ b/fs/ext4/extents_status.c
+@@ -1170,6 +1170,8 @@ int ext4_es_register_shrinker(struct ext4_sb_info *sbi)
+ {
+       int err;
++      /* Make sure we have enough bits for physical block number */
++      BUILD_BUG_ON(ES_SHIFT < 48);
+       INIT_LIST_HEAD(&sbi->s_es_list);
+       sbi->s_es_nr_inode = 0;
+       spin_lock_init(&sbi->s_es_lock);
+diff --git a/fs/ext4/extents_status.h b/fs/ext4/extents_status.h
+index b0b78b95..e86b1f34 100644
+--- a/fs/ext4/extents_status.h
++++ b/fs/ext4/extents_status.h
+@@ -29,25 +29,21 @@
+ /*
+  * These flags live in the high bits of extent_status.es_pblk
+  */
+-#define ES_SHIFT      60
+-
+-#define EXTENT_STATUS_WRITTEN (1 << 3)
+-#define EXTENT_STATUS_UNWRITTEN (1 << 2)
+-#define EXTENT_STATUS_DELAYED (1 << 1)
+-#define EXTENT_STATUS_HOLE    (1 << 0)
+-
+-#define EXTENT_STATUS_FLAGS   (EXTENT_STATUS_WRITTEN | \
+-                               EXTENT_STATUS_UNWRITTEN | \
+-                               EXTENT_STATUS_DELAYED | \
+-                               EXTENT_STATUS_HOLE)
++enum {
++      ES_WRITTEN_B,
++      ES_UNWRITTEN_B,
++      ES_DELAYED_B,
++      ES_HOLE_B,
++      ES_FLAGS
++};
+-#define ES_WRITTEN            (1ULL << 63)
+-#define ES_UNWRITTEN          (1ULL << 62)
+-#define ES_DELAYED            (1ULL << 61)
+-#define ES_HOLE                       (1ULL << 60)
++#define ES_SHIFT (sizeof(ext4_fsblk_t)*8 - ES_FLAGS)
++#define ES_MASK (~((ext4_fsblk_t)0) << ES_SHIFT)
+-#define ES_MASK                       (ES_WRITTEN | ES_UNWRITTEN | \
+-                               ES_DELAYED | ES_HOLE)
++#define EXTENT_STATUS_WRITTEN (1 << ES_WRITTEN_B)
++#define EXTENT_STATUS_UNWRITTEN (1 << ES_UNWRITTEN_B)
++#define EXTENT_STATUS_DELAYED (1 << ES_DELAYED_B)
++#define EXTENT_STATUS_HOLE    (1 << ES_HOLE_B)
+ struct ext4_sb_info;
+ struct ext4_extent;
+@@ -92,29 +88,29 @@ extern void ext4_es_find_delayed_extent_range(struct inode *inode,
+ extern int ext4_es_lookup_extent(struct inode *inode, ext4_lblk_t lblk,
+                                struct extent_status *es);
++static inline unsigned int ext4_es_status(struct extent_status *es)
++{
++      return es->es_pblk >> ES_SHIFT;
++}
++
+ static inline int ext4_es_is_written(struct extent_status *es)
+ {
+-      return (es->es_pblk & ES_WRITTEN) != 0;
++      return (ext4_es_status(es) & EXTENT_STATUS_WRITTEN) != 0;
+ }
+ static inline int ext4_es_is_unwritten(struct extent_status *es)
+ {
+-      return (es->es_pblk & ES_UNWRITTEN) != 0;
++      return (ext4_es_status(es) & EXTENT_STATUS_UNWRITTEN) != 0;
+ }
+ static inline int ext4_es_is_delayed(struct extent_status *es)
+ {
+-      return (es->es_pblk & ES_DELAYED) != 0;
++      return (ext4_es_status(es) & EXTENT_STATUS_DELAYED) != 0;
+ }
+ static inline int ext4_es_is_hole(struct extent_status *es)
+ {
+-      return (es->es_pblk & ES_HOLE) != 0;
+-}
+-
+-static inline unsigned int ext4_es_status(struct extent_status *es)
+-{
+-      return es->es_pblk >> ES_SHIFT;
++      return (ext4_es_status(es) & EXTENT_STATUS_HOLE) != 0;
+ }
+ static inline ext4_fsblk_t ext4_es_pblock(struct extent_status *es)
+@@ -134,18 +130,16 @@ static inline void ext4_es_store_pblock(struct extent_status *es,
+ static inline void ext4_es_store_status(struct extent_status *es,
+                                       unsigned int status)
+ {
+-      es->es_pblk = (((ext4_fsblk_t)
+-                      (status & EXTENT_STATUS_FLAGS) << ES_SHIFT) |
+-                     (es->es_pblk & ~ES_MASK));
++      es->es_pblk = (((ext4_fsblk_t)status << ES_SHIFT) & ES_MASK) |
++                    (es->es_pblk & ~ES_MASK);
+ }
+ static inline void ext4_es_store_pblock_status(struct extent_status *es,
+                                              ext4_fsblk_t pb,
+                                              unsigned int status)
+ {
+-      es->es_pblk = (((ext4_fsblk_t)
+-                      (status & EXTENT_STATUS_FLAGS) << ES_SHIFT) |
+-                     (pb & ~ES_MASK));
++      es->es_pblk = (((ext4_fsblk_t)status << ES_SHIFT) & ES_MASK) |
++                    (pb & ~ES_MASK);
+ }
+ extern int ext4_es_register_shrinker(struct ext4_sb_info *sbi);
+-- 
+2.24.1
+