btrfs: add a btrfs_finish_ordered_extent helper
authorChristoph Hellwig <hch@lst.de>
Wed, 31 May 2023 07:54:06 +0000 (09:54 +0200)
committerDavid Sterba <dsterba@suse.com>
Mon, 19 Jun 2023 11:59:37 +0000 (13:59 +0200)
Add a helper to complete an ordered_extent without first doing a lookup.
The tracepoint cannot use the ordered_extent class as we also want to
print the range.

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
fs/btrfs/ordered-data.h
include/trace/events/btrfs.h

index aa4c203..a629532 100644 (file)
@@ -368,6 +368,25 @@ static void btrfs_queue_ordered_fn(struct btrfs_ordered_extent *ordered)
        btrfs_queue_work(wq, &ordered->work);
 }
 
+bool btrfs_finish_ordered_extent(struct btrfs_ordered_extent *ordered,
+                                struct page *page, u64 file_offset, u64 len,
+                                bool uptodate)
+{
+       struct btrfs_inode *inode = BTRFS_I(ordered->inode);
+       unsigned long flags;
+       bool ret;
+
+       trace_btrfs_finish_ordered_extent(inode, file_offset, len, uptodate);
+
+       spin_lock_irqsave(&inode->ordered_tree.lock, flags);
+       ret = can_finish_ordered_extent(ordered, page, file_offset, len, uptodate);
+       spin_unlock_irqrestore(&inode->ordered_tree.lock, flags);
+
+       if (ret)
+               btrfs_queue_ordered_fn(ordered);
+       return ret;
+}
+
 /*
  * Mark all ordered extents io inside the specified range finished.
  *
index 0bd0f03..173bd5c 100644 (file)
@@ -167,6 +167,9 @@ int btrfs_finish_ordered_io(struct btrfs_ordered_extent *ordered_extent);
 void btrfs_put_ordered_extent(struct btrfs_ordered_extent *entry);
 void btrfs_remove_ordered_extent(struct btrfs_inode *btrfs_inode,
                                struct btrfs_ordered_extent *entry);
+bool btrfs_finish_ordered_extent(struct btrfs_ordered_extent *ordered,
+                                struct page *page, u64 file_offset, u64 len,
+                                bool uptodate);
 void btrfs_mark_ordered_io_finished(struct btrfs_inode *inode,
                                struct page *page, u64 file_offset,
                                u64 num_bytes, bool uptodate);
index 8ea9cea..c6eee9b 100644 (file)
@@ -661,6 +661,35 @@ DEFINE_EVENT(btrfs__ordered_extent, btrfs_ordered_extent_mark_finished,
             TP_ARGS(inode, ordered)
 );
 
+TRACE_EVENT(btrfs_finish_ordered_extent,
+
+       TP_PROTO(const struct btrfs_inode *inode, u64 start, u64 len,
+                bool uptodate),
+
+       TP_ARGS(inode, start, len, uptodate),
+
+       TP_STRUCT__entry_btrfs(
+               __field(        u64,     ino            )
+               __field(        u64,     start          )
+               __field(        u64,     len            )
+               __field(        bool,    uptodate       )
+               __field(        u64,     root_objectid  )
+       ),
+
+       TP_fast_assign_btrfs(inode->root->fs_info,
+               __entry->ino    = btrfs_ino(inode);
+               __entry->start  = start;
+               __entry->len    = len;
+               __entry->uptodate = uptodate;
+               __entry->root_objectid = inode->root->root_key.objectid;
+       ),
+
+       TP_printk_btrfs("root=%llu(%s) ino=%llu start=%llu len=%llu uptodate=%d",
+                 show_root_type(__entry->root_objectid),
+                 __entry->ino, __entry->start,
+                 __entry->len, !!__entry->uptodate)
+);
+
 DECLARE_EVENT_CLASS(btrfs__writepage,
 
        TP_PROTO(const struct page *page, const struct inode *inode,