#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2006 Silicon Graphics, Inc. All Rights Reserved.
+#
# FS QA Test No. 122
#
# pv#952498
# Keep an eye on some of the xfs type sizes
# Motivation from differing ondisk types for 32 and 64 bit word versions.
#
-#-----------------------------------------------------------------------
-# Copyright (c) 2006 Silicon Graphics, Inc. All Rights Reserved.
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation.
-#
-# This program is distributed in the hope that it would be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-#
-#-----------------------------------------------------------------------
-#
-
seq=`basename $0`
seqres=$RESULT_DIR/$seq
echo "QA output created by $seq"
# real QA test starts here
_supported_fs xfs
-_supported_os Linux
-_require_command $INDENT_PROG "indent"
+_require_command "$INDENT_PROG" indent
+
+rm -f $seqres.full
# filter out known changes to xfs type sizes
_type_size_filter()
cprog=$tmp.get_structs.c
oprog=$tmp.get_structs
progout=$tmp.output
+keyfile=$tmp.keys
cat >$cprog <<EOF
+#define _GNU_SOURCE
#include <stdio.h>
-#include <xfs/libxlog.h>
EOF
+# Certain headers must be included in a certain order...
+for hdr in xfs.h xfs_types.h xfs_fs.h xfs_arch.h xfs_format.h; do
+ test -e "/usr/include/xfs/$hdr" && echo "#include <xfs/$hdr>" >> $cprog
+done
+# ...but be sure to pull in any new headers that might show up.
+for hdr in /usr/include/xfs/xfs*.h; do
+ echo "#include <$(echo "$hdr" | sed -e 's|/usr/include/||g')>" >> $cprog
+done
+
+# missing:
+# xfs_trans_header_t
cat >$tmp.ignore <<EOF
+xfs_buf_log_format_t
+xfs_attr3_icleaf_hdr
+xfs_da3_icnode_hdr
+xfs_dir3_icfree_hdr
+xfs_dir3_icleaf_hdr
+xfs_name
+xfs_owner_info
+xfs_refcount_irec
+xfs_rmap_irec
xfs_alloctype_t
xfs_buf_cancel_t
xfs_bmbt_rec_32_t
xfs_growfs_rt_t
xfs_bstime_t
xfs_bstat_t
+struct xfs_bstat
xfs_fsop_bulkreq_t
+struct xfs_fsop_bulkreq
xfs_icsb_cnts_t
xfs_icdinode_t
xfs_ictimestamp_t
xfs_inobt_rec_incore_t
xfs_inogrp_t
+struct xfs_inogrp
xfs_fid2_t
xfs_fsop_handlereq_t
xfs_fsop_setdm_handlereq_t
xfs_dirent_t
xfs_fsop_getparents_handlereq_t
xfs_dinode_core_t
+struct xfs_iext_cursor
+struct xfs_ino_geometry
+struct xfs_attrlist
+struct xfs_attrlist_ent
+struct xfs_legacy_ictimestamp
EOF
echo 'int main(int argc, char *argv[]) {' >>$cprog
#
cat /usr/include/xfs/xfs*.h | indent |\
_attribute_filter |\
-tee $seqres.full |\
-egrep '} *xfs_.*_t' |\
+egrep '(} *xfs_.*_t|^struct xfs_[a-z0-9_]*$)' |\
egrep -v -f $tmp.ignore |\
-awk '{sub(/[;,]/,"",$2); print "printf(\"sizeof(", $2, ") = %d\\n\", sizeof(", $2, "));"}' \
->>$cprog
+sed -e 's/^.*}[[:space:]]*//g' -e 's/;.*$//g' -e 's/_t, /_t\n/g' |\
+sort | uniq |\
+awk '{printf("printf(\"sizeof(%s) = \\%zu\\n\", sizeof(%s));\n", $0, $0);}' |\
+cat >> $cprog
#
# Look at offsets of key ones which differ in lengths
awk '
/typedef struct xfs_sb/ { structon = 1; next }
structon && $2 ~ /^sb_/ { sub(/[;,]/,"",$2)
- print "printf(\"offsetof(xfs_sb_t,", $2, ") = %d\\n\", offsetof(xfs_sb_t,", $2, "));"; next}
+ sub(/XFSLABEL_MAX/,"12",$2)
+ printf("printf(\"offsetof(xfs_sb_t, %s) = \\%zu\\n\", offsetof(xfs_sb_t, %s));", $2, $2); next}
structon && /}/ { structon = 0; next}
'>>$cprog
_notrun "Could not compile test program (see end of $seqres.full)"
$oprog | _type_size_filter | _type_name_filter > $progout
-#
-# add addition sizes and xfs_sb_t fields that don't exist in the version
-# being tested.
-#
+# Find all the items that only exist in the golden output
+comm -23 <(grep '=' $0.out | sed -e 's/ =.*$//g' | LC_COLLATE=POSIX sort) \
+ <(sed -e 's/ =.*$//g' < $progout | LC_COLLATE=POSIX sort) > $keyfile
-# xfsprogs 2.9.8: sb_bad_features2 in pv 978822
-if [ $XFSPROGS_VERSION -lt 20908 ]; then
- echo 'offsetof(xfs_sb_t, sb_bad_features2 ) = 204' >>$progout
-fi
-if [ $XFSPROGS_VERSION -lt 30000 ]; then
- echo 'sizeof( xfs_dsb_t ) = 208' >>$progout;
-fi
+# Copy those items to the program output
+grep -F -f $keyfile $0.out >> $progout
LC_COLLATE=POSIX sort $progout