diff options
author | Theodore Ts'o <tytso@mit.edu> | 2014-02-19 20:15:15 -0500 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2014-02-19 20:15:15 -0500 |
commit | 9a6633b1a3603ccdffec669033616f9ebb35a988 (patch) | |
tree | 48f84c6ddaf415831eee8245033af51454859738 | |
parent | ce37c42919608e96ade3748fe23c3062a0a966c5 (diff) |
ext4: add ext4_es_store_pblock_status()
Avoid false positives by static code analysis tools such as sparse and
coverity caused by the fact that we set the physical block, and then
the status in the extent_status structure. It is also more efficient
to set both of these values at once.
Addresses-Coverity-Id: #989077
Addresses-Coverity-Id: #989078
Addresses-Coverity-Id: #1080722
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 | 14 | ||||
-rw-r--r-- | fs/ext4/extents_status.h | 9 |
2 files changed, 15 insertions, 8 deletions
diff --git a/fs/ext4/extents_status.c b/fs/ext4/extents_status.c index 3981ff783950..a900004a63e1 100644 --- a/fs/ext4/extents_status.c +++ b/fs/ext4/extents_status.c | |||
@@ -658,8 +658,7 @@ int ext4_es_insert_extent(struct inode *inode, ext4_lblk_t lblk, | |||
658 | 658 | ||
659 | newes.es_lblk = lblk; | 659 | newes.es_lblk = lblk; |
660 | newes.es_len = len; | 660 | newes.es_len = len; |
661 | ext4_es_store_pblock(&newes, pblk); | 661 | ext4_es_store_pblock_status(&newes, pblk, status); |
662 | ext4_es_store_status(&newes, status); | ||
663 | trace_ext4_es_insert_extent(inode, &newes); | 662 | trace_ext4_es_insert_extent(inode, &newes); |
664 | 663 | ||
665 | ext4_es_insert_extent_check(inode, &newes); | 664 | ext4_es_insert_extent_check(inode, &newes); |
@@ -699,8 +698,7 @@ void ext4_es_cache_extent(struct inode *inode, ext4_lblk_t lblk, | |||
699 | 698 | ||
700 | newes.es_lblk = lblk; | 699 | newes.es_lblk = lblk; |
701 | newes.es_len = len; | 700 | newes.es_len = len; |
702 | ext4_es_store_pblock(&newes, pblk); | 701 | ext4_es_store_pblock_status(&newes, pblk, status); |
703 | ext4_es_store_status(&newes, status); | ||
704 | trace_ext4_es_cache_extent(inode, &newes); | 702 | trace_ext4_es_cache_extent(inode, &newes); |
705 | 703 | ||
706 | if (!len) | 704 | if (!len) |
@@ -812,13 +810,13 @@ retry: | |||
812 | 810 | ||
813 | newes.es_lblk = end + 1; | 811 | newes.es_lblk = end + 1; |
814 | newes.es_len = len2; | 812 | newes.es_len = len2; |
813 | block = 0x7FDEADBEEF; | ||
815 | if (ext4_es_is_written(&orig_es) || | 814 | if (ext4_es_is_written(&orig_es) || |
816 | ext4_es_is_unwritten(&orig_es)) { | 815 | ext4_es_is_unwritten(&orig_es)) |
817 | block = ext4_es_pblock(&orig_es) + | 816 | block = ext4_es_pblock(&orig_es) + |
818 | orig_es.es_len - len2; | 817 | orig_es.es_len - len2; |
819 | ext4_es_store_pblock(&newes, block); | 818 | ext4_es_store_pblock_status(&newes, block, |
820 | } | 819 | ext4_es_status(&orig_es)); |
821 | ext4_es_store_status(&newes, ext4_es_status(&orig_es)); | ||
822 | err = __es_insert_extent(inode, &newes); | 820 | err = __es_insert_extent(inode, &newes); |
823 | if (err) { | 821 | if (err) { |
824 | es->es_lblk = orig_es.es_lblk; | 822 | es->es_lblk = orig_es.es_lblk; |
diff --git a/fs/ext4/extents_status.h b/fs/ext4/extents_status.h index 167f4ab8ecc3..f1b62a419920 100644 --- a/fs/ext4/extents_status.h +++ b/fs/ext4/extents_status.h | |||
@@ -129,6 +129,15 @@ static inline void ext4_es_store_status(struct extent_status *es, | |||
129 | (es->es_pblk & ~ES_MASK)); | 129 | (es->es_pblk & ~ES_MASK)); |
130 | } | 130 | } |
131 | 131 | ||
132 | static inline void ext4_es_store_pblock_status(struct extent_status *es, | ||
133 | ext4_fsblk_t pb, | ||
134 | unsigned int status) | ||
135 | { | ||
136 | es->es_pblk = (((ext4_fsblk_t) | ||
137 | (status & EXTENT_STATUS_FLAGS) << ES_SHIFT) | | ||
138 | (pb & ~ES_MASK)); | ||
139 | } | ||
140 | |||
132 | extern void ext4_es_register_shrinker(struct ext4_sb_info *sbi); | 141 | extern void ext4_es_register_shrinker(struct ext4_sb_info *sbi); |
133 | extern void ext4_es_unregister_shrinker(struct ext4_sb_info *sbi); | 142 | extern void ext4_es_unregister_shrinker(struct ext4_sb_info *sbi); |
134 | extern void ext4_es_lru_add(struct inode *inode); | 143 | extern void ext4_es_lru_add(struct inode *inode); |