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>
        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.
  *
 
 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);
 
             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,