diff options
| author | Theodore Ts'o <tytso@mit.edu> | 2013-08-16 21:22:41 -0400 |
|---|---|---|
| committer | Theodore Ts'o <tytso@mit.edu> | 2013-08-16 21:22:41 -0400 |
| commit | 3be78c73179c9347bdc0a92b2898063bd2300ff7 (patch) | |
| tree | eb4147818a58e3dd80300fd09fc94ad344480231 | |
| parent | c349179b4808f7c8e1ff1b4dd967c047eefd24bc (diff) | |
ext4: use unsigned int for es_status values
Don't use an unsigned long long for the es_status flags; this requires
that we pass 64-bit values around which is painful on 32-bit systems.
Instead pass the extent status flags around using the low 4 bits of an
unsigned int, and shift them into place when we are reading or writing
es_pblk.
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Reviewed-by: Zheng Liu <wenqing.lz@taobao.com>
| -rw-r--r-- | fs/ext4/extents_status.c | 6 | ||||
| -rw-r--r-- | fs/ext4/extents_status.h | 47 | ||||
| -rw-r--r-- | fs/ext4/inode.c | 6 | ||||
| -rw-r--r-- | include/trace/events/ext4.h | 14 |
4 files changed, 40 insertions, 33 deletions
diff --git a/fs/ext4/extents_status.c b/fs/ext4/extents_status.c index 91cb110da1b4..ded2615b63e0 100644 --- a/fs/ext4/extents_status.c +++ b/fs/ext4/extents_status.c | |||
| @@ -263,7 +263,7 @@ void ext4_es_find_delayed_extent_range(struct inode *inode, | |||
| 263 | if (tree->cache_es) { | 263 | if (tree->cache_es) { |
| 264 | es1 = tree->cache_es; | 264 | es1 = tree->cache_es; |
| 265 | if (in_range(lblk, es1->es_lblk, es1->es_len)) { | 265 | if (in_range(lblk, es1->es_lblk, es1->es_len)) { |
| 266 | es_debug("%u cached by [%u/%u) %llu %llx\n", | 266 | es_debug("%u cached by [%u/%u) %llu %x\n", |
| 267 | lblk, es1->es_lblk, es1->es_len, | 267 | lblk, es1->es_lblk, es1->es_len, |
| 268 | ext4_es_pblock(es1), ext4_es_status(es1)); | 268 | ext4_es_pblock(es1), ext4_es_status(es1)); |
| 269 | goto out; | 269 | goto out; |
| @@ -641,13 +641,13 @@ out: | |||
| 641 | */ | 641 | */ |
| 642 | int ext4_es_insert_extent(struct inode *inode, ext4_lblk_t lblk, | 642 | int ext4_es_insert_extent(struct inode *inode, ext4_lblk_t lblk, |
| 643 | ext4_lblk_t len, ext4_fsblk_t pblk, | 643 | ext4_lblk_t len, ext4_fsblk_t pblk, |
| 644 | unsigned long long status) | 644 | unsigned int status) |
| 645 | { | 645 | { |
| 646 | struct extent_status newes; | 646 | struct extent_status newes; |
| 647 | ext4_lblk_t end = lblk + len - 1; | 647 | ext4_lblk_t end = lblk + len - 1; |
| 648 | int err = 0; | 648 | int err = 0; |
| 649 | 649 | ||
| 650 | es_debug("add [%u/%u) %llu %llx to extent status tree of inode %lu\n", | 650 | es_debug("add [%u/%u) %llu %x to extent status tree of inode %lu\n", |
| 651 | lblk, len, pblk, status, inode->i_ino); | 651 | lblk, len, pblk, status, inode->i_ino); |
| 652 | 652 | ||
| 653 | if (!len) | 653 | if (!len) |
diff --git a/fs/ext4/extents_status.h b/fs/ext4/extents_status.h index e936730cc5b0..d72af848f989 100644 --- a/fs/ext4/extents_status.h +++ b/fs/ext4/extents_status.h | |||
| @@ -29,16 +29,26 @@ | |||
| 29 | /* | 29 | /* |
| 30 | * These flags live in the high bits of extent_status.es_pblk | 30 | * These flags live in the high bits of extent_status.es_pblk |
| 31 | */ | 31 | */ |
| 32 | #define EXTENT_STATUS_WRITTEN (1ULL << 63) | 32 | #define ES_SHIFT 60 |
| 33 | #define EXTENT_STATUS_UNWRITTEN (1ULL << 62) | 33 | |
| 34 | #define EXTENT_STATUS_DELAYED (1ULL << 61) | 34 | #define EXTENT_STATUS_WRITTEN (1 << 3) |
| 35 | #define EXTENT_STATUS_HOLE (1ULL << 60) | 35 | #define EXTENT_STATUS_UNWRITTEN (1 << 2) |
| 36 | #define EXTENT_STATUS_DELAYED (1 << 1) | ||
| 37 | #define EXTENT_STATUS_HOLE (1 << 0) | ||
| 36 | 38 | ||
| 37 | #define EXTENT_STATUS_FLAGS (EXTENT_STATUS_WRITTEN | \ | 39 | #define EXTENT_STATUS_FLAGS (EXTENT_STATUS_WRITTEN | \ |
| 38 | EXTENT_STATUS_UNWRITTEN | \ | 40 | EXTENT_STATUS_UNWRITTEN | \ |
| 39 | EXTENT_STATUS_DELAYED | \ | 41 | EXTENT_STATUS_DELAYED | \ |
| 40 | EXTENT_STATUS_HOLE) | 42 | EXTENT_STATUS_HOLE) |
| 41 | 43 | ||
| 44 | #define ES_WRITTEN (1ULL << 63) | ||
| 45 | #define ES_UNWRITTEN (1ULL << 62) | ||
| 46 | #define ES_DELAYED (1ULL << 61) | ||
| 47 | #define ES_HOLE (1ULL << 60) | ||
| 48 | |||
| 49 | #define ES_MASK (ES_WRITTEN | ES_UNWRITTEN | \ | ||
| 50 | ES_DELAYED | ES_HOLE) | ||
| 51 | |||
| 42 | struct ext4_sb_info; | 52 | struct ext4_sb_info; |
| 43 | struct ext4_extent; | 53 | struct ext4_extent; |
| 44 | 54 | ||
| @@ -60,7 +70,7 @@ extern void ext4_es_init_tree(struct ext4_es_tree *tree); | |||
| 60 | 70 | ||
| 61 | extern int ext4_es_insert_extent(struct inode *inode, ext4_lblk_t lblk, | 71 | extern int ext4_es_insert_extent(struct inode *inode, ext4_lblk_t lblk, |
| 62 | ext4_lblk_t len, ext4_fsblk_t pblk, | 72 | ext4_lblk_t len, ext4_fsblk_t pblk, |
| 63 | unsigned long long status); | 73 | unsigned int status); |
| 64 | extern int ext4_es_remove_extent(struct inode *inode, ext4_lblk_t lblk, | 74 | extern int ext4_es_remove_extent(struct inode *inode, ext4_lblk_t lblk, |
| 65 | ext4_lblk_t len); | 75 | ext4_lblk_t len); |
| 66 | extern void ext4_es_find_delayed_extent_range(struct inode *inode, | 76 | extern void ext4_es_find_delayed_extent_range(struct inode *inode, |
| @@ -72,32 +82,32 @@ extern int ext4_es_zeroout(struct inode *inode, struct ext4_extent *ex); | |||
| 72 | 82 | ||
| 73 | static inline int ext4_es_is_written(struct extent_status *es) | 83 | static inline int ext4_es_is_written(struct extent_status *es) |
| 74 | { | 84 | { |
| 75 | return (es->es_pblk & EXTENT_STATUS_WRITTEN) != 0; | 85 | return (es->es_pblk & ES_WRITTEN) != 0; |
| 76 | } | 86 | } |
| 77 | 87 | ||
| 78 | static inline int ext4_es_is_unwritten(struct extent_status *es) | 88 | static inline int ext4_es_is_unwritten(struct extent_status *es) |
| 79 | { | 89 | { |
| 80 | return (es->es_pblk & EXTENT_STATUS_UNWRITTEN) != 0; | 90 | return (es->es_pblk & ES_UNWRITTEN) != 0; |
| 81 | } | 91 | } |
| 82 | 92 | ||
| 83 | static inline int ext4_es_is_delayed(struct extent_status *es) | 93 | static inline int ext4_es_is_delayed(struct extent_status *es) |
| 84 | { | 94 | { |
| 85 | return (es->es_pblk & EXTENT_STATUS_DELAYED) != 0; | 95 | return (es->es_pblk & ES_DELAYED) != 0; |
| 86 | } | 96 | } |
| 87 | 97 | ||
| 88 | static inline int ext4_es_is_hole(struct extent_status *es) | 98 | static inline int ext4_es_is_hole(struct extent_status *es) |
| 89 | { | 99 | { |
| 90 | return (es->es_pblk & EXTENT_STATUS_HOLE) != 0; | 100 | return (es->es_pblk & ES_HOLE) != 0; |
| 91 | } | 101 | } |
| 92 | 102 | ||
| 93 | static inline ext4_fsblk_t ext4_es_status(struct extent_status *es) | 103 | static inline unsigned int ext4_es_status(struct extent_status *es) |
| 94 | { | 104 | { |
| 95 | return (es->es_pblk & EXTENT_STATUS_FLAGS); | 105 | return es->es_pblk >> ES_SHIFT; |
| 96 | } | 106 | } |
| 97 | 107 | ||
| 98 | static inline ext4_fsblk_t ext4_es_pblock(struct extent_status *es) | 108 | static inline ext4_fsblk_t ext4_es_pblock(struct extent_status *es) |
| 99 | { | 109 | { |
| 100 | return (es->es_pblk & ~EXTENT_STATUS_FLAGS); | 110 | return es->es_pblk & ~ES_MASK; |
| 101 | } | 111 | } |
| 102 | 112 | ||
| 103 | static inline void ext4_es_store_pblock(struct extent_status *es, | 113 | static inline void ext4_es_store_pblock(struct extent_status *es, |
| @@ -105,19 +115,16 @@ static inline void ext4_es_store_pblock(struct extent_status *es, | |||
| 105 | { | 115 | { |
| 106 | ext4_fsblk_t block; | 116 | ext4_fsblk_t block; |
| 107 | 117 | ||
| 108 | block = (pb & ~EXTENT_STATUS_FLAGS) | | 118 | block = (pb & ~ES_MASK) | (es->es_pblk & ES_MASK); |
| 109 | (es->es_pblk & EXTENT_STATUS_FLAGS); | ||
| 110 | es->es_pblk = block; | 119 | es->es_pblk = block; |
| 111 | } | 120 | } |
| 112 | 121 | ||
| 113 | static inline void ext4_es_store_status(struct extent_status *es, | 122 | static inline void ext4_es_store_status(struct extent_status *es, |
| 114 | unsigned long long status) | 123 | unsigned int status) |
| 115 | { | 124 | { |
| 116 | ext4_fsblk_t block; | 125 | es->es_pblk = (((ext4_fsblk_t) |
| 117 | 126 | (status & EXTENT_STATUS_FLAGS) << ES_SHIFT) | | |
| 118 | block = (status & EXTENT_STATUS_FLAGS) | | 127 | (es->es_pblk & ~ES_MASK)); |
| 119 | (es->es_pblk & ~EXTENT_STATUS_FLAGS); | ||
| 120 | es->es_pblk = block; | ||
| 121 | } | 128 | } |
| 122 | 129 | ||
| 123 | extern void ext4_es_register_shrinker(struct ext4_sb_info *sbi); | 130 | extern void ext4_es_register_shrinker(struct ext4_sb_info *sbi); |
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index c2ca04e67a4f..0569c745475c 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
| @@ -553,7 +553,7 @@ int ext4_map_blocks(handle_t *handle, struct inode *inode, | |||
| 553 | } | 553 | } |
| 554 | if (retval > 0) { | 554 | if (retval > 0) { |
| 555 | int ret; | 555 | int ret; |
| 556 | unsigned long long status; | 556 | unsigned int status; |
| 557 | 557 | ||
| 558 | if (unlikely(retval != map->m_len)) { | 558 | if (unlikely(retval != map->m_len)) { |
| 559 | ext4_warning(inode->i_sb, | 559 | ext4_warning(inode->i_sb, |
| @@ -653,7 +653,7 @@ found: | |||
| 653 | 653 | ||
| 654 | if (retval > 0) { | 654 | if (retval > 0) { |
| 655 | int ret; | 655 | int ret; |
| 656 | unsigned long long status; | 656 | unsigned int status; |
| 657 | 657 | ||
| 658 | if (unlikely(retval != map->m_len)) { | 658 | if (unlikely(retval != map->m_len)) { |
| 659 | ext4_warning(inode->i_sb, | 659 | ext4_warning(inode->i_sb, |
| @@ -1633,7 +1633,7 @@ add_delayed: | |||
| 1633 | set_buffer_delay(bh); | 1633 | set_buffer_delay(bh); |
| 1634 | } else if (retval > 0) { | 1634 | } else if (retval > 0) { |
| 1635 | int ret; | 1635 | int ret; |
| 1636 | unsigned long long status; | 1636 | unsigned int status; |
| 1637 | 1637 | ||
| 1638 | if (unlikely(retval != map->m_len)) { | 1638 | if (unlikely(retval != map->m_len)) { |
| 1639 | ext4_warning(inode->i_sb, | 1639 | ext4_warning(inode->i_sb, |
diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index 2068db241f22..47a355b251e4 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h | |||
| @@ -64,10 +64,10 @@ struct extent_status; | |||
| 64 | { EXT4_FREE_BLOCKS_NOFREE_LAST_CLUSTER, "LAST_CLUSTER" }) | 64 | { EXT4_FREE_BLOCKS_NOFREE_LAST_CLUSTER, "LAST_CLUSTER" }) |
| 65 | 65 | ||
| 66 | #define show_extent_status(status) __print_flags(status, "", \ | 66 | #define show_extent_status(status) __print_flags(status, "", \ |
| 67 | { (1 << 3), "W" }, \ | 67 | { EXTENT_STATUS_WRITTEN, "W" }, \ |
| 68 | { (1 << 2), "U" }, \ | 68 | { EXTENT_STATUS_UNWRITTEN, "U" }, \ |
| 69 | { (1 << 1), "D" }, \ | 69 | { EXTENT_STATUS_DELAYED, "D" }, \ |
| 70 | { (1 << 0), "H" }) | 70 | { EXTENT_STATUS_HOLE, "H" }) |
| 71 | 71 | ||
| 72 | 72 | ||
| 73 | TRACE_EVENT(ext4_free_inode, | 73 | TRACE_EVENT(ext4_free_inode, |
| @@ -2212,7 +2212,7 @@ TRACE_EVENT(ext4_es_insert_extent, | |||
| 2212 | __entry->lblk = es->es_lblk; | 2212 | __entry->lblk = es->es_lblk; |
| 2213 | __entry->len = es->es_len; | 2213 | __entry->len = es->es_len; |
| 2214 | __entry->pblk = ext4_es_pblock(es); | 2214 | __entry->pblk = ext4_es_pblock(es); |
| 2215 | __entry->status = ext4_es_status(es) >> 60; | 2215 | __entry->status = ext4_es_status(es); |
| 2216 | ), | 2216 | ), |
| 2217 | 2217 | ||
| 2218 | TP_printk("dev %d,%d ino %lu es [%u/%u) mapped %llu status %s", | 2218 | TP_printk("dev %d,%d ino %lu es [%u/%u) mapped %llu status %s", |
| @@ -2289,7 +2289,7 @@ TRACE_EVENT(ext4_es_find_delayed_extent_range_exit, | |||
| 2289 | __entry->lblk = es->es_lblk; | 2289 | __entry->lblk = es->es_lblk; |
| 2290 | __entry->len = es->es_len; | 2290 | __entry->len = es->es_len; |
| 2291 | __entry->pblk = ext4_es_pblock(es); | 2291 | __entry->pblk = ext4_es_pblock(es); |
| 2292 | __entry->status = ext4_es_status(es) >> 60; | 2292 | __entry->status = ext4_es_status(es); |
| 2293 | ), | 2293 | ), |
| 2294 | 2294 | ||
| 2295 | TP_printk("dev %d,%d ino %lu es [%u/%u) mapped %llu status %s", | 2295 | TP_printk("dev %d,%d ino %lu es [%u/%u) mapped %llu status %s", |
| @@ -2343,7 +2343,7 @@ TRACE_EVENT(ext4_es_lookup_extent_exit, | |||
| 2343 | __entry->lblk = es->es_lblk; | 2343 | __entry->lblk = es->es_lblk; |
| 2344 | __entry->len = es->es_len; | 2344 | __entry->len = es->es_len; |
| 2345 | __entry->pblk = ext4_es_pblock(es); | 2345 | __entry->pblk = ext4_es_pblock(es); |
| 2346 | __entry->status = ext4_es_status(es) >> 60; | 2346 | __entry->status = ext4_es_status(es); |
| 2347 | __entry->found = found; | 2347 | __entry->found = found; |
| 2348 | ), | 2348 | ), |
| 2349 | 2349 | ||
