hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/fs/ext4/extents_status.c
....@@ -269,14 +269,12 @@
269269
270270 /* see if the extent has been cached */
271271 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;
280278 }
281279
282280 es1 = __es_tree_search(&tree->root, lblk);
....@@ -295,7 +293,7 @@
295293 }
296294
297295 if (es1 && matching_fn(es1)) {
298
- tree->cache_es = es1;
296
+ WRITE_ONCE(tree->cache_es, es1);
299297 es->es_lblk = es1->es_lblk;
300298 es->es_len = es1->es_len;
301299 es->es_pblk = es1->es_pblk;
....@@ -934,14 +932,12 @@
934932
935933 /* find extent in cache firstly */
936934 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;
945941 }
946942
947943 node = tree->root.rb_node;
....@@ -1372,7 +1368,7 @@
13721368 if (count_reserved)
13731369 count_rsvd(inode, lblk, orig_es.es_len - len1 - len2,
13741370 &orig_es, &rc);
1375
- goto out;
1371
+ goto out_get_reserved;
13761372 }
13771373
13781374 if (len1 > 0) {
....@@ -1414,6 +1410,7 @@
14141410 }
14151411 }
14161412
1413
+out_get_reserved:
14171414 if (count_reserved)
14181415 *reserved = get_rsvd(inode, end, es, &rc);
14191416 out: