.. | .. |
---|
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: |
---|