btrfs: factor out a btrfs_queue_ordered_fn helper
authorChristoph Hellwig <hch@lst.de>
Wed, 31 May 2023 07:54:05 +0000 (09:54 +0200)
committerDavid Sterba <dsterba@suse.com>
Mon, 19 Jun 2023 11:59:37 +0000 (13:59 +0200)
Factor out a helper to queue up an ordered_extent completion in a work
queue.  This new helper will later be used complete an ordered_extent
without first doing a lookup.

Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/ordered-data.c

index 2e99fa5d73d929fb981a75bee260f0a4a3198050..aa4c203a16950c64d4f33c56b235df7d1e811516 100644 (file)
@@ -357,6 +357,17 @@ static bool can_finish_ordered_extent(struct btrfs_ordered_extent *ordered,
        return true;
 }
 
+static void btrfs_queue_ordered_fn(struct btrfs_ordered_extent *ordered)
+{
+       struct btrfs_inode *inode = BTRFS_I(ordered->inode);
+       struct btrfs_fs_info *fs_info = inode->root->fs_info;
+       struct btrfs_workqueue *wq = btrfs_is_free_space_inode(inode) ?
+               fs_info->endio_freespace_worker : fs_info->endio_write_workers;
+
+       btrfs_init_work(&ordered->work, finish_ordered_fn, NULL, NULL);
+       btrfs_queue_work(wq, &ordered->work);
+}
+
 /*
  * Mark all ordered extents io inside the specified range finished.
  *
@@ -375,18 +386,11 @@ void btrfs_mark_ordered_io_finished(struct btrfs_inode *inode,
                                    u64 num_bytes, bool uptodate)
 {
        struct btrfs_ordered_inode_tree *tree = &inode->ordered_tree;
-       struct btrfs_fs_info *fs_info = inode->root->fs_info;
-       struct btrfs_workqueue *wq;
        struct rb_node *node;
        struct btrfs_ordered_extent *entry = NULL;
        unsigned long flags;
        u64 cur = file_offset;
 
-       if (btrfs_is_free_space_inode(inode))
-               wq = fs_info->endio_freespace_worker;
-       else
-               wq = fs_info->endio_write_workers;
-
        spin_lock_irqsave(&tree->lock, flags);
        while (cur < file_offset + num_bytes) {
                u64 entry_end;
@@ -441,8 +445,7 @@ void btrfs_mark_ordered_io_finished(struct btrfs_inode *inode,
 
                if (can_finish_ordered_extent(entry, page, cur, len, uptodate)) {
                        spin_unlock_irqrestore(&tree->lock, flags);
-                       btrfs_init_work(&entry->work, finish_ordered_fn, NULL, NULL);
-                       btrfs_queue_work(wq, &entry->work);
+                       btrfs_queue_ordered_fn(entry);
                        spin_lock_irqsave(&tree->lock, flags);
                }
                cur += len;