Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:42.1:Staging:C
xfsprogs
logprint-Fix-printing-of-AGF-and-AGI-buffers.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File logprint-Fix-printing-of-AGF-and-AGI-buffers.patch of Package xfsprogs
From 655b1e99f115f13f93143b69fe1a56d11f8651ee Mon Sep 17 00:00:00 2001 From: Jan Kara <jack@suse.cz> Date: Mon, 14 Jul 2014 16:39:42 +0200 Subject: [PATCH] logprint: Fix printing of AGF and AGI buffers Currently xfs_logprint doesn't show detailed data about AGF and AGI buffers and instead always shows "Out of space". This is because xfs_agf_t has additional fields and padding which we never read from disk and thus buffer length is always smaller than the size of xfs_agf_t or xfs_agi_t respectively. Fix the problem by only making sure we have enough data in the buffer to contain all the information we want to print. Signed-off-by: Jan Kara <jack@suse.cz> --- logprint/log_misc.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/logprint/log_misc.c b/logprint/log_misc.c index d482cf3fba57..c9286c67b913 100644 --- a/logprint/log_misc.c +++ b/logprint/log_misc.c @@ -325,7 +325,15 @@ xlog_print_trans_buffer(xfs_caddr_t *ptr, int len, int *i, int num_ops) } else if (be32_to_cpu(*(__be32 *)(*ptr)) == XFS_AGI_MAGIC) { agi = (xfs_agi_t *)(*ptr); printf(_("AGI Buffer: XAGI ")); - if (be32_to_cpu(head->oh_len) < sizeof(xfs_agi_t) - + /* + * v4 filesystems only contain the fields before the uuid. + * Even v5 filesystems don't log any field beneath it. That + * means that the size that is logged is almost always going to + * be smaller than the structure itself. Hence we need to make + * sure that the buffer contains all the data we want to print + * rather than just check against the structure size. + */ + if (be32_to_cpu(head->oh_len) < offsetof(xfs_agi_t, agi_uuid) - XFS_AGI_UNLINKED_BUCKETS*sizeof(xfs_agino_t)) { printf(_("out of space\n")); } else { @@ -367,7 +375,15 @@ xlog_print_trans_buffer(xfs_caddr_t *ptr, int len, int *i, int num_ops) } else if (be32_to_cpu(*(__be32 *)(*ptr)) == XFS_AGF_MAGIC) { agf = (xfs_agf_t *)(*ptr); printf(_("AGF Buffer: XAGF ")); - if (be32_to_cpu(head->oh_len) < sizeof(xfs_agf_t)) { + /* + * v4 filesystems only contain the fields before the uuid. + * Even v5 filesystems don't log any field beneath it. That + * means that the size that is logged is almost always going to + * be smaller than the structure itself. Hence we need to make + * sure that the buffer contains all the data we want to print + * rather than just check against the structure size. + */ + if (be32_to_cpu(head->oh_len) < offsetof(xfs_agf_t, agf_uuid)) { printf(_("Out of space\n")); } else { printf("\n"); -- 1.8.1.4
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor