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
1 From dd5c7af957dd0b9b3b04ef8aacffd601b46bc26c Mon Sep 17 00:00:00 2001
2 From: Jan Kara <jack@suse.cz>
3 Date: Tue, 25 Nov 2014 11:53:47 -0500
4 Subject: [PATCH 6/7] ext4: cleanup flag definitions for extent status tree
5
6 Currently flags for extent status tree are defined twice, once shifted
7 and once without a being shifted. Consolidate these definitions into one
8 place and make some computations automatic to make adding flags less
9 error prone. Compiler should be clever enough to figure out these are
10 constants and generate the same code.
11
12 Signed-off-by: Jan Kara <jack@suse.cz>
13 Signed-off-by: Theodore Ts'o <tytso@mit.edu>
14 ---
15  fs/ext4/extents_status.c |  2 ++
16  fs/ext4/extents_status.h | 58 ++++++++++++++++++----------------------
17  2 files changed, 28 insertions(+), 32 deletions(-)
18
19 diff --git a/fs/ext4/extents_status.c b/fs/ext4/extents_status.c
20 index b78eec2a..a29708c0 100644
21 --- a/fs/ext4/extents_status.c
22 +++ b/fs/ext4/extents_status.c
23 @@ -1170,6 +1170,8 @@ int ext4_es_register_shrinker(struct ext4_sb_info *sbi)
24  {
25         int err;
26  
27 +       /* Make sure we have enough bits for physical block number */
28 +       BUILD_BUG_ON(ES_SHIFT < 48);
29         INIT_LIST_HEAD(&sbi->s_es_list);
30         sbi->s_es_nr_inode = 0;
31         spin_lock_init(&sbi->s_es_lock);
32 diff --git a/fs/ext4/extents_status.h b/fs/ext4/extents_status.h
33 index b0b78b95..e86b1f34 100644
34 --- a/fs/ext4/extents_status.h
35 +++ b/fs/ext4/extents_status.h
36 @@ -29,25 +29,21 @@
37  /*
38   * These flags live in the high bits of extent_status.es_pblk
39   */
40 -#define ES_SHIFT       60
41 -
42 -#define EXTENT_STATUS_WRITTEN  (1 << 3)
43 -#define EXTENT_STATUS_UNWRITTEN (1 << 2)
44 -#define EXTENT_STATUS_DELAYED  (1 << 1)
45 -#define EXTENT_STATUS_HOLE     (1 << 0)
46 -
47 -#define EXTENT_STATUS_FLAGS    (EXTENT_STATUS_WRITTEN | \
48 -                                EXTENT_STATUS_UNWRITTEN | \
49 -                                EXTENT_STATUS_DELAYED | \
50 -                                EXTENT_STATUS_HOLE)
51 +enum {
52 +       ES_WRITTEN_B,
53 +       ES_UNWRITTEN_B,
54 +       ES_DELAYED_B,
55 +       ES_HOLE_B,
56 +       ES_FLAGS
57 +};
58  
59 -#define ES_WRITTEN             (1ULL << 63)
60 -#define ES_UNWRITTEN           (1ULL << 62)
61 -#define ES_DELAYED             (1ULL << 61)
62 -#define ES_HOLE                        (1ULL << 60)
63 +#define ES_SHIFT (sizeof(ext4_fsblk_t)*8 - ES_FLAGS)
64 +#define ES_MASK (~((ext4_fsblk_t)0) << ES_SHIFT)
65  
66 -#define ES_MASK                        (ES_WRITTEN | ES_UNWRITTEN | \
67 -                                ES_DELAYED | ES_HOLE)
68 +#define EXTENT_STATUS_WRITTEN  (1 << ES_WRITTEN_B)
69 +#define EXTENT_STATUS_UNWRITTEN (1 << ES_UNWRITTEN_B)
70 +#define EXTENT_STATUS_DELAYED  (1 << ES_DELAYED_B)
71 +#define EXTENT_STATUS_HOLE     (1 << ES_HOLE_B)
72  
73  struct ext4_sb_info;
74  struct ext4_extent;
75 @@ -92,29 +88,29 @@ extern void ext4_es_find_delayed_extent_range(struct inode *inode,
76  extern int ext4_es_lookup_extent(struct inode *inode, ext4_lblk_t lblk,
77                                  struct extent_status *es);
78  
79 +static inline unsigned int ext4_es_status(struct extent_status *es)
80 +{
81 +       return es->es_pblk >> ES_SHIFT;
82 +}
83 +
84  static inline int ext4_es_is_written(struct extent_status *es)
85  {
86 -       return (es->es_pblk & ES_WRITTEN) != 0;
87 +       return (ext4_es_status(es) & EXTENT_STATUS_WRITTEN) != 0;
88  }
89  
90  static inline int ext4_es_is_unwritten(struct extent_status *es)
91  {
92 -       return (es->es_pblk & ES_UNWRITTEN) != 0;
93 +       return (ext4_es_status(es) & EXTENT_STATUS_UNWRITTEN) != 0;
94  }
95  
96  static inline int ext4_es_is_delayed(struct extent_status *es)
97  {
98 -       return (es->es_pblk & ES_DELAYED) != 0;
99 +       return (ext4_es_status(es) & EXTENT_STATUS_DELAYED) != 0;
100  }
101  
102  static inline int ext4_es_is_hole(struct extent_status *es)
103  {
104 -       return (es->es_pblk & ES_HOLE) != 0;
105 -}
106 -
107 -static inline unsigned int ext4_es_status(struct extent_status *es)
108 -{
109 -       return es->es_pblk >> ES_SHIFT;
110 +       return (ext4_es_status(es) & EXTENT_STATUS_HOLE) != 0;
111  }
112  
113  static inline ext4_fsblk_t ext4_es_pblock(struct extent_status *es)
114 @@ -134,18 +130,16 @@ static inline void ext4_es_store_pblock(struct extent_status *es,
115  static inline void ext4_es_store_status(struct extent_status *es,
116                                         unsigned int status)
117  {
118 -       es->es_pblk = (((ext4_fsblk_t)
119 -                       (status & EXTENT_STATUS_FLAGS) << ES_SHIFT) |
120 -                      (es->es_pblk & ~ES_MASK));
121 +       es->es_pblk = (((ext4_fsblk_t)status << ES_SHIFT) & ES_MASK) |
122 +                     (es->es_pblk & ~ES_MASK);
123  }
124  
125  static inline void ext4_es_store_pblock_status(struct extent_status *es,
126                                                ext4_fsblk_t pb,
127                                                unsigned int status)
128  {
129 -       es->es_pblk = (((ext4_fsblk_t)
130 -                       (status & EXTENT_STATUS_FLAGS) << ES_SHIFT) |
131 -                      (pb & ~ES_MASK));
132 +       es->es_pblk = (((ext4_fsblk_t)status << ES_SHIFT) & ES_MASK) |
133 +                     (pb & ~ES_MASK);
134  }
135  
136  extern int ext4_es_register_shrinker(struct ext4_sb_info *sbi);
137 -- 
138 2.24.1
139