| .. | .. |
|---|
| 269 | 269 | |
|---|
| 270 | 270 | /* see if the extent has been cached */ |
|---|
| 271 | 271 | es->es_lblk = es->es_len = es->es_pblk = 0; |
|---|
| 272 | | - if (tree->cache_es) { |
|---|
| 273 | | - es1 = tree->cache_es; |
|---|
| 274 | | - if (in_range(lblk, es1->es_lblk, es1->es_len)) { |
|---|
| 275 | | - es_debug("%u cached by [%u/%u) %llu %x\n", |
|---|
| 276 | | - lblk, es1->es_lblk, es1->es_len, |
|---|
| 277 | | - ext4_es_pblock(es1), ext4_es_status(es1)); |
|---|
| 278 | | - goto out; |
|---|
| 279 | | - } |
|---|
| 272 | + es1 = READ_ONCE(tree->cache_es); |
|---|
| 273 | + if (es1 && in_range(lblk, es1->es_lblk, es1->es_len)) { |
|---|
| 274 | + es_debug("%u cached by [%u/%u) %llu %x\n", |
|---|
| 275 | + lblk, es1->es_lblk, es1->es_len, |
|---|
| 276 | + ext4_es_pblock(es1), ext4_es_status(es1)); |
|---|
| 277 | + goto out; |
|---|
| 280 | 278 | } |
|---|
| 281 | 279 | |
|---|
| 282 | 280 | es1 = __es_tree_search(&tree->root, lblk); |
|---|
| .. | .. |
|---|
| 295 | 293 | } |
|---|
| 296 | 294 | |
|---|
| 297 | 295 | if (es1 && matching_fn(es1)) { |
|---|
| 298 | | - tree->cache_es = es1; |
|---|
| 296 | + WRITE_ONCE(tree->cache_es, es1); |
|---|
| 299 | 297 | es->es_lblk = es1->es_lblk; |
|---|
| 300 | 298 | es->es_len = es1->es_len; |
|---|
| 301 | 299 | es->es_pblk = es1->es_pblk; |
|---|
| .. | .. |
|---|
| 934 | 932 | |
|---|
| 935 | 933 | /* find extent in cache firstly */ |
|---|
| 936 | 934 | es->es_lblk = es->es_len = es->es_pblk = 0; |
|---|
| 937 | | - if (tree->cache_es) { |
|---|
| 938 | | - es1 = tree->cache_es; |
|---|
| 939 | | - if (in_range(lblk, es1->es_lblk, es1->es_len)) { |
|---|
| 940 | | - es_debug("%u cached by [%u/%u)\n", |
|---|
| 941 | | - lblk, es1->es_lblk, es1->es_len); |
|---|
| 942 | | - found = 1; |
|---|
| 943 | | - goto out; |
|---|
| 944 | | - } |
|---|
| 935 | + es1 = READ_ONCE(tree->cache_es); |
|---|
| 936 | + if (es1 && in_range(lblk, es1->es_lblk, es1->es_len)) { |
|---|
| 937 | + es_debug("%u cached by [%u/%u)\n", |
|---|
| 938 | + lblk, es1->es_lblk, es1->es_len); |
|---|
| 939 | + found = 1; |
|---|
| 940 | + goto out; |
|---|
| 945 | 941 | } |
|---|
| 946 | 942 | |
|---|
| 947 | 943 | node = tree->root.rb_node; |
|---|
| .. | .. |
|---|
| 1372 | 1368 | if (count_reserved) |
|---|
| 1373 | 1369 | count_rsvd(inode, lblk, orig_es.es_len - len1 - len2, |
|---|
| 1374 | 1370 | &orig_es, &rc); |
|---|
| 1375 | | - goto out; |
|---|
| 1371 | + goto out_get_reserved; |
|---|
| 1376 | 1372 | } |
|---|
| 1377 | 1373 | |
|---|
| 1378 | 1374 | if (len1 > 0) { |
|---|
| .. | .. |
|---|
| 1414 | 1410 | } |
|---|
| 1415 | 1411 | } |
|---|
| 1416 | 1412 | |
|---|
| 1413 | +out_get_reserved: |
|---|
| 1417 | 1414 | if (count_reserved) |
|---|
| 1418 | 1415 | *reserved = get_rsvd(inode, end, es, &rc); |
|---|
| 1419 | 1416 | out: |
|---|