f008b1d6e1
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEqG5UsNXhtOCrfGQP+7dXa6fLC2sFAmI1HOwACgkQ+7dXa6fL C2u9mA/+LUdXHqlvET/PAtFTg75bUPeOFGLnuDnYl1Ng2FCKMSodAohpbVtENxsK E/gTVS7uiVZFQgC+YmNA00z6eIQkAaDVyvKyEcUbKREBbUgONfJ/HLeaK/NvVKxx TY5gx/POdG6yHRQXL6JGBqSJUB8bZrGKwnJm8ebzeKOji9n7GSJBYiMlYBA7EAhs Aut/P7Y39ISHLw3y+y5czBeRoubljmTyznbP20xUZEzrRwhTpNwpJVzBGUZU635T 93Sqcp//0U5LIdn6Pg6DUGHBMBTNDNJChb21ZoBusF/HHswXsOOnf/mcRUBSJUTI M1WSpNLk8PRBgajMdIymQpGU1sCZZzJ3krrSA3RcXdN6GPHwZg8kKjoroHsLDL6l igPbDSMJ5wfiwA2A2gXbY1CkAl3ik5ccb7ZqhTwS0WBk0vOnHmAsE9cs/bBo7Xii GTiWXEFOgtJiXANPMS2P9DiOS3ZQNf+wxotCYdkGPOXuX9wnIo1Kmy8XfujQ1bXf pJsEZKfeyROKrzyKWgqLI64/Kg5xNueoFQZfDpOlZYzF1uDstynADPUt0eQD706q jcuKaXLN3rn5gSPun5mWOYbRtXVgOLdFL/7zptMVJwFKBFguQENhjG4UMNZcjkVA 3Mr0kGocsgoCSk1oDBkFlrw1wIsXxWbkRBL1Pww6kovivuGUwoo= =j0yx -----END PGP SIGNATURE----- Merge tag 'netfs-prep-20220318' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs Pull netfs updates from David Howells: "Netfs prep for write helpers. Having had a go at implementing write helpers and content encryption support in netfslib, it seems that the netfs_read_{,sub}request structs and the equivalent write request structs were almost the same and so should be merged, thereby requiring only one set of alloc/get/put functions and a common set of tracepoints. Merging the structs also has the advantage that if a bounce buffer is added to the request struct, a read operation can be performed to fill the bounce buffer, the contents of the buffer can be modified and then a write operation can be performed on it to send the data wherever it needs to go using the same request structure all the way through. The I/O handlers would then transparently perform any required crypto. This should make it easier to perform RMW cycles if needed. The potentially common functions and structs, however, by their names all proclaim themselves to be associated with the read side of things. The bulk of these changes alter this in the following ways: - Rename struct netfs_read_{,sub}request to netfs_io_{,sub}request. - Rename some enums, members and flags to make them more appropriate. - Adjust some comments to match. - Drop "read"/"rreq" from the names of common functions. For instance, netfs_get_read_request() becomes netfs_get_request(). - The ->init_rreq() and ->issue_op() methods become ->init_request() and ->issue_read(). I've kept the latter as a read-specific function and in another branch added an ->issue_write() method. The driver source is then reorganised into a number of files: fs/netfs/buffered_read.c Create read reqs to the pagecache fs/netfs/io.c Dispatchers for read and write reqs fs/netfs/main.c Some general miscellaneous bits fs/netfs/objects.c Alloc, get and put functions fs/netfs/stats.c Optional procfs statistics. and future development can be fitted into this scheme, e.g.: fs/netfs/buffered_write.c Modify the pagecache fs/netfs/buffered_flush.c Writeback from the pagecache fs/netfs/direct_read.c DIO read support fs/netfs/direct_write.c DIO write support fs/netfs/unbuffered_write.c Write modifications directly back Beyond the above changes, there are also some changes that affect how things work: - Make fscache_end_operation() generally available. - In the netfs tracing header, generate enums from the symbol -> string mapping tables rather than manually coding them. - Add a struct for filesystems that uses netfslib to put into their inode wrapper structs to hold extra state that netfslib is interested in, such as the fscache cookie. This allows netfslib functions to be set in filesystem operation tables and jumped to directly without having to have a filesystem wrapper. - Add a member to the struct added above to track the remote inode length as that may differ if local modifications are buffered. We may need to supply an appropriate EOF pointer when storing data (in AFS for example). - Pass extra information to netfs_alloc_request() so that the ->init_request() hook can access it and retain information to indicate the origin of the operation. - Make the ->init_request() hook return an error, thereby allowing a filesystem that isn't allowed to cache an inode (ceph or cifs, for example) to skip readahead. - Switch to using refcount_t for subrequests and add tracepoints to log refcount changes for the request and subrequest structs. - Add a function to consolidate dispatching a read request. Similar code is used in three places and another couple are likely to be added in the future" Link: https://lore.kernel.org/all/2639515.1648483225@warthog.procyon.org.uk/ * tag 'netfs-prep-20220318' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs: afs: Maintain netfs_i_context::remote_i_size netfs: Keep track of the actual remote file size netfs: Split some core bits out into their own file netfs: Split fs/netfs/read_helper.c netfs: Rename read_helper.c to io.c netfs: Prepare to split read_helper.c netfs: Add a function to consolidate beginning a read netfs: Add a netfs inode context ceph: Make ceph_init_request() check caps on readahead netfs: Change ->init_request() to return an error code netfs: Refactor arguments for netfs_alloc_read_request netfs: Adjust the netfs_failure tracepoint to indicate non-subreq lines netfs: Trace refcounting on the netfs_io_subrequest struct netfs: Trace refcounting on the netfs_io_request struct netfs: Adjust the netfs_rreq tracepoint slightly netfs: Split netfs_io_* object handling out netfs: Finish off rename of netfs_read_request to netfs_io_request netfs: Rename netfs_read_*request to netfs_io_*request netfs: Generate enums from trace symbol mapping lists fscache: export fscache_end_operation()
678 lines
19 KiB
C
678 lines
19 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/* CacheFiles tracepoints
|
|
*
|
|
* Copyright (C) 2021 Red Hat, Inc. All Rights Reserved.
|
|
* Written by David Howells (dhowells@redhat.com)
|
|
*/
|
|
#undef TRACE_SYSTEM
|
|
#define TRACE_SYSTEM cachefiles
|
|
|
|
#if !defined(_TRACE_CACHEFILES_H) || defined(TRACE_HEADER_MULTI_READ)
|
|
#define _TRACE_CACHEFILES_H
|
|
|
|
#include <linux/tracepoint.h>
|
|
|
|
/*
|
|
* Define enums for tracing information.
|
|
*/
|
|
#ifndef __CACHEFILES_DECLARE_TRACE_ENUMS_ONCE_ONLY
|
|
#define __CACHEFILES_DECLARE_TRACE_ENUMS_ONCE_ONLY
|
|
|
|
enum cachefiles_obj_ref_trace {
|
|
cachefiles_obj_get_ioreq,
|
|
cachefiles_obj_new,
|
|
cachefiles_obj_put_alloc_fail,
|
|
cachefiles_obj_put_detach,
|
|
cachefiles_obj_put_ioreq,
|
|
cachefiles_obj_see_clean_commit,
|
|
cachefiles_obj_see_clean_delete,
|
|
cachefiles_obj_see_clean_drop_tmp,
|
|
cachefiles_obj_see_lookup_cookie,
|
|
cachefiles_obj_see_lookup_failed,
|
|
cachefiles_obj_see_withdraw_cookie,
|
|
cachefiles_obj_see_withdrawal,
|
|
};
|
|
|
|
enum fscache_why_object_killed {
|
|
FSCACHE_OBJECT_IS_STALE,
|
|
FSCACHE_OBJECT_IS_WEIRD,
|
|
FSCACHE_OBJECT_INVALIDATED,
|
|
FSCACHE_OBJECT_NO_SPACE,
|
|
FSCACHE_OBJECT_WAS_RETIRED,
|
|
FSCACHE_OBJECT_WAS_CULLED,
|
|
FSCACHE_VOLUME_IS_WEIRD,
|
|
};
|
|
|
|
enum cachefiles_coherency_trace {
|
|
cachefiles_coherency_check_aux,
|
|
cachefiles_coherency_check_content,
|
|
cachefiles_coherency_check_dirty,
|
|
cachefiles_coherency_check_len,
|
|
cachefiles_coherency_check_objsize,
|
|
cachefiles_coherency_check_ok,
|
|
cachefiles_coherency_check_type,
|
|
cachefiles_coherency_check_xattr,
|
|
cachefiles_coherency_set_fail,
|
|
cachefiles_coherency_set_ok,
|
|
cachefiles_coherency_vol_check_cmp,
|
|
cachefiles_coherency_vol_check_ok,
|
|
cachefiles_coherency_vol_check_resv,
|
|
cachefiles_coherency_vol_check_xattr,
|
|
cachefiles_coherency_vol_set_fail,
|
|
cachefiles_coherency_vol_set_ok,
|
|
};
|
|
|
|
enum cachefiles_trunc_trace {
|
|
cachefiles_trunc_dio_adjust,
|
|
cachefiles_trunc_expand_tmpfile,
|
|
cachefiles_trunc_shrink,
|
|
};
|
|
|
|
enum cachefiles_prepare_read_trace {
|
|
cachefiles_trace_read_after_eof,
|
|
cachefiles_trace_read_found_hole,
|
|
cachefiles_trace_read_found_part,
|
|
cachefiles_trace_read_have_data,
|
|
cachefiles_trace_read_no_data,
|
|
cachefiles_trace_read_no_file,
|
|
cachefiles_trace_read_seek_error,
|
|
cachefiles_trace_read_seek_nxio,
|
|
};
|
|
|
|
enum cachefiles_error_trace {
|
|
cachefiles_trace_fallocate_error,
|
|
cachefiles_trace_getxattr_error,
|
|
cachefiles_trace_link_error,
|
|
cachefiles_trace_lookup_error,
|
|
cachefiles_trace_mkdir_error,
|
|
cachefiles_trace_notify_change_error,
|
|
cachefiles_trace_open_error,
|
|
cachefiles_trace_read_error,
|
|
cachefiles_trace_remxattr_error,
|
|
cachefiles_trace_rename_error,
|
|
cachefiles_trace_seek_error,
|
|
cachefiles_trace_setxattr_error,
|
|
cachefiles_trace_statfs_error,
|
|
cachefiles_trace_tmpfile_error,
|
|
cachefiles_trace_trunc_error,
|
|
cachefiles_trace_unlink_error,
|
|
cachefiles_trace_write_error,
|
|
};
|
|
|
|
#endif
|
|
|
|
/*
|
|
* Define enum -> string mappings for display.
|
|
*/
|
|
#define cachefiles_obj_kill_traces \
|
|
EM(FSCACHE_OBJECT_IS_STALE, "stale") \
|
|
EM(FSCACHE_OBJECT_IS_WEIRD, "weird") \
|
|
EM(FSCACHE_OBJECT_INVALIDATED, "inval") \
|
|
EM(FSCACHE_OBJECT_NO_SPACE, "no_space") \
|
|
EM(FSCACHE_OBJECT_WAS_RETIRED, "was_retired") \
|
|
EM(FSCACHE_OBJECT_WAS_CULLED, "was_culled") \
|
|
E_(FSCACHE_VOLUME_IS_WEIRD, "volume_weird")
|
|
|
|
#define cachefiles_obj_ref_traces \
|
|
EM(cachefiles_obj_get_ioreq, "GET ioreq") \
|
|
EM(cachefiles_obj_new, "NEW obj") \
|
|
EM(cachefiles_obj_put_alloc_fail, "PUT alloc_fail") \
|
|
EM(cachefiles_obj_put_detach, "PUT detach") \
|
|
EM(cachefiles_obj_put_ioreq, "PUT ioreq") \
|
|
EM(cachefiles_obj_see_clean_commit, "SEE clean_commit") \
|
|
EM(cachefiles_obj_see_clean_delete, "SEE clean_delete") \
|
|
EM(cachefiles_obj_see_clean_drop_tmp, "SEE clean_drop_tmp") \
|
|
EM(cachefiles_obj_see_lookup_cookie, "SEE lookup_cookie") \
|
|
EM(cachefiles_obj_see_lookup_failed, "SEE lookup_failed") \
|
|
EM(cachefiles_obj_see_withdraw_cookie, "SEE withdraw_cookie") \
|
|
E_(cachefiles_obj_see_withdrawal, "SEE withdrawal")
|
|
|
|
#define cachefiles_coherency_traces \
|
|
EM(cachefiles_coherency_check_aux, "BAD aux ") \
|
|
EM(cachefiles_coherency_check_content, "BAD cont") \
|
|
EM(cachefiles_coherency_check_dirty, "BAD dirt") \
|
|
EM(cachefiles_coherency_check_len, "BAD len ") \
|
|
EM(cachefiles_coherency_check_objsize, "BAD osiz") \
|
|
EM(cachefiles_coherency_check_ok, "OK ") \
|
|
EM(cachefiles_coherency_check_type, "BAD type") \
|
|
EM(cachefiles_coherency_check_xattr, "BAD xatt") \
|
|
EM(cachefiles_coherency_set_fail, "SET fail") \
|
|
EM(cachefiles_coherency_set_ok, "SET ok ") \
|
|
EM(cachefiles_coherency_vol_check_cmp, "VOL BAD cmp ") \
|
|
EM(cachefiles_coherency_vol_check_ok, "VOL OK ") \
|
|
EM(cachefiles_coherency_vol_check_resv, "VOL BAD resv") \
|
|
EM(cachefiles_coherency_vol_check_xattr,"VOL BAD xatt") \
|
|
EM(cachefiles_coherency_vol_set_fail, "VOL SET fail") \
|
|
E_(cachefiles_coherency_vol_set_ok, "VOL SET ok ")
|
|
|
|
#define cachefiles_trunc_traces \
|
|
EM(cachefiles_trunc_dio_adjust, "DIOADJ") \
|
|
EM(cachefiles_trunc_expand_tmpfile, "EXPTMP") \
|
|
E_(cachefiles_trunc_shrink, "SHRINK")
|
|
|
|
#define cachefiles_prepare_read_traces \
|
|
EM(cachefiles_trace_read_after_eof, "after-eof ") \
|
|
EM(cachefiles_trace_read_found_hole, "found-hole") \
|
|
EM(cachefiles_trace_read_found_part, "found-part") \
|
|
EM(cachefiles_trace_read_have_data, "have-data ") \
|
|
EM(cachefiles_trace_read_no_data, "no-data ") \
|
|
EM(cachefiles_trace_read_no_file, "no-file ") \
|
|
EM(cachefiles_trace_read_seek_error, "seek-error") \
|
|
E_(cachefiles_trace_read_seek_nxio, "seek-enxio")
|
|
|
|
#define cachefiles_error_traces \
|
|
EM(cachefiles_trace_fallocate_error, "fallocate") \
|
|
EM(cachefiles_trace_getxattr_error, "getxattr") \
|
|
EM(cachefiles_trace_link_error, "link") \
|
|
EM(cachefiles_trace_lookup_error, "lookup") \
|
|
EM(cachefiles_trace_mkdir_error, "mkdir") \
|
|
EM(cachefiles_trace_notify_change_error, "notify_change") \
|
|
EM(cachefiles_trace_open_error, "open") \
|
|
EM(cachefiles_trace_read_error, "read") \
|
|
EM(cachefiles_trace_remxattr_error, "remxattr") \
|
|
EM(cachefiles_trace_rename_error, "rename") \
|
|
EM(cachefiles_trace_seek_error, "seek") \
|
|
EM(cachefiles_trace_setxattr_error, "setxattr") \
|
|
EM(cachefiles_trace_statfs_error, "statfs") \
|
|
EM(cachefiles_trace_tmpfile_error, "tmpfile") \
|
|
EM(cachefiles_trace_trunc_error, "trunc") \
|
|
EM(cachefiles_trace_unlink_error, "unlink") \
|
|
E_(cachefiles_trace_write_error, "write")
|
|
|
|
|
|
/*
|
|
* Export enum symbols via userspace.
|
|
*/
|
|
#undef EM
|
|
#undef E_
|
|
#define EM(a, b) TRACE_DEFINE_ENUM(a);
|
|
#define E_(a, b) TRACE_DEFINE_ENUM(a);
|
|
|
|
cachefiles_obj_kill_traces;
|
|
cachefiles_obj_ref_traces;
|
|
cachefiles_coherency_traces;
|
|
cachefiles_trunc_traces;
|
|
cachefiles_prepare_read_traces;
|
|
cachefiles_error_traces;
|
|
|
|
/*
|
|
* Now redefine the EM() and E_() macros to map the enums to the strings that
|
|
* will be printed in the output.
|
|
*/
|
|
#undef EM
|
|
#undef E_
|
|
#define EM(a, b) { a, b },
|
|
#define E_(a, b) { a, b }
|
|
|
|
|
|
TRACE_EVENT(cachefiles_ref,
|
|
TP_PROTO(unsigned int object_debug_id,
|
|
unsigned int cookie_debug_id,
|
|
int usage,
|
|
enum cachefiles_obj_ref_trace why),
|
|
|
|
TP_ARGS(object_debug_id, cookie_debug_id, usage, why),
|
|
|
|
/* Note that obj may be NULL */
|
|
TP_STRUCT__entry(
|
|
__field(unsigned int, obj )
|
|
__field(unsigned int, cookie )
|
|
__field(enum cachefiles_obj_ref_trace, why )
|
|
__field(int, usage )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->obj = object_debug_id;
|
|
__entry->cookie = cookie_debug_id;
|
|
__entry->usage = usage;
|
|
__entry->why = why;
|
|
),
|
|
|
|
TP_printk("c=%08x o=%08x u=%d %s",
|
|
__entry->cookie, __entry->obj, __entry->usage,
|
|
__print_symbolic(__entry->why, cachefiles_obj_ref_traces))
|
|
);
|
|
|
|
TRACE_EVENT(cachefiles_lookup,
|
|
TP_PROTO(struct cachefiles_object *obj,
|
|
struct dentry *dir,
|
|
struct dentry *de),
|
|
|
|
TP_ARGS(obj, dir, de),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(unsigned int, obj )
|
|
__field(short, error )
|
|
__field(unsigned long, dino )
|
|
__field(unsigned long, ino )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->obj = obj ? obj->debug_id : 0;
|
|
__entry->dino = d_backing_inode(dir)->i_ino;
|
|
__entry->ino = (!IS_ERR(de) && d_backing_inode(de) ?
|
|
d_backing_inode(de)->i_ino : 0);
|
|
__entry->error = IS_ERR(de) ? PTR_ERR(de) : 0;
|
|
),
|
|
|
|
TP_printk("o=%08x dB=%lx B=%lx e=%d",
|
|
__entry->obj, __entry->dino, __entry->ino, __entry->error)
|
|
);
|
|
|
|
TRACE_EVENT(cachefiles_mkdir,
|
|
TP_PROTO(struct dentry *dir, struct dentry *subdir),
|
|
|
|
TP_ARGS(dir, subdir),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(unsigned int, dir )
|
|
__field(unsigned int, subdir )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->dir = d_backing_inode(dir)->i_ino;
|
|
__entry->subdir = d_backing_inode(subdir)->i_ino;
|
|
),
|
|
|
|
TP_printk("dB=%x sB=%x",
|
|
__entry->dir,
|
|
__entry->subdir)
|
|
);
|
|
|
|
TRACE_EVENT(cachefiles_tmpfile,
|
|
TP_PROTO(struct cachefiles_object *obj, struct inode *backer),
|
|
|
|
TP_ARGS(obj, backer),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(unsigned int, obj )
|
|
__field(unsigned int, backer )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->obj = obj->debug_id;
|
|
__entry->backer = backer->i_ino;
|
|
),
|
|
|
|
TP_printk("o=%08x B=%x",
|
|
__entry->obj,
|
|
__entry->backer)
|
|
);
|
|
|
|
TRACE_EVENT(cachefiles_link,
|
|
TP_PROTO(struct cachefiles_object *obj, struct inode *backer),
|
|
|
|
TP_ARGS(obj, backer),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(unsigned int, obj )
|
|
__field(unsigned int, backer )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->obj = obj->debug_id;
|
|
__entry->backer = backer->i_ino;
|
|
),
|
|
|
|
TP_printk("o=%08x B=%x",
|
|
__entry->obj,
|
|
__entry->backer)
|
|
);
|
|
|
|
TRACE_EVENT(cachefiles_unlink,
|
|
TP_PROTO(struct cachefiles_object *obj,
|
|
ino_t ino,
|
|
enum fscache_why_object_killed why),
|
|
|
|
TP_ARGS(obj, ino, why),
|
|
|
|
/* Note that obj may be NULL */
|
|
TP_STRUCT__entry(
|
|
__field(unsigned int, obj )
|
|
__field(unsigned int, ino )
|
|
__field(enum fscache_why_object_killed, why )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->obj = obj ? obj->debug_id : UINT_MAX;
|
|
__entry->ino = ino;
|
|
__entry->why = why;
|
|
),
|
|
|
|
TP_printk("o=%08x B=%x w=%s",
|
|
__entry->obj, __entry->ino,
|
|
__print_symbolic(__entry->why, cachefiles_obj_kill_traces))
|
|
);
|
|
|
|
TRACE_EVENT(cachefiles_rename,
|
|
TP_PROTO(struct cachefiles_object *obj,
|
|
ino_t ino,
|
|
enum fscache_why_object_killed why),
|
|
|
|
TP_ARGS(obj, ino, why),
|
|
|
|
/* Note that obj may be NULL */
|
|
TP_STRUCT__entry(
|
|
__field(unsigned int, obj )
|
|
__field(unsigned int, ino )
|
|
__field(enum fscache_why_object_killed, why )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->obj = obj ? obj->debug_id : UINT_MAX;
|
|
__entry->ino = ino;
|
|
__entry->why = why;
|
|
),
|
|
|
|
TP_printk("o=%08x B=%x w=%s",
|
|
__entry->obj, __entry->ino,
|
|
__print_symbolic(__entry->why, cachefiles_obj_kill_traces))
|
|
);
|
|
|
|
TRACE_EVENT(cachefiles_coherency,
|
|
TP_PROTO(struct cachefiles_object *obj,
|
|
ino_t ino,
|
|
enum cachefiles_content content,
|
|
enum cachefiles_coherency_trace why),
|
|
|
|
TP_ARGS(obj, ino, content, why),
|
|
|
|
/* Note that obj may be NULL */
|
|
TP_STRUCT__entry(
|
|
__field(unsigned int, obj )
|
|
__field(enum cachefiles_coherency_trace, why )
|
|
__field(enum cachefiles_content, content )
|
|
__field(u64, ino )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->obj = obj->debug_id;
|
|
__entry->why = why;
|
|
__entry->content = content;
|
|
__entry->ino = ino;
|
|
),
|
|
|
|
TP_printk("o=%08x %s B=%llx c=%u",
|
|
__entry->obj,
|
|
__print_symbolic(__entry->why, cachefiles_coherency_traces),
|
|
__entry->ino,
|
|
__entry->content)
|
|
);
|
|
|
|
TRACE_EVENT(cachefiles_vol_coherency,
|
|
TP_PROTO(struct cachefiles_volume *volume,
|
|
ino_t ino,
|
|
enum cachefiles_coherency_trace why),
|
|
|
|
TP_ARGS(volume, ino, why),
|
|
|
|
/* Note that obj may be NULL */
|
|
TP_STRUCT__entry(
|
|
__field(unsigned int, vol )
|
|
__field(enum cachefiles_coherency_trace, why )
|
|
__field(u64, ino )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->vol = volume->vcookie->debug_id;
|
|
__entry->why = why;
|
|
__entry->ino = ino;
|
|
),
|
|
|
|
TP_printk("V=%08x %s B=%llx",
|
|
__entry->vol,
|
|
__print_symbolic(__entry->why, cachefiles_coherency_traces),
|
|
__entry->ino)
|
|
);
|
|
|
|
TRACE_EVENT(cachefiles_prep_read,
|
|
TP_PROTO(struct netfs_io_subrequest *sreq,
|
|
enum netfs_io_source source,
|
|
enum cachefiles_prepare_read_trace why,
|
|
ino_t cache_inode),
|
|
|
|
TP_ARGS(sreq, source, why, cache_inode),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(unsigned int, rreq )
|
|
__field(unsigned short, index )
|
|
__field(unsigned short, flags )
|
|
__field(enum netfs_io_source, source )
|
|
__field(enum cachefiles_prepare_read_trace, why )
|
|
__field(size_t, len )
|
|
__field(loff_t, start )
|
|
__field(unsigned int, netfs_inode )
|
|
__field(unsigned int, cache_inode )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->rreq = sreq->rreq->debug_id;
|
|
__entry->index = sreq->debug_index;
|
|
__entry->flags = sreq->flags;
|
|
__entry->source = source;
|
|
__entry->why = why;
|
|
__entry->len = sreq->len;
|
|
__entry->start = sreq->start;
|
|
__entry->netfs_inode = sreq->rreq->inode->i_ino;
|
|
__entry->cache_inode = cache_inode;
|
|
),
|
|
|
|
TP_printk("R=%08x[%u] %s %s f=%02x s=%llx %zx ni=%x B=%x",
|
|
__entry->rreq, __entry->index,
|
|
__print_symbolic(__entry->source, netfs_sreq_sources),
|
|
__print_symbolic(__entry->why, cachefiles_prepare_read_traces),
|
|
__entry->flags,
|
|
__entry->start, __entry->len,
|
|
__entry->netfs_inode, __entry->cache_inode)
|
|
);
|
|
|
|
TRACE_EVENT(cachefiles_read,
|
|
TP_PROTO(struct cachefiles_object *obj,
|
|
struct inode *backer,
|
|
loff_t start,
|
|
size_t len),
|
|
|
|
TP_ARGS(obj, backer, start, len),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(unsigned int, obj )
|
|
__field(unsigned int, backer )
|
|
__field(size_t, len )
|
|
__field(loff_t, start )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->obj = obj->debug_id;
|
|
__entry->backer = backer->i_ino;
|
|
__entry->start = start;
|
|
__entry->len = len;
|
|
),
|
|
|
|
TP_printk("o=%08x B=%x s=%llx l=%zx",
|
|
__entry->obj,
|
|
__entry->backer,
|
|
__entry->start,
|
|
__entry->len)
|
|
);
|
|
|
|
TRACE_EVENT(cachefiles_write,
|
|
TP_PROTO(struct cachefiles_object *obj,
|
|
struct inode *backer,
|
|
loff_t start,
|
|
size_t len),
|
|
|
|
TP_ARGS(obj, backer, start, len),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(unsigned int, obj )
|
|
__field(unsigned int, backer )
|
|
__field(size_t, len )
|
|
__field(loff_t, start )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->obj = obj->debug_id;
|
|
__entry->backer = backer->i_ino;
|
|
__entry->start = start;
|
|
__entry->len = len;
|
|
),
|
|
|
|
TP_printk("o=%08x B=%x s=%llx l=%zx",
|
|
__entry->obj,
|
|
__entry->backer,
|
|
__entry->start,
|
|
__entry->len)
|
|
);
|
|
|
|
TRACE_EVENT(cachefiles_trunc,
|
|
TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
|
|
loff_t from, loff_t to, enum cachefiles_trunc_trace why),
|
|
|
|
TP_ARGS(obj, backer, from, to, why),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(unsigned int, obj )
|
|
__field(unsigned int, backer )
|
|
__field(enum cachefiles_trunc_trace, why )
|
|
__field(loff_t, from )
|
|
__field(loff_t, to )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->obj = obj->debug_id;
|
|
__entry->backer = backer->i_ino;
|
|
__entry->from = from;
|
|
__entry->to = to;
|
|
__entry->why = why;
|
|
),
|
|
|
|
TP_printk("o=%08x B=%x %s l=%llx->%llx",
|
|
__entry->obj,
|
|
__entry->backer,
|
|
__print_symbolic(__entry->why, cachefiles_trunc_traces),
|
|
__entry->from,
|
|
__entry->to)
|
|
);
|
|
|
|
TRACE_EVENT(cachefiles_mark_active,
|
|
TP_PROTO(struct cachefiles_object *obj,
|
|
struct inode *inode),
|
|
|
|
TP_ARGS(obj, inode),
|
|
|
|
/* Note that obj may be NULL */
|
|
TP_STRUCT__entry(
|
|
__field(unsigned int, obj )
|
|
__field(ino_t, inode )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->obj = obj ? obj->debug_id : 0;
|
|
__entry->inode = inode->i_ino;
|
|
),
|
|
|
|
TP_printk("o=%08x B=%lx",
|
|
__entry->obj, __entry->inode)
|
|
);
|
|
|
|
TRACE_EVENT(cachefiles_mark_failed,
|
|
TP_PROTO(struct cachefiles_object *obj,
|
|
struct inode *inode),
|
|
|
|
TP_ARGS(obj, inode),
|
|
|
|
/* Note that obj may be NULL */
|
|
TP_STRUCT__entry(
|
|
__field(unsigned int, obj )
|
|
__field(ino_t, inode )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->obj = obj ? obj->debug_id : 0;
|
|
__entry->inode = inode->i_ino;
|
|
),
|
|
|
|
TP_printk("o=%08x B=%lx",
|
|
__entry->obj, __entry->inode)
|
|
);
|
|
|
|
TRACE_EVENT(cachefiles_mark_inactive,
|
|
TP_PROTO(struct cachefiles_object *obj,
|
|
struct inode *inode),
|
|
|
|
TP_ARGS(obj, inode),
|
|
|
|
/* Note that obj may be NULL */
|
|
TP_STRUCT__entry(
|
|
__field(unsigned int, obj )
|
|
__field(ino_t, inode )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->obj = obj ? obj->debug_id : 0;
|
|
__entry->inode = inode->i_ino;
|
|
),
|
|
|
|
TP_printk("o=%08x B=%lx",
|
|
__entry->obj, __entry->inode)
|
|
);
|
|
|
|
TRACE_EVENT(cachefiles_vfs_error,
|
|
TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
|
|
int error, enum cachefiles_error_trace where),
|
|
|
|
TP_ARGS(obj, backer, error, where),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(unsigned int, obj )
|
|
__field(unsigned int, backer )
|
|
__field(enum cachefiles_error_trace, where )
|
|
__field(short, error )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->obj = obj ? obj->debug_id : 0;
|
|
__entry->backer = backer->i_ino;
|
|
__entry->error = error;
|
|
__entry->where = where;
|
|
),
|
|
|
|
TP_printk("o=%08x B=%x %s e=%d",
|
|
__entry->obj,
|
|
__entry->backer,
|
|
__print_symbolic(__entry->where, cachefiles_error_traces),
|
|
__entry->error)
|
|
);
|
|
|
|
TRACE_EVENT(cachefiles_io_error,
|
|
TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
|
|
int error, enum cachefiles_error_trace where),
|
|
|
|
TP_ARGS(obj, backer, error, where),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(unsigned int, obj )
|
|
__field(unsigned int, backer )
|
|
__field(enum cachefiles_error_trace, where )
|
|
__field(short, error )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->obj = obj ? obj->debug_id : 0;
|
|
__entry->backer = backer->i_ino;
|
|
__entry->error = error;
|
|
__entry->where = where;
|
|
),
|
|
|
|
TP_printk("o=%08x B=%x %s e=%d",
|
|
__entry->obj,
|
|
__entry->backer,
|
|
__print_symbolic(__entry->where, cachefiles_error_traces),
|
|
__entry->error)
|
|
);
|
|
|
|
#endif /* _TRACE_CACHEFILES_H */
|
|
|
|
/* This part must be outside protection */
|
|
#include <trace/define_trace.h>
|