Skip to content

Commit 20ae694

Browse files
adam900710kdave
authored andcommitted
btrfs: relax btrfs_inode::ordered_tree_lock
We used IRQ version of spinlock for ordered_tree_lock, as btrfs_finish_ordered_extent() can be called in end_bbio_data_write() which was in IRQ context. However since we're moving all the btrfs_bio::end_io() calls into task context, there is no more need to support IRQ context thus we can relax to regular spin_lock()/spin_unlock() for btrfs_inode::ordered_tree_lock. Signed-off-by: Qu Wenruo <[email protected]> Signed-off-by: David Sterba <[email protected]>
1 parent 3e71f09 commit 20ae694

File tree

4 files changed

+31
-39
lines changed

4 files changed

+31
-39
lines changed

fs/btrfs/extent_io.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1726,7 +1726,6 @@ static noinline_for_stack int extent_writepage_io(struct btrfs_inode *inode,
17261726

17271727
if (cur >= i_size) {
17281728
struct btrfs_ordered_extent *ordered;
1729-
unsigned long flags;
17301729

17311730
ordered = btrfs_lookup_first_ordered_range(inode, cur,
17321731
folio_end - cur);
@@ -1735,11 +1734,11 @@ static noinline_for_stack int extent_writepage_io(struct btrfs_inode *inode,
17351734
* there must be an ordered extent.
17361735
*/
17371736
ASSERT(ordered != NULL);
1738-
spin_lock_irqsave(&inode->ordered_tree_lock, flags);
1737+
spin_lock(&inode->ordered_tree_lock);
17391738
set_bit(BTRFS_ORDERED_TRUNCATED, &ordered->flags);
17401739
ordered->truncated_len = min(ordered->truncated_len,
17411740
cur - ordered->file_offset);
1742-
spin_unlock_irqrestore(&inode->ordered_tree_lock, flags);
1741+
spin_unlock(&inode->ordered_tree_lock);
17431742
btrfs_put_ordered_extent(ordered);
17441743

17451744
btrfs_mark_ordered_io_finished(inode, folio, cur,

fs/btrfs/inode.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7587,11 +7587,11 @@ static void btrfs_invalidate_folio(struct folio *folio, size_t offset,
75877587
EXTENT_LOCKED | EXTENT_DO_ACCOUNTING |
75887588
EXTENT_DEFRAG, &cached_state);
75897589

7590-
spin_lock_irq(&inode->ordered_tree_lock);
7590+
spin_lock(&inode->ordered_tree_lock);
75917591
set_bit(BTRFS_ORDERED_TRUNCATED, &ordered->flags);
75927592
ordered->truncated_len = min(ordered->truncated_len,
75937593
cur - ordered->file_offset);
7594-
spin_unlock_irq(&inode->ordered_tree_lock);
7594+
spin_unlock(&inode->ordered_tree_lock);
75957595

75967596
/*
75977597
* If the ordered extent has finished, we're safe to delete all

fs/btrfs/ordered-data.c

Lines changed: 25 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -237,14 +237,14 @@ static void insert_ordered_extent(struct btrfs_ordered_extent *entry)
237237
/* One ref for the tree. */
238238
refcount_inc(&entry->refs);
239239

240-
spin_lock_irq(&inode->ordered_tree_lock);
240+
spin_lock(&inode->ordered_tree_lock);
241241
node = tree_insert(&inode->ordered_tree, entry->file_offset,
242242
&entry->rb_node);
243243
if (unlikely(node))
244244
btrfs_panic(fs_info, -EEXIST,
245245
"inconsistency in ordered tree at offset %llu",
246246
entry->file_offset);
247-
spin_unlock_irq(&inode->ordered_tree_lock);
247+
spin_unlock(&inode->ordered_tree_lock);
248248

249249
spin_lock(&root->ordered_extent_lock);
250250
list_add_tail(&entry->root_extent_list,
@@ -328,9 +328,9 @@ void btrfs_add_ordered_sum(struct btrfs_ordered_extent *entry,
328328
{
329329
struct btrfs_inode *inode = entry->inode;
330330

331-
spin_lock_irq(&inode->ordered_tree_lock);
331+
spin_lock(&inode->ordered_tree_lock);
332332
list_add_tail(&sum->list, &entry->list);
333-
spin_unlock_irq(&inode->ordered_tree_lock);
333+
spin_unlock(&inode->ordered_tree_lock);
334334
}
335335

336336
void btrfs_mark_ordered_extent_error(struct btrfs_ordered_extent *ordered)
@@ -417,15 +417,14 @@ void btrfs_finish_ordered_extent(struct btrfs_ordered_extent *ordered,
417417
bool uptodate)
418418
{
419419
struct btrfs_inode *inode = ordered->inode;
420-
unsigned long flags;
421420
bool ret;
422421

423422
trace_btrfs_finish_ordered_extent(inode, file_offset, len, uptodate);
424423

425-
spin_lock_irqsave(&inode->ordered_tree_lock, flags);
424+
spin_lock(&inode->ordered_tree_lock);
426425
ret = can_finish_ordered_extent(ordered, folio, file_offset, len,
427426
uptodate);
428-
spin_unlock_irqrestore(&inode->ordered_tree_lock, flags);
427+
spin_unlock(&inode->ordered_tree_lock);
429428

430429
/*
431430
* If this is a COW write it means we created new extent maps for the
@@ -481,13 +480,12 @@ void btrfs_mark_ordered_io_finished(struct btrfs_inode *inode,
481480
{
482481
struct rb_node *node;
483482
struct btrfs_ordered_extent *entry = NULL;
484-
unsigned long flags;
485483
u64 cur = file_offset;
486484
const u64 end = file_offset + num_bytes;
487485

488486
trace_btrfs_writepage_end_io_hook(inode, file_offset, end - 1, uptodate);
489487

490-
spin_lock_irqsave(&inode->ordered_tree_lock, flags);
488+
spin_lock(&inode->ordered_tree_lock);
491489
while (cur < end) {
492490
u64 entry_end;
493491
u64 this_end;
@@ -539,13 +537,13 @@ void btrfs_mark_ordered_io_finished(struct btrfs_inode *inode,
539537
ASSERT(len < U32_MAX);
540538

541539
if (can_finish_ordered_extent(entry, folio, cur, len, uptodate)) {
542-
spin_unlock_irqrestore(&inode->ordered_tree_lock, flags);
540+
spin_unlock(&inode->ordered_tree_lock);
543541
btrfs_queue_ordered_fn(entry);
544-
spin_lock_irqsave(&inode->ordered_tree_lock, flags);
542+
spin_lock(&inode->ordered_tree_lock);
545543
}
546544
cur += len;
547545
}
548-
spin_unlock_irqrestore(&inode->ordered_tree_lock, flags);
546+
spin_unlock(&inode->ordered_tree_lock);
549547
}
550548

551549
/*
@@ -571,10 +569,9 @@ bool btrfs_dec_test_ordered_pending(struct btrfs_inode *inode,
571569
{
572570
struct rb_node *node;
573571
struct btrfs_ordered_extent *entry = NULL;
574-
unsigned long flags;
575572
bool finished = false;
576573

577-
spin_lock_irqsave(&inode->ordered_tree_lock, flags);
574+
spin_lock(&inode->ordered_tree_lock);
578575
if (cached && *cached) {
579576
entry = *cached;
580577
goto have_entry;
@@ -611,7 +608,7 @@ bool btrfs_dec_test_ordered_pending(struct btrfs_inode *inode,
611608
refcount_inc(&entry->refs);
612609
trace_btrfs_ordered_extent_dec_test_pending(inode, entry);
613610
}
614-
spin_unlock_irqrestore(&inode->ordered_tree_lock, flags);
611+
spin_unlock(&inode->ordered_tree_lock);
615612
return finished;
616613
}
617614

@@ -676,15 +673,15 @@ void btrfs_remove_ordered_extent(struct btrfs_inode *btrfs_inode,
676673
percpu_counter_add_batch(&fs_info->ordered_bytes, -entry->num_bytes,
677674
fs_info->delalloc_batch);
678675

679-
spin_lock_irq(&btrfs_inode->ordered_tree_lock);
676+
spin_lock(&btrfs_inode->ordered_tree_lock);
680677
node = &entry->rb_node;
681678
rb_erase(node, &btrfs_inode->ordered_tree);
682679
RB_CLEAR_NODE(node);
683680
if (btrfs_inode->ordered_tree_last == node)
684681
btrfs_inode->ordered_tree_last = NULL;
685682
set_bit(BTRFS_ORDERED_COMPLETE, &entry->flags);
686683
pending = test_and_clear_bit(BTRFS_ORDERED_PENDING, &entry->flags);
687-
spin_unlock_irq(&btrfs_inode->ordered_tree_lock);
684+
spin_unlock(&btrfs_inode->ordered_tree_lock);
688685

689686
/*
690687
* The current running transaction is waiting on us, we need to let it
@@ -969,9 +966,8 @@ struct btrfs_ordered_extent *btrfs_lookup_ordered_extent(struct btrfs_inode *ino
969966
{
970967
struct rb_node *node;
971968
struct btrfs_ordered_extent *entry = NULL;
972-
unsigned long flags;
973969

974-
spin_lock_irqsave(&inode->ordered_tree_lock, flags);
970+
spin_lock(&inode->ordered_tree_lock);
975971
node = ordered_tree_search(inode, file_offset);
976972
if (!node)
977973
goto out;
@@ -984,7 +980,7 @@ struct btrfs_ordered_extent *btrfs_lookup_ordered_extent(struct btrfs_inode *ino
984980
trace_btrfs_ordered_extent_lookup(inode, entry);
985981
}
986982
out:
987-
spin_unlock_irqrestore(&inode->ordered_tree_lock, flags);
983+
spin_unlock(&inode->ordered_tree_lock);
988984
return entry;
989985
}
990986

@@ -997,7 +993,7 @@ struct btrfs_ordered_extent *btrfs_lookup_ordered_range(
997993
struct rb_node *node;
998994
struct btrfs_ordered_extent *entry = NULL;
999995

1000-
spin_lock_irq(&inode->ordered_tree_lock);
996+
spin_lock(&inode->ordered_tree_lock);
1001997
node = ordered_tree_search(inode, file_offset);
1002998
if (!node) {
1003999
node = ordered_tree_search(inode, file_offset + len);
@@ -1024,7 +1020,7 @@ struct btrfs_ordered_extent *btrfs_lookup_ordered_range(
10241020
refcount_inc(&entry->refs);
10251021
trace_btrfs_ordered_extent_lookup_range(inode, entry);
10261022
}
1027-
spin_unlock_irq(&inode->ordered_tree_lock);
1023+
spin_unlock(&inode->ordered_tree_lock);
10281024
return entry;
10291025
}
10301026

@@ -1039,7 +1035,7 @@ void btrfs_get_ordered_extents_for_logging(struct btrfs_inode *inode,
10391035

10401036
btrfs_assert_inode_locked(inode);
10411037

1042-
spin_lock_irq(&inode->ordered_tree_lock);
1038+
spin_lock(&inode->ordered_tree_lock);
10431039
for (n = rb_first(&inode->ordered_tree); n; n = rb_next(n)) {
10441040
struct btrfs_ordered_extent *ordered;
10451041

@@ -1053,7 +1049,7 @@ void btrfs_get_ordered_extents_for_logging(struct btrfs_inode *inode,
10531049
refcount_inc(&ordered->refs);
10541050
trace_btrfs_ordered_extent_lookup_for_logging(inode, ordered);
10551051
}
1056-
spin_unlock_irq(&inode->ordered_tree_lock);
1052+
spin_unlock(&inode->ordered_tree_lock);
10571053
}
10581054

10591055
/*
@@ -1066,7 +1062,7 @@ btrfs_lookup_first_ordered_extent(struct btrfs_inode *inode, u64 file_offset)
10661062
struct rb_node *node;
10671063
struct btrfs_ordered_extent *entry = NULL;
10681064

1069-
spin_lock_irq(&inode->ordered_tree_lock);
1065+
spin_lock(&inode->ordered_tree_lock);
10701066
node = ordered_tree_search(inode, file_offset);
10711067
if (!node)
10721068
goto out;
@@ -1075,7 +1071,7 @@ btrfs_lookup_first_ordered_extent(struct btrfs_inode *inode, u64 file_offset)
10751071
refcount_inc(&entry->refs);
10761072
trace_btrfs_ordered_extent_lookup_first(inode, entry);
10771073
out:
1078-
spin_unlock_irq(&inode->ordered_tree_lock);
1074+
spin_unlock(&inode->ordered_tree_lock);
10791075
return entry;
10801076
}
10811077

@@ -1096,9 +1092,8 @@ struct btrfs_ordered_extent *btrfs_lookup_first_ordered_range(
10961092
struct rb_node *prev;
10971093
struct rb_node *next;
10981094
struct btrfs_ordered_extent *entry = NULL;
1099-
unsigned long flags;
11001095

1101-
spin_lock_irqsave(&inode->ordered_tree_lock, flags);
1096+
spin_lock(&inode->ordered_tree_lock);
11021097
node = inode->ordered_tree.rb_node;
11031098
/*
11041099
* Here we don't want to use tree_search() which will use tree->last
@@ -1153,7 +1148,7 @@ struct btrfs_ordered_extent *btrfs_lookup_first_ordered_range(
11531148
trace_btrfs_ordered_extent_lookup_first_range(inode, entry);
11541149
}
11551150

1156-
spin_unlock_irqrestore(&inode->ordered_tree_lock, flags);
1151+
spin_unlock(&inode->ordered_tree_lock);
11571152
return entry;
11581153
}
11591154

@@ -1285,9 +1280,7 @@ struct btrfs_ordered_extent *btrfs_split_ordered_extent(
12851280
/*
12861281
* Take the root's ordered_extent_lock to avoid a race with
12871282
* btrfs_wait_ordered_extents() when updating the disk_bytenr and
1288-
* disk_num_bytes fields of the ordered extent below. And we disable
1289-
* IRQs because the inode's ordered_tree_lock is used in IRQ context
1290-
* elsewhere.
1283+
* disk_num_bytes fields of the ordered extent below.
12911284
*
12921285
* There's no concern about a previous caller of
12931286
* btrfs_wait_ordered_extents() getting the trimmed ordered extent

fs/btrfs/tree-log.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5406,12 +5406,12 @@ static int btrfs_log_changed_extents(struct btrfs_trans_handle *trans,
54065406
set_bit(BTRFS_ORDERED_LOGGED, &ordered->flags);
54075407

54085408
if (!test_bit(BTRFS_ORDERED_COMPLETE, &ordered->flags)) {
5409-
spin_lock_irq(&inode->ordered_tree_lock);
5409+
spin_lock(&inode->ordered_tree_lock);
54105410
if (!test_bit(BTRFS_ORDERED_COMPLETE, &ordered->flags)) {
54115411
set_bit(BTRFS_ORDERED_PENDING, &ordered->flags);
54125412
atomic_inc(&trans->transaction->pending_ordered);
54135413
}
5414-
spin_unlock_irq(&inode->ordered_tree_lock);
5414+
spin_unlock(&inode->ordered_tree_lock);
54155415
}
54165416
btrfs_put_ordered_extent(ordered);
54175417
}

0 commit comments

Comments
 (0)