--- /dev/null
+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
+