Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ext4: rename and improbe ext4_es_find_extent()

This commit renames ext4_es_find_extent with ext4_es_find_delayed_extent
and improve this function. First, we split input and output parameter.
Second, this function never return the first block of the next delayed
extent after 'es'.

Signed-off-by: Zheng Liu <wenqing.lz@taobao.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Cc: Jan kara <jack@suse.cz>

authored by

Zheng Liu and committed by
Theodore Ts'o
be401363 fdc0212e

+40 -40
+10 -5
fs/ext4/extents.c
··· 3528 3528 { 3529 3529 struct extent_status es; 3530 3530 3531 - es.es_lblk = lblk_start; 3532 - (void)ext4_es_find_extent(inode, &es); 3531 + ext4_es_find_delayed_extent(inode, lblk_start, &es); 3533 3532 if (es.es_len == 0) 3534 3533 return 0; /* there is no delay extent in this tree */ 3535 3534 else if (es.es_lblk <= lblk_start && ··· 4567 4568 struct ext4_ext_cache *newex) 4568 4569 { 4569 4570 struct extent_status es; 4570 - ext4_lblk_t next_del; 4571 + ext4_lblk_t block, next_del; 4571 4572 4572 - es.es_lblk = newex->ec_block; 4573 - next_del = ext4_es_find_extent(inode, &es); 4573 + ext4_es_find_delayed_extent(inode, newex->ec_block, &es); 4574 4574 4575 4575 if (newex->ec_start == 0) { 4576 4576 /* ··· 4589 4591 4590 4592 newex->ec_len = es.es_lblk + es.es_len - newex->ec_block; 4591 4593 } 4594 + 4595 + block = newex->ec_block + newex->ec_len; 4596 + ext4_es_find_delayed_extent(inode, block, &es); 4597 + if (es.es_len == 0) 4598 + next_del = EXT_MAX_BLOCKS; 4599 + else 4600 + next_del = es.es_lblk; 4592 4601 4593 4602 return next_del; 4594 4603 }
+20 -20
fs/ext4/extents_status.c
··· 229 229 } 230 230 231 231 /* 232 - * ext4_es_find_extent: find the 1st delayed extent covering @es->lblk 232 + * ext4_es_find_delayed_extent: find the 1st delayed extent covering @es->lblk 233 233 * if it exists, otherwise, the next extent after @es->lblk. 234 234 * 235 235 * @inode: the inode which owns delayed extents 236 + * @lblk: the offset where we start to search 236 237 * @es: delayed extent that we found 237 - * 238 - * Returns the first block of the next extent after es, otherwise 239 - * EXT_MAX_BLOCKS if no extent is found. 240 - * Delayed extent is returned via @es. 241 238 */ 242 - ext4_lblk_t ext4_es_find_extent(struct inode *inode, struct extent_status *es) 239 + void ext4_es_find_delayed_extent(struct inode *inode, ext4_lblk_t lblk, 240 + struct extent_status *es) 243 241 { 244 242 struct ext4_es_tree *tree = NULL; 245 243 struct extent_status *es1 = NULL; 246 244 struct rb_node *node; 247 - ext4_lblk_t ret = EXT_MAX_BLOCKS; 248 245 249 - trace_ext4_es_find_extent_enter(inode, es->es_lblk); 246 + BUG_ON(es == NULL); 247 + trace_ext4_es_find_delayed_extent_enter(inode, lblk); 250 248 251 249 read_lock(&EXT4_I(inode)->i_es_lock); 252 250 tree = &EXT4_I(inode)->i_es_tree; 253 251 254 252 /* find extent in cache firstly */ 255 - es->es_len = es->es_pblk = 0; 253 + es->es_lblk = es->es_len = es->es_pblk = 0; 256 254 if (tree->cache_es) { 257 255 es1 = tree->cache_es; 258 - if (in_range(es->es_lblk, es1->es_lblk, es1->es_len)) { 256 + if (in_range(lblk, es1->es_lblk, es1->es_len)) { 259 257 es_debug("%u cached by [%u/%u) %llu %llx\n", 260 - es->es_lblk, es1->es_lblk, es1->es_len, 258 + lblk, es1->es_lblk, es1->es_len, 261 259 ext4_es_pblock(es1), ext4_es_status(es1)); 262 260 goto out; 263 261 } 264 262 } 265 263 266 - es1 = __es_tree_search(&tree->root, es->es_lblk); 264 + es1 = __es_tree_search(&tree->root, lblk); 267 265 268 266 out: 269 - if (es1) { 267 + if (es1 && !ext4_es_is_delayed(es1)) { 268 + while ((node = rb_next(&es1->rb_node)) != NULL) { 269 + es1 = rb_entry(node, struct extent_status, rb_node); 270 + if (ext4_es_is_delayed(es1)) 271 + break; 272 + } 273 + } 274 + 275 + if (es1 && ext4_es_is_delayed(es1)) { 270 276 tree->cache_es = es1; 271 277 es->es_lblk = es1->es_lblk; 272 278 es->es_len = es1->es_len; 273 279 es->es_pblk = es1->es_pblk; 274 - node = rb_next(&es1->rb_node); 275 - if (node) { 276 - es1 = rb_entry(node, struct extent_status, rb_node); 277 - ret = es1->es_lblk; 278 - } 279 280 } 280 281 281 282 read_unlock(&EXT4_I(inode)->i_es_lock); 282 283 283 - trace_ext4_es_find_extent_exit(inode, es, ret); 284 - return ret; 284 + trace_ext4_es_find_delayed_extent_exit(inode, es); 285 285 } 286 286 287 287 static struct extent_status *
+2 -2
fs/ext4/extents_status.h
··· 51 51 unsigned long long status); 52 52 extern int ext4_es_remove_extent(struct inode *inode, ext4_lblk_t lblk, 53 53 ext4_lblk_t len); 54 - extern ext4_lblk_t ext4_es_find_extent(struct inode *inode, 55 - struct extent_status *es); 54 + extern void ext4_es_find_delayed_extent(struct inode *inode, ext4_lblk_t lblk, 55 + struct extent_status *es); 56 56 57 57 static inline int ext4_es_is_written(struct extent_status *es) 58 58 {
+2 -4
fs/ext4/file.c
··· 464 464 * If there is a delay extent at this offset, 465 465 * it will be as a data. 466 466 */ 467 - es.es_lblk = last; 468 - (void)ext4_es_find_extent(inode, &es); 467 + ext4_es_find_delayed_extent(inode, last, &es); 469 468 if (es.es_len != 0 && in_range(last, es.es_lblk, es.es_len)) { 470 469 if (last != start) 471 470 dataoff = last << blkbits; ··· 547 548 * If there is a delay extent at this offset, 548 549 * we will skip this extent. 549 550 */ 550 - es.es_lblk = last; 551 - (void)ext4_es_find_extent(inode, &es); 551 + ext4_es_find_delayed_extent(inode, last, &es); 552 552 if (es.es_len != 0 && in_range(last, es.es_lblk, es.es_len)) { 553 553 last = es.es_lblk + es.es_len; 554 554 holeoff = last << blkbits;
+6 -9
include/trace/events/ext4.h
··· 2147 2147 __entry->lblk, __entry->len) 2148 2148 ); 2149 2149 2150 - TRACE_EVENT(ext4_es_find_extent_enter, 2150 + TRACE_EVENT(ext4_es_find_delayed_extent_enter, 2151 2151 TP_PROTO(struct inode *inode, ext4_lblk_t lblk), 2152 2152 2153 2153 TP_ARGS(inode, lblk), ··· 2169 2169 (unsigned long) __entry->ino, __entry->lblk) 2170 2170 ); 2171 2171 2172 - TRACE_EVENT(ext4_es_find_extent_exit, 2173 - TP_PROTO(struct inode *inode, struct extent_status *es, 2174 - ext4_lblk_t ret), 2172 + TRACE_EVENT(ext4_es_find_delayed_extent_exit, 2173 + TP_PROTO(struct inode *inode, struct extent_status *es), 2175 2174 2176 - TP_ARGS(inode, es, ret), 2175 + TP_ARGS(inode, es), 2177 2176 2178 2177 TP_STRUCT__entry( 2179 2178 __field( dev_t, dev ) ··· 2181 2182 __field( ext4_lblk_t, len ) 2182 2183 __field( ext4_fsblk_t, pblk ) 2183 2184 __field( unsigned long long, status ) 2184 - __field( ext4_lblk_t, ret ) 2185 2185 ), 2186 2186 2187 2187 TP_fast_assign( ··· 2190 2192 __entry->len = es->es_len; 2191 2193 __entry->pblk = ext4_es_pblock(es); 2192 2194 __entry->status = ext4_es_status(es); 2193 - __entry->ret = ret; 2194 2195 ), 2195 2196 2196 - TP_printk("dev %d,%d ino %lu es [%u/%u) mapped %llu status %llx ret %u", 2197 + TP_printk("dev %d,%d ino %lu es [%u/%u) mapped %llu status %llx", 2197 2198 MAJOR(__entry->dev), MINOR(__entry->dev), 2198 2199 (unsigned long) __entry->ino, 2199 2200 __entry->lblk, __entry->len, 2200 - __entry->pblk, __entry->status, __entry->ret) 2201 + __entry->pblk, __entry->status) 2201 2202 ); 2202 2203 2203 2204 #endif /* _TRACE_EXT4_H */