Even though fsverity has traces, debugging issues with varying block sizes could a bit less transparent without read/write traces. Signed-off-by: Andrey Albershteyn <aalbersh@xxxxxxxxxx> --- fs/xfs/xfs_fsverity.c | 8 ++++++++ fs/xfs/xfs_trace.h | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/fs/xfs/xfs_fsverity.c b/fs/xfs/xfs_fsverity.c index dfe7b0bcd97e..4d3fd00237b1 100644 --- a/fs/xfs/xfs_fsverity.c +++ b/fs/xfs/xfs_fsverity.c @@ -70,6 +70,8 @@ xfs_fsverity_get_descriptor( }; int error = 0; + trace_xfs_fsverity_get_descriptor(ip); + /* * The fact that (returned attribute size) == (provided buf_size) is * checked by xfs_attr_copy_value() (returns -ERANGE). No descriptor @@ -267,6 +269,8 @@ xfs_fsverity_read_merkle( */ xfs_fsverity_adjust_read(®ion); + trace_xfs_fsverity_read_merkle(XFS_I(inode), region.pos, region.length); + folio = iomap_read_region(®ion); if (IS_ERR(folio)) return ERR_PTR(-EIO); @@ -297,6 +301,8 @@ xfs_fsverity_write_merkle( .ops = &xfs_buffered_write_iomap_ops, }; + trace_xfs_fsverity_write_merkle(XFS_I(inode), region.pos, region.length); + if (region.pos + region.length > inode->i_sb->s_maxbytes) return -EFBIG; @@ -309,6 +315,8 @@ xfs_fsverity_file_corrupt( loff_t pos, size_t len) { + trace_xfs_fsverity_file_corrupt(XFS_I(inode), pos, len); + xfs_inode_mark_sick(XFS_I(inode), XFS_SICK_INO_DATA); } diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 50034c059e8c..4477d5412e53 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -5979,6 +5979,52 @@ DEFINE_EVENT(xfs_freeblocks_resv_class, name, \ DEFINE_FREEBLOCKS_RESV_EVENT(xfs_freecounter_reserved); DEFINE_FREEBLOCKS_RESV_EVENT(xfs_freecounter_enospc); +TRACE_EVENT(xfs_fsverity_get_descriptor, + TP_PROTO(struct xfs_inode *ip), + TP_ARGS(ip), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_ino_t, ino) + ), + TP_fast_assign( + __entry->dev = VFS_I(ip)->i_sb->s_dev; + __entry->ino = ip->i_ino; + ), + TP_printk("dev %d:%d ino 0x%llx", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->ino) +); + +DECLARE_EVENT_CLASS(xfs_fsverity_class, + TP_PROTO(struct xfs_inode *ip, u64 pos, unsigned int length), + TP_ARGS(ip, pos, length), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_ino_t, ino) + __field(u64, pos) + __field(unsigned int, length) + ), + TP_fast_assign( + __entry->dev = VFS_I(ip)->i_sb->s_dev; + __entry->ino = ip->i_ino; + __entry->pos = pos; + __entry->length = length; + ), + TP_printk("dev %d:%d ino 0x%llx pos %llx length %x", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->ino, + __entry->pos, + __entry->length) +) + +#define DEFINE_FSVERITY_EVENT(name) \ +DEFINE_EVENT(xfs_fsverity_class, name, \ + TP_PROTO(struct xfs_inode *ip, u64 pos, unsigned int length), \ + TP_ARGS(ip, pos, length)) +DEFINE_FSVERITY_EVENT(xfs_fsverity_read_merkle); +DEFINE_FSVERITY_EVENT(xfs_fsverity_write_merkle); +DEFINE_FSVERITY_EVENT(xfs_fsverity_file_corrupt); + #endif /* _TRACE_XFS_H */ #undef TRACE_INCLUDE_PATH -- 2.50.0