diff mbox series

[v4,next] xfs: Replace one-element arrays with flexible-array members

Message ID 20210412135611.GA183224@embeddedor (mailing list archive)
State Superseded
Headers show
Series [v4,next] xfs: Replace one-element arrays with flexible-array members | expand

Commit Message

Gustavo A. R. Silva April 12, 2021, 1:56 p.m. UTC
There is a regular need in the kernel to provide a way to declare having
a dynamically sized set of trailing elements in a structure. Kernel code
should always use “flexible array members”[1] for these cases. The older
style of one-element or zero-length arrays should no longer be used[2].

Refactor the code according to the use of flexible-array members in
multiple structures, instead of one-element arrays. Also, make use of
the new struct_size() helper to properly calculate the size of multiple
structures that contain flexible-array members. Additionally, wrap
some calls to the struct_size() helper in multiple inline functions.

Below are the results of running xfstests for "all" with the following
configuration in local.config:

export TEST_DEV=/dev/sdb1
export TEST_DIR=/mnt/test
export SCRATCH_DEV=/dev/sdb2
export SCRATCH_MNT=/mnt/scratch

The size for both partitions /dev/sdb1 and /dev/sdb2 is 25GB.

These are the results of running ./check -g all on 5.12.0-rc6 kernel:

FSTYP         -- xfs (debug)
PLATFORM      -- Linux/x86_64 machine 5.12.0-rc6-xfs-fixed+ #16 SMP Fri Apr 9 22:42:49 CDT 2021
MKFS_OPTIONS  -- -f -bsize=4096 /dev/sdb2
MOUNT_OPTIONS -- /dev/sdb2 /mnt/scratch

generic/001 3s ...  4s
generic/002 0s ...  2s
generic/003 10s ...  10s
generic/004 1s ...  2s
generic/005 1s ...  1s
generic/006 1s ...  2s
generic/007 2s ...  2s
generic/008 1s ...  1s
generic/009 2s ...  1s
generic/010	[not run] /home/test/git/xfstests/src/dbtest not built
generic/011 2s ...  1s
generic/012 2s ...  1s
generic/013 8s ...  7s
generic/014 1s ...  1s
generic/015 1s ...  1s
generic/016 1s ...  1s
generic/017 56s ...  54s
generic/018 2s ...  2s
generic/019	[not run] /sys/kernel/debug/fail_make_request  not found. Seems that CONFIG_FAULT_INJECTION_DEBUG_FS kernel config option not enabled
generic/020 3s ...  4s
generic/021 1s ...  1s
generic/022 1s ...  1s
generic/023 1s ...  1s
generic/024 1s ...  1s
generic/025 1s ...  1s
generic/026 3s ...  4s
generic/027 30s ...  29s
generic/028 6s ...  6s
generic/029 0s ...  1s
generic/030 1s ...  1s
generic/031 1s ...  0s
generic/032 9s ...  8s
generic/033 0s ...  1s
generic/034 1s ...  1s
generic/035 1s ...  1s
generic/036 11s ...  11s
generic/037 6s ...  5s
generic/038	[not run] FITRIM not supported on /mnt/scratch
generic/039 1s ...  1s
generic/040 5s ...  6s
generic/041 9s ...  8s
generic/042 2s ...  2s
generic/043 14s ...  14s
generic/044 17s ...  17s
generic/045 23s ...  23s
generic/046 16s ...  17s
generic/047 22s ...  21s
generic/048 22s ...  22s
generic/049 14s ...  14s
generic/050 1s ...  0s
generic/051 75s ...  75s
generic/052 1s ...  1s
generic/053 1s ...  1s
generic/054 19s ...  18s
generic/055 9s ...  10s
generic/056 1s ...  1s
generic/057 1s ...  1s
generic/058 1s ...  1s
generic/059 2s ...  2s
generic/060 1s ...  1s
generic/061 1s ...  1s
generic/062 2s ...  1s
generic/063 1s ...  1s
generic/064 1s ...  2s
generic/065 1s ...  1s
generic/066 1s ...  1s
generic/067 1s ...  1s
generic/068 43s ...  43s
generic/069 4s ...  3s
generic/070 2s ...  3s
generic/071 1s ...  0s
generic/072 13s ...  14s
generic/073 1s ...  0s
generic/074 11s ...  11s
generic/075 15s ...  15s
generic/076 2s ...  2s
generic/077 6s ...  5s
generic/078 1s ...  2s
generic/079 1s ...  0s
generic/080 3s ...  3s
generic/081	[not run] lvm utility required, skipped this test
generic/082 1s ...  1s
generic/083 7s ...  6s
generic/084 5s ...  6s
generic/085 5s ...  5s
generic/086 1s ...  1s
generic/087 1s ...  1s
generic/088 1s ...  1s
generic/089 7s ...  8s
generic/090 2s ...  1s
generic/091 6s ...  7s
generic/092 0s ...  0s
generic/093 1s ...  1s
generic/094 8s ...  9s
generic/095 4s ...  3s
generic/096 1s ...  0s
generic/097 1s ...  1s
generic/098 1s ...  1s
generic/099 1s ...  1s
generic/100 18s ...  17s
generic/101 0s ...  1s
generic/102 3s ...  3s
generic/103 2s ...  1s
generic/104 1s ...  1s
generic/105 1s ...  1s
generic/106 1s ...  1s
generic/107 1s ...  1s
generic/108	[not run] lvm utility required, skipped this test
generic/109 2s ...  1s
generic/110 2s ...  1s
generic/111 1s ...  1s
generic/112 16s ...  16s
generic/113 13s ...  13s
generic/114 3s ...  2s
generic/115 1s ...  1s
generic/116 1s ...  1s
generic/117 2s ...  2s
generic/118 1s ...  1s
generic/119 1s ...  1s
generic/120 16s ...  16s
generic/121 1s ...  1s
generic/122 1s ...  1s
generic/123 1s ...  1s
generic/124 3s ...  3s
generic/125 62s ...  62s
generic/126 0s ...  1s
generic/127 210s ...  216s
generic/128 1s ...  1s
generic/129 2s ...  2s
generic/130 3s ...  3s
generic/131 2s ...  2s
generic/132 12s ...  12s
generic/133 11s ...  12s
generic/134 1s ...  1s
generic/135 1s ...  1s
generic/136 1s ...  1s
generic/137 23s ...  22s
generic/138 1s ...  1s
generic/139 1s ...  1s
generic/140 1s ...  1s
generic/141 1s ...  1s
generic/142 2s ...  1s
generic/143 5s ...  5s
generic/144 3s ...  2s
generic/145 2s ...  2s
generic/146 3s ...  2s
generic/147 2s ...  1s
generic/148 1s ...  1s
generic/149 2s ...  1s
generic/150 2s ...  1s
generic/151 3s ...  1s
generic/152 2s ...  1s
generic/153 3s ...  1s
generic/154 3s ...  1s
generic/155 3s ...  2s
generic/156 3s ...  2s
generic/157 1s ...  2s
generic/158 2s ...  1s
generic/159 1s ...  1s
generic/160 1s ...  1s
generic/161 1s ...  1s
generic/162 8s ...  8s
generic/163 10s ...  9s
generic/164 10s ...  11s
generic/165 10s ...  10s
generic/166 9s ...  10s
generic/167 7s ...  7s
generic/168 41s ...  41s
generic/169 1s ...  1s
generic/170 47s ...  48s
generic/171 1s ...  1s
generic/172 2s ...  2s
generic/173 2s ...  2s
generic/174 1s ...  1s
generic/175 21s ...  20s
generic/176 45s ...  44s
generic/177 1s ...  1s
generic/178 1s ...  1s
generic/179 1s ...  1s
generic/180 1s ...  1s
generic/181 1s ...  1s
generic/182 2s ...  1s
generic/183 1s ...  2s
generic/184 1s ...  1s
generic/185 1s ...  1s
generic/186 21s ...  20s
generic/187 21s ...  20s
generic/188 1s ...  2s
generic/189 1s ...  1s
generic/190 2s ...  1s
generic/191 1s ...  1s
generic/192 6s ...  5s
generic/193 1s ...  2s
generic/194 2s ...  1s
generic/195 1s ...  2s
generic/196 2s ...  1s
generic/197 1s ...  1s
generic/198 1s ...  1s
generic/199 1s ...  2s
generic/200 2s ...  1s
generic/201 1s ...  2s
generic/202 1s ...  1s
generic/203 1s ... [failed, exit status 1]- output mismatch (see /home/test/git/xfstests/results//generic/203.out.bad)
    --- tests/generic/203.out	2021-02-28 21:47:48.606582461 -0600
    +++ /home/test/git/xfstests/results//generic/203.out.bad	2021-04-11 22:48:59.977013978 -0500
    __ -1,12 +1,7 __
     QA output created by 203
     Format and mount
     Create the original files
    -Compare files
    -75f550706b7d54e6ae59a8220b532285  SCRATCH_MNT/test-203/file1
    -75f550706b7d54e6ae59a8220b532285  SCRATCH_MNT/test-203/file2
    -75f550706b7d54e6ae59a8220b532285  SCRATCH_MNT/test-203/file2.chk
    ...
    (Run 'diff -u /home/test/git/xfstests/tests/generic/203.out /home/test/git/xfstests/results//generic/203.out.bad'  to see the entire diff)
generic/204 23s ...  22s
generic/205	[not run] Failed to format with small blocksize.
generic/206	[not run] Failed to format with small blocksize.
generic/207 1s ...  2s
generic/208 201s ...  200s
generic/209 32s ...  31s
generic/210 1s ...  1s
generic/211 1s ...  1s
generic/212 1s ...  0s
generic/213 0s ...  1s
generic/214 1s ...  1s
generic/215 3s ...  3s
generic/216	[not run] Failed to format with small blocksize.
generic/217	[not run] Failed to format with small blocksize.
generic/218	[not run] Failed to format with small blocksize.
generic/219 1s ...  1s
generic/220	[not run] Failed to format with small blocksize.
generic/221 1s ...  2s
generic/222	[not run] Failed to format with small blocksize.
generic/223 3s ...  3s
generic/224 8s ...  7s
generic/225 9s ...  8s
generic/226 2s ...  2s
generic/227	[not run] Failed to format with small blocksize.
generic/228 1s ...  1s
generic/229	[not run] Failed to format with small blocksize.
generic/230 13s ...  13s
generic/231 73s ...  74s
generic/232 4s ...  5s
generic/233 4s ...  4s
generic/234 8s ...  8s
generic/235 1s ...  1s
generic/236 2s ...  2s
generic/237 0s ...  0s
generic/238	[not run] Failed to format with small blocksize.
generic/239 25s ...  20s
generic/240 1s ...  1s
generic/241 74s ...  73s
generic/242 7s ...  8s
generic/243 7s ...  7s
generic/244 4s ...  3s
generic/245 0s ...  1s
generic/246 1s ...  1s
generic/247 5s ...  5s
generic/248 1s ...  1s
generic/249 1s ...  1s
generic/250 2s ...  2s
generic/251	[not run] FITRIM not supported on /mnt/scratch
generic/252 2s ...  2s
generic/253 1s ... [failed, exit status 1]- output mismatch (see /home/test/git/xfstests/results//generic/253.out.bad)
    --- tests/generic/253.out	2021-02-28 21:47:48.606582461 -0600
    +++ /home/test/git/xfstests/results//generic/253.out.bad	2021-04-11 22:57:45.916411410 -0500
    __ -6,7 +6,7 __
     c946b71bb69c07daf25470742c967e7c  SCRATCH_MNT/test-253/file2
     c946b71bb69c07daf25470742c967e7c  SCRATCH_MNT/test-253/file2.chk
     CoW and unmount
    -Compare files
    -c946b71bb69c07daf25470742c967e7c  SCRATCH_MNT/test-253/file1
    -b5fc98f04b19fa7b2085ec1358c78760  SCRATCH_MNT/test-253/file2
    -b5fc98f04b19fa7b2085ec1358c78760  SCRATCH_MNT/test-253/file2.chk
    ...
    (Run 'diff -u /home/test/git/xfstests/tests/generic/253.out /home/test/git/xfstests/results//generic/253.out.bad'  to see the entire diff)
generic/254 1s ...  1s
generic/255 1s ...  2s
generic/256 51s ...  53s
generic/257 1s ...  1s
generic/258 1s ...  1s
generic/259 1s ...  1s
generic/260	[not run] FITRIM not supported on /mnt/scratch
generic/261 1s ...  1s
generic/262 1s ...  1s
generic/263 12s ...  12s
generic/264 1s ...  1s
generic/265 2s ...  2s
generic/266 2s ...  2s
generic/267 1s ...  2s
generic/268 2s ...  2s
generic/269 22s ...  24s
generic/270 39s ...  38s
generic/271 2s ...  3s
generic/272 1s ...  2s
generic/273 8s ...  9s
generic/274 7s ...  7s
generic/275 2s ...  3s
generic/276 2s ...  2s
generic/277 2s ...  2s
generic/278 2s ...  2s
generic/279 1s ...  2s
generic/280 2s ...  2s
generic/281 2s ...  2s
generic/282 2s ...  1s
generic/283 3s ...  4s
generic/284 1s ...  1s
generic/285 1s ...  3s
generic/286 2s ...  2s
generic/287 1s ...  2s
generic/288	[not run] FITRIM not supported on /mnt/scratch
generic/289 1s ...  2s
generic/290 2s ...  1s
generic/291 1s ...  2s
generic/292 1s ...  2s
generic/293 1s ...  2s
generic/294 1s ...  1s
generic/295 1s ...  2s
generic/296 2s ...  1s
generic/297 41s ...  42s
generic/298 42s ...  42s
generic/299 108s ...  112s
generic/300 5s ...  4s
generic/301 2s ...  1s
generic/302 3s ...  4s
generic/303 1s ...  2s
generic/304 1s ...  2s
generic/305 1s ...  1s
generic/306 1s ...  2s
generic/307 2s ...  2s
generic/308 1s ...  1s
generic/309 2s ...  2s
generic/310 64s ...  65s
generic/311 46s ...  45s
generic/312 1s ...  1s
generic/313 5s ...  5s
generic/314 1s ...  2s
generic/315 1s ...  2s
generic/316 1s ...  2s
generic/317 3s ...  1s
generic/318 0s ...  1s
generic/319 0s ...  0s
generic/320 16s ...  14s
generic/321 2s ...  2s
generic/322 1s ...  1s
generic/323 122s ...  122s
generic/324 13s ...  13s
generic/325 1s ...  1s
generic/326 1s ...  1s
generic/327 1s ...  1s
generic/328 2s ...  2s
generic/329 2s ...  1s
generic/330 1s ...  1s
generic/331 2s ...  2s
generic/332 2s ...  2s
generic/333 75s ...  73s
generic/334 69s ...  67s
generic/335 1s ...  1s
generic/336 1s ...  1s
generic/337 1s ...  0s
generic/338 1s ...  1s
generic/339 2s ...  3s
generic/340 2s ...  1s
generic/341 1s ...  1s
generic/342 1s ...  1s
generic/343 1s ...  1s
generic/344 2s ...  2s
generic/345 2s ...  3s
generic/346 2s ...  1s
generic/347 70s ...  71s
generic/348 1s ...  1s
generic/349 2s ...  2s
generic/350 2s ...  2s
generic/351 4s ...  3s
generic/352 26s ...  24s
generic/353 1s ...  1s
generic/354 2s ...  2s
generic/355 1s ...  1s
generic/356 1s ...  1s
generic/357 2s ...  1s
generic/358 7s ...  7s
generic/359 1s ...  1s
generic/360 1s ...  1s
generic/361 1s ...  1s
generic/362	[not run] mkfs.xfs doesn't have richacl feature
generic/363	[not run] mkfs.xfs doesn't have richacl feature
generic/364	[not run] mkfs.xfs doesn't have richacl feature
generic/365	[not run] mkfs.xfs doesn't have richacl feature
generic/366	[not run] mkfs.xfs doesn't have richacl feature
generic/367	[not run] mkfs.xfs doesn't have richacl feature
generic/368	[not run] mkfs.xfs doesn't have richacl feature
generic/369	[not run] mkfs.xfs doesn't have richacl feature
generic/370	[not run] mkfs.xfs doesn't have richacl feature
generic/371 5s ...  5s
generic/372 1s ...  1s
generic/373 1s ...  1s
generic/374 1s ...  1s
generic/375 1s ...  1s
generic/376 1s ...  1s
generic/377 1s ...  1s
generic/378 1s ...  1s
generic/379 1s ...  1s
generic/380 3s ...  3s
generic/381 1s ...  1s
generic/382 6s ...  3s
generic/383 0s ...  0s
generic/384 1s ...  1s
generic/385 2s ...  2s
generic/386 1s ...  0s
generic/387 50s ...  49s
generic/388 78s ... [failed, exit status 1]- output mismatch (see /home/test/git/xfstests/results//generic/388.out.bad)
    --- tests/generic/388.out	2021-02-28 21:47:48.614581906 -0600
    +++ /home/test/git/xfstests/results//generic/388.out.bad	2021-04-11 23:16:57.210310505 -0500
    __ -1,2 +1,6 __
     QA output created by 388
     Silence is golden.
    +umount: /mnt/scratch: target is busy.
    +mount: /mnt/scratch: /dev/sdb2 already mounted on /mnt/scratch.
    +cycle mount failed
    +(see /home/test/git/xfstests/results//generic/388.full for details)
    ...
    (Run 'diff -u /home/test/git/xfstests/tests/generic/388.out /home/test/git/xfstests/results//generic/388.out.bad'  to see the entire diff)
generic/389 1s ...  1s
generic/390 15s ...  15s
generic/391 3s ...  4s
generic/392 4s ...  3s
generic/393 1s ...  1s
generic/394 1s ...  1s
generic/395	[not run] No encryption support for xfs
generic/396	[not run] No encryption support for xfs
generic/397	[not run] No encryption support for xfs
generic/398	[not run] No encryption support for xfs
generic/399	[not run] No encryption support for xfs
generic/400 0s ...  0s
generic/401 1s ...  0s
generic/402 1s ...  1s
generic/403 1s ...  1s
generic/404 11s ...  10s
generic/405 62s ...  63s
generic/406 1s ...  1s
generic/407 2s ...  2s
generic/408 2s ...  2s
generic/409 7s ...  6s
generic/410 13s ... umount: /mnt/test: target is busy.
_check_xfs_filesystem: filesystem on /dev/sdb1 has dirty log
(see /home/test/git/xfstests/results//generic/410.full for details)
xfs_check: /dev/sdb1 contains a mounted and writable filesystem

fatal error -- couldn't initialize XFS library
_check_xfs_filesystem: filesystem on /dev/sdb1 is inconsistent (r)
(see /home/test/git/xfstests/results//generic/410.full for details)
- output mismatch (see /home/test/git/xfstests/results//generic/410.out.bad)
    --- tests/generic/410.out	2021-02-28 21:47:48.618581629 -0600
    +++ /home/test/git/xfstests/results//generic/410.out.bad	2021-04-11 23:19:03.934425780 -0500
    __ -207,6 +207,8 __
     mpC SCRATCH_DEV
     mpC/dir SCRATCH_DEV
     ======
    +umount: /mnt/test/410: target is busy.
    +mount: /mnt/test/410: /dev/sdb2 already mounted on /mnt/test/410.
     make-shared a unbindable mount
     before make-shared run on unbindable
    ...
    (Run 'diff -u /home/test/git/xfstests/tests/generic/410.out /home/test/git/xfstests/results//generic/410.out.bad'  to see the entire diff)
generic/411 1s ...  2s
generic/412 1s ...  0s
generic/413	[not run] mount /dev/sdb2 with dax failed
generic/414 1s ...  1s
generic/415 48s ...  49s
generic/416 107s ...  104s
generic/417 11s ...  12s
generic/418 20s ...  19s
generic/419	[not run] No encryption support for xfs
generic/420 1s ...  1s
generic/421	[not run] No encryption support for xfs
generic/422 1s ...  1s
generic/423 1s ...  1s
generic/424 1s ...  1s
generic/425 2s ...  2s
generic/426 2s ...  1s
generic/427 3s ...  3s
generic/428 2s ...  1s
generic/429	[not run] No encryption support for xfs
generic/430 1s ...  1s
generic/431 1s ...  0s
generic/432 2s ...  1s
generic/433 1s ...  1s
generic/434 1s ...  1s
generic/435	[not run] No encryption support for xfs
generic/436 0s ...  1s
generic/437 29s ...  6s
generic/438 91s ...  92s
generic/439 2s ...  2s
generic/440	[not run] No encryption support for xfs
generic/441 2s ...  2s
generic/442 1s ...  1s
generic/443 2s ...  1s
generic/444 1s ...  0s
generic/445 1s ...  1s
generic/446 8s ...  9s
generic/447 29s ...  29s
generic/448 2s ...  1s
generic/449 20s ...  21s
generic/450 1s ...  1s
generic/451 31s ...  31s
generic/452 1s ...  1s
generic/453 1s ...  0s
generic/454 1s ...  1s
generic/455	[not run] This test requires a valid $LOGWRITES_DEV
generic/456 1s ...  1s
generic/457	[not run] This test requires a valid $LOGWRITES_DEV
generic/458 1s ...  0s
generic/459	[not run] lvm utility required, skipped this test
generic/460 2s ...  1s
generic/461 21s ...  21s
generic/462	[not run] mount /dev/sdb2 with dax failed
generic/463 2s ...  1s
generic/464 55s ...  54s
generic/465 6s ...  5s
generic/466 2s ... [failed, exit status 1]- output mismatch (see /home/test/git/xfstests/results//generic/466.out.bad)
    --- tests/generic/466.out	2021-02-28 21:47:48.618581629 -0600
    +++ /home/test/git/xfstests/results//generic/466.out.bad	2021-04-11 23:27:16.513071107 -0500
    __ -1,2 +1,6 __
     QA output created by 466
     Silence is golden
    +umount: /mnt/scratch: target is busy.
    +mount: /mnt/scratch: /dev/sdb2 already mounted on /mnt/scratch.
    +cycle mount failed
    +(see /home/test/git/xfstests/results//generic/466.full for details)
    ...
    (Run 'diff -u /home/test/git/xfstests/tests/generic/466.out /home/test/git/xfstests/results//generic/466.out.bad'  to see the entire diff)
generic/467 2s ...  1s
generic/468 1s ...  2s
generic/469 2s ...  1s
generic/470	[not run] This test requires a valid $LOGWRITES_DEV
generic/471 2s ...  1s
generic/472 1s ...  1s
generic/473	- output mismatch (see /home/test/git/xfstests/results//generic/473.out.bad)
    --- tests/generic/473.out	2021-02-28 21:47:48.618581629 -0600
    +++ /home/test/git/xfstests/results//generic/473.out.bad	2021-04-11 23:27:24.941312327 -0500
    __ -6,7 +6,7 __
     1: [256..287]: hole
     Hole + Data
     0: [0..127]: hole
    -1: [128..255]: data
    +1: [128..135]: data
     Hole + Data + Hole
     0: [0..127]: hole
    ...
    (Run 'diff -u /home/test/git/xfstests/tests/generic/473.out /home/test/git/xfstests/results//generic/473.out.bad'  to see the entire diff)
generic/474 0s ...  1s
generic/475 98s ...  81s
generic/476 179s ...  174s
generic/477 4s ...  2s
generic/478 8s ...  8s
generic/479 2s ...  2s
generic/480 2s ...  1s
generic/481 1s ...  1s
generic/482	[not run] This test requires a valid $LOGWRITES_DEV
generic/483 5s ...  5s
generic/484 2s ...  1s
generic/485 2s ...  1s
generic/486 1s ...  1s
generic/487	[not run] This test requires a valid $SCRATCH_LOGDEV
generic/488 2s ...  1s
generic/489 1s ...  0s
generic/490 2s ...  0s
generic/491 1s ...  1s
generic/492 1s ...  1s
generic/493 2s ...  1s
generic/494 2s ...  1s
generic/495 1s ...  1s
generic/496 3s ...  2s
generic/497 1s ...  1s
generic/498 1s ...  1s
generic/499 1s ...  1s
generic/500	[not run] FITRIM not supported on /mnt/scratch
generic/501 33s ...  33s
generic/502 1s ...  1s
generic/503 7s ...  6s
generic/504 1s ...  0s
generic/505 1s ...  1s
generic/506 2s ...  1s
generic/507	[not run] file system doesn't support chattr +AsSu
generic/508 1s ...  1s
generic/509 1s ...  1s
generic/510 1s ...  0s
generic/511 2s ...  1s
generic/512 1s ...  0s
generic/513 2s ...  2s
generic/514 2s ...  2s
generic/515 1s ...  1s
generic/516 1s ...  1s
generic/517 1s ...  1s
generic/518 1s ...  1s
generic/519 1s ...  1s
generic/520 12s ...  12s
generic/521 549s ...  560s
generic/522 606s ...  616s
generic/523 0s ...  1s
generic/524 2s ...  3s
generic/525 1s ...  0s
generic/526 1s ...  0s
generic/527 1s ...  1s
generic/528 1s ...  1s
generic/529 1s ...  1s
generic/530 3s ...  4s
generic/531 284s ...  269s
generic/532 1s ...  1s
generic/533 0s ...  1s
generic/534 0s ...  1s
generic/535 1s ...  1s
generic/536 1s ...  1s
generic/537	[not run] FSTRIM not supported
generic/538 2s ...  1s
generic/539 1s ...  1s
generic/540 1s ...  2s
generic/541 2s ...  1s
generic/542 1s ...  1s
generic/543 2s ...  2s
generic/544 2s ...  2s
generic/545 1s ...  1s
generic/546 2s ...  1s
generic/547 1s ...  2s
generic/548	[not run] No encryption support for xfs
generic/549	[not run] No encryption support for xfs
generic/550	[not run] No encryption support for xfs
generic/551 57s ...  58s
generic/552 1s ...  1s
generic/553 1s ...  1s
generic/554 1s ...  1s
generic/555 1s ...  1s
generic/556	[not run] xfs does not support casefold feature
generic/557 1s ...  2s
generic/558 69s ...  69s
generic/559	[not run] duperemove utility required, skipped this test
generic/560	[not run] duperemove utility required, skipped this test
generic/561	[not run] duperemove utility required, skipped this test
generic/562 94s ...  92s
generic/563	[not run] cgroup2 not mounted on /sys/fs/cgroup
generic/564 1s ...  1s
generic/565 1s ...  1s
generic/566 9s ...  7s
generic/567 0s ...  1s
generic/568 1s ...  1s
generic/569 1s ...  1s
generic/570	[not run] userspace hibernation to swap is enabled
generic/571 7s ...  7s
generic/572	[not run] fsverity utility required, skipped this test
generic/573	[not run] fsverity utility required, skipped this test
generic/574	[not run] fsverity utility required, skipped this test
generic/575	[not run] fsverity utility required, skipped this test
generic/576	[not run] fsverity utility required, skipped this test
generic/577	[not run] fsverity utility required, skipped this test
generic/578 1s ...  1s
generic/579	[not run] fsverity utility required, skipped this test
generic/580	[not run] No encryption support for xfs
generic/581	[not run] No encryption support for xfs
generic/582	[not run] No encryption support for xfs
generic/583	[not run] No encryption support for xfs
generic/584	[not run] No encryption support for xfs
generic/585 2s ...  1s
generic/586 7s ...  5s
generic/587 2s ...  1s
generic/588 2s ...  2s
generic/589 8s ...  7s
generic/590 19s ...  23s
generic/591 1s ...  1s
generic/592	[not run] No encryption support for xfs
generic/593	[not run] No encryption support for xfs
generic/594	- output mismatch (see /home/test/git/xfstests/results//generic/594.out.bad)
    --- tests/generic/594.out	2021-02-28 21:47:48.622581352 -0600
    +++ /home/test/git/xfstests/results//generic/594.out.bad	2021-04-12 00:02:58.035667398 -0500
    __ -5,31 +5,31 __
     *** Report for group quotas on device SCRATCH_DEV
     Block grace time: DEF_TIME; Inode grace time: DEF_TIME
     *** Report for project quotas on device SCRATCH_DEV
    -Block grace time: 00:10; Inode grace time: 00:20
    +Block grace time: DEF_TIME; Inode grace time: DEF_TIME
     
     2. set group quota timer
    ...
    (Run 'diff -u /home/test/git/xfstests/tests/generic/594.out /home/test/git/xfstests/results//generic/594.out.bad'  to see the entire diff)
generic/595	[not run] No encryption support for xfs
generic/596	[not run] accton utility required, skipped this test
generic/597 23s ...  2s
generic/598 1s ...  1s
generic/599 1s ...  1s
generic/600	- output mismatch (see /home/test/git/xfstests/results//generic/600.out.bad)
    --- tests/generic/600.out	2021-02-28 21:47:48.622581352 -0600
    +++ /home/test/git/xfstests/results//generic/600.out.bad	2021-04-12 00:03:10.805194828 -0500
    __ -1,2 +1,3 __
     QA output created by 600
     Silence is golden
    +set grace to 1618203890 but got grace 1618203788
    ...
    (Run 'diff -u /home/test/git/xfstests/tests/generic/600.out /home/test/git/xfstests/results//generic/600.out.bad'  to see the entire diff)
generic/601	[not run] xfs_quota does not support individual grace extension
generic/602	[not run] No encryption support for xfs
generic/603 61s ...  56s
generic/604 2s ...  2s
generic/605	[not run] mount /dev/sdb2 with dax=always failed
generic/606	[not run] mount /dev/sdb2 with dax=always failed
generic/607 1s ...  1s
generic/608	[not run] mount /dev/sdb2 with dax=always failed
generic/609 0s ...  1s
generic/610 4s ...  5s
generic/611 1s ...  1s
generic/612 1s ...  1s
generic/613	[not run] No encryption support for xfs
generic/614 1s ...  1s
generic/615 26s ...  24s
generic/616 62s ...  63s
generic/617 12s ...  12s
generic/618	[not run] test requires XFS bug_on_assert to be off, turn it off to run the test
generic/619 14s ...  14s
generic/620 2s ...  2s
generic/621	[not run] No encryption support for xfs
generic/622 23s ...  23s
shared/002 13s ...  12s
shared/032 54s ...  57s
shared/298 12s ...  12s
xfs/001 2s ...  2s
xfs/002 1s ...  1s
xfs/003 4s ...  5s
xfs/004 1s ...  0s
xfs/005 1s ...  1s
xfs/006 2s ...  3s
xfs/007 1s ...  1s
xfs/008 1s ...  1s
xfs/009 1s ...  1s
xfs/010 2s ...  2s
xfs/011 18s ...  17s
xfs/012 1s ...  1s
xfs/013 129s ...  125s
xfs/014 3s ...  2s
xfs/015 3s ...  3s
xfs/016 32s ...  32s
xfs/017 3s ...  3s
xfs/018	- output mismatch (see /home/test/git/xfstests/results//xfs/018.out.bad)
    --- tests/xfs/018.out	2021-02-28 21:47:48.634580518 -0600
    +++ /home/test/git/xfstests/results//xfs/018.out.bad	2021-04-12 00:11:44.651612557 -0500
    __ -1,17 +1,9 __
     QA output created by 018
     *** init FS
    -*** compare logprint: 018.op with 018.fulldir/op.mnt-onoalign,logbsize=32k.mkfs-lsize=2000b-llazy-count=1-lversion=1.filtered
    -*** compare logprint: 018.trans_inode with 018.fulldir/trans_inode.mnt-onoalign,logbsize=32k.mkfs-lsize=2000b-llazy-count=1-lversion=1.filtered
    -*** compare logprint: 018.trans_buf with 018.fulldir/trans_buf.mnt-onoalign,logbsize=32k.mkfs-lsize=2000b-llazy-count=1-lversion=1.filtered
    -*** compare logprint: 018.op with 018.fulldir/op.mnt-onoalign,logbsize=32k.mkfs-lsize=2000b-llazy-count=1-lversion=2.filtered
    -*** compare logprint: 018.trans_inode with 018.fulldir/trans_inode.mnt-onoalign,logbsize=32k.mkfs-lsize=2000b-llazy-count=1-lversion=2.filtered
    ...
    (Run 'diff -u /home/test/git/xfstests/tests/xfs/018.out /home/test/git/xfstests/results//xfs/018.out.bad'  to see the entire diff)
xfs/019 1s ...  1s
xfs/020 1s ...  1s
xfs/021 0s ...  1s
xfs/022	[not run] xfsdump not found
xfs/023	[not run] xfsdump not found
xfs/024	[not run] xfsdump not found
xfs/025	[not run] xfsdump not found
xfs/026	[not run] xfsdump not found
xfs/027	[not run] xfsdump not found
xfs/028	[not run] xfsdump not found
xfs/029 0s ...  1s
xfs/030	- output mismatch (see /home/test/git/xfstests/results//xfs/030.out.bad)
    --- tests/xfs/030.out	2021-02-28 21:47:48.634580518 -0600
    +++ /home/test/git/xfstests/results//xfs/030.out.bad	2021-04-12 00:11:53.808251452 -0500
    __ -105,7 +105,6 __
     Phase 2 - using <TYPEOF> log
             - zero log...
             - scan filesystem freespace and inode maps...
    -bad agbno AGBNO in agfl, agno 0
             - found root inode chunk
     Phase 3 - for each AG...
             - scan and clear agi unlinked lists...
    ...
    (Run 'diff -u /home/test/git/xfstests/tests/xfs/030.out /home/test/git/xfstests/results//xfs/030.out.bad'  to see the entire diff)
xfs/031 3s ...  4s
xfs/032 4s ...  5s
xfs/033 3s ...  2s
xfs/034 1s ...  0s
xfs/035	[not run] xfsdump not found
xfs/036	[not run] xfsdump not found
xfs/037	[not run] xfsdump not found
xfs/038	[not run] xfsdump not found
xfs/039	[not run] xfsdump not found
xfs/040	[not run] Can't run libxfs-diff without KWORKAREA set
xfs/041 12s ...  12s
xfs/042 13s ...  14s
xfs/043	[not run] xfsdump not found
xfs/044	[not run] This test requires a valid $SCRATCH_LOGDEV
xfs/045 1s ...  1s
xfs/046	[not run] xfsdump not found
xfs/047	[not run] xfsdump not found
xfs/048 0s ...  1s
xfs/049 2s ...  2s
xfs/050 4s ...  4s
xfs/051 17s ...  18s
xfs/052 1s ...  1s
xfs/053 0s ...  0s
xfs/054 1s ...  1s
xfs/055	[not run] xfsdump not found
xfs/056	[not run] xfsdump not found
xfs/057 17s ...  17s
xfs/058 1s ...  1s
xfs/059	[not run] xfsdump not found
xfs/060	[not run] xfsdump not found
xfs/061	[not run] xfsdump not found
xfs/062 4s ...  4s
xfs/063	[not run] xfsdump not found
xfs/064	[not run] xfsdump not found
xfs/065	[not run] xfsdump not found
xfs/066	[not run] xfsdump not found
xfs/067 0s ...  1s
xfs/068	[not run] xfsdump not found
xfs/069 1s ...  2s
xfs/070 1s ...  1s
xfs/071 1s ...  1s
xfs/072 1s ...  1s
xfs/073	- output mismatch (see /home/test/git/xfstests/results//xfs/073.out.bad)
    --- tests/xfs/073.out	2021-02-28 21:47:48.638580241 -0600
    +++ /home/test/git/xfstests/results//xfs/073.out.bad	2021-04-12 00:13:43.063547248 -0500
    __ -14,6 +14,14 __
     comparing new image files to old
     comparing new image directories to old
     comparing new image geometry to old
    +--- /tmp/2751531.geometry1	2021-04-12 00:13:38.127229711 -0500
    ++++ /tmp/2751531.geometry2	2021-04-12 00:13:38.135230226 -0500
    +__ -1,4 +1,4 __
    +-meta-data=<DEVIMAGE> isize=512 agcount=2, agsize=5248 blks
    ...
    (Run 'diff -u /home/test/git/xfstests/tests/xfs/073.out /home/test/git/xfstests/results//xfs/073.out.bad'  to see the entire diff)
xfs/074 3s ...  2s
xfs/075 0s ...  1s
xfs/076 34s ...  34s
xfs/077 3s ...  3s
xfs/078 5s ...  4s
xfs/079 12s ...  12s
xfs/080 2s ...  2s
xfs/081	[failed, exit status 1]- output mismatch (see /home/test/git/xfstests/results//xfs/081.out.bad)
    --- tests/xfs/081.out	2021-02-28 21:47:48.638580241 -0600
    +++ /home/test/git/xfstests/results//xfs/081.out.bad	2021-04-12 00:14:42.615297160 -0500
    __ -1,4 +1,10 __
     QA output created by 081
     *** init FS
    -*** compare logprint: 081.ugquota.trans_inode with 081.fulldir/trans_inode.mnt-oquota,gquota.mkfs-lsize=2000b-llazy-count=1-lversion=1.filtered
    +
    +*** Cannot mkfs for this test using option specified: -l size=2000b -l lazy-count=1 -l version=1 ***
    +
    +*** compare logprint: 081.ugquota.trans_inode with /home/test/git/xfstests/results//xfs/081.fulldir/trans_inode.mnt-oquota,gquota.mkfs-lsize=2000b-llazy-count=1-lversion=1.filtered
    ...
    (Run 'diff -u /home/test/git/xfstests/tests/xfs/081.out /home/test/git/xfstests/results//xfs/081.out.bad'  to see the entire diff)
xfs/082	- output mismatch (see /home/test/git/xfstests/results//xfs/082.out.bad)
    --- tests/xfs/082.out	2021-02-28 21:47:48.638580241 -0600
    +++ /home/test/git/xfstests/results//xfs/082.out.bad	2021-04-12 00:14:44.655423093 -0500
    __ -1,39 +1,11 __
     QA output created by 082
     *** init FS
     --- mkfs=version=2, mnt=logbsize=32k, sync=sync ---
    -*** compare logprint: 082.trans_inode with 082.fulldir/trans_inode.mnt-ologbsize=32k.mkfs-lsize=2000b-llazy-count=1-lversion=2.sync.filtered
    -*** compare logprint: 082.trans_buf with 082.fulldir/trans_buf.mnt-ologbsize=32k.mkfs-lsize=2000b-llazy-count=1-lversion=2.sync.filtered
    ---- mkfs=version=2,su=4096, mnt=logbsize=32k, sync=sync ---
    -*** compare logprint: 082.trans_inode with 082.fulldir/trans_inode.mnt-ologbsize=32k.mkfs-lsize=2000b-llazy-count=1-lversion=2,su=4096.sync.filtered
    ...
    (Run 'diff -u /home/test/git/xfstests/tests/xfs/082.out /home/test/git/xfstests/results//xfs/082.out.bad'  to see the entire diff)
xfs/083 394s ...  382s
xfs/084 60s ...  62s
xfs/085 3s ...  3s
xfs/086 4s ...  3s
xfs/087 3s ...  3s
xfs/088 3s ...  4s
xfs/089 4s ...  4s
xfs/090	[not run] External volumes not in use, skipped this test
xfs/091 3s ...  3s
xfs/092 1s ...  1s
xfs/093 3s ...  4s
xfs/094	[not run] External volumes not in use, skipped this test
xfs/095 1s ...  1s
xfs/096	[not run] Requires older mkfs without strict input checks: the last supported version of xfsprogs is 4.5.
xfs/097 3s ...  3s
xfs/098	[not run] test requires XFS bug_on_assert to be off, turn it off to run the test
xfs/099 1s ...  1s
xfs/100 3s ...  2s
xfs/101 2s ...  3s
xfs/102 8s ...  7s
xfs/103 1s ...  0s
xfs/104 13s ...  12s
xfs/105 7s ...  7s
xfs/106 17s ...  16s
xfs/107	- output mismatch (see /home/test/git/xfstests/results//xfs/107.out.bad)
    --- tests/xfs/107.out	2021-02-28 21:47:48.638580241 -0600
    +++ /home/test/git/xfstests/results//xfs/107.out.bad	2021-04-12 00:23:49.084870953 -0500
    __ -9,6 +9,32 __
     ### populate filesystem
     ### initial report
     [SCR_DEV] ([SCR_MNT]) Project:
    +   96532    #0      
    +    5004    #3      
    +    4356    #1      
    +    3876    #2      
    ...
    (Run 'diff -u /home/test/git/xfstests/tests/xfs/107.out /home/test/git/xfstests/results//xfs/107.out.bad'  to see the entire diff)
xfs/108 1s ...  1s
xfs/109 21s ...  24s
xfs/110 3s ...  3s
xfs/111 4s ...  4s
xfs/112 7s ...  6s
xfs/113 44s ...  47s
xfs/114	[not run] rmapbt not supported by scratch filesystem type: xfs
xfs/115	[not run] test requires XFS bug_on_assert to be off, turn it off to run the test
xfs/116 1s ...  1s
xfs/117 4s ...  3s
xfs/118 10s ...  9s
xfs/119 3s ...  3s
xfs/120 3s ...  3s
xfs/121 6s ...  6s
xfs/122	[not run] indent utility required, skipped this test
xfs/123 2s ... [failed, exit status 1]- output mismatch (see /home/test/git/xfstests/results//xfs/123.out.bad)
    --- tests/xfs/123.out	2021-02-28 21:47:48.642579963 -0600
    +++ /home/test/git/xfstests/results//xfs/123.out.bad	2021-04-12 00:25:41.274261417 -0500
    __ -3,9 +3,7 __
     + mount fs image
     + make some files
     file contents: moo
    +umount: /mnt/scratch: target is busy.
     + check fs
    -+ corrupt image
    -+ mount image
    ...
    (Run 'diff -u /home/test/git/xfstests/tests/xfs/123.out /home/test/git/xfstests/results//xfs/123.out.bad'  to see the entire diff)
xfs/124 2s ...  1s
xfs/125 4s ...  4s
xfs/126 4s ...  3s
xfs/127 2s ...  2s
xfs/128 8s ...  9s
xfs/129 4s ...  3s
xfs/130 2s ...  1s
xfs/131	[not run] External volumes not in use, skipped this test
xfs/132 0s ...  1s
xfs/133 1s ...  1s
xfs/134 1s ...  0s
xfs/135 2s ...  2s
xfs/136	- output mismatch (see /home/test/git/xfstests/results//xfs/136.out.bad)
    --- tests/xfs/136.out	2021-02-28 21:47:48.642579963 -0600
    +++ /home/test/git/xfstests/results//xfs/136.out.bad	2021-04-12 00:48:25.823406767 -0500
    __ -1,5 +1,5 __
     QA output created by 136
    -inum=67
    +inum=131
     core.format = 2 (extents)
     core.size = 0
     core.extsize = 0
    __ -7,6 +7,7 __
    ...
    (Run 'diff -u /home/test/git/xfstests/tests/xfs/136.out /home/test/git/xfstests/results//xfs/136.out.bad'  to see the entire diff)
xfs/137 4s ...  4s
xfs/138 3s ...  3s
xfs/139 6s ...  5s
xfs/140 47s ...  45s
xfs/141 9s ...  12s
xfs/142	[not run] Assuming DMAPI modules are not loaded
xfs/143	[not run] Assuming DMAPI modules are not loaded
xfs/144	[not run] Assuming DMAPI modules are not loaded
xfs/145	[not run] Assuming DMAPI modules are not loaded
xfs/146	[not run] Assuming DMAPI modules are not loaded
xfs/147	[not run] Assuming DMAPI modules are not loaded
xfs/148 3s ...  1s
xfs/149 2s ...  1s
xfs/150	[not run] Assuming DMAPI modules are not loaded
xfs/151	[not run] Assuming DMAPI modules are not loaded
xfs/152	[not run] Assuming DMAPI modules are not loaded
xfs/153	[not run] Assuming DMAPI modules are not loaded
xfs/154	[not run] Assuming DMAPI modules are not loaded
xfs/155	[not run] Assuming DMAPI modules are not loaded
xfs/156	[not run] Assuming DMAPI modules are not loaded
xfs/157	[not run] Assuming DMAPI modules are not loaded
xfs/158	[not run] Assuming DMAPI modules are not loaded
xfs/159	[not run] Assuming DMAPI modules are not loaded
xfs/160	[not run] Assuming DMAPI modules are not loaded
xfs/161	[not run] Assuming DMAPI modules are not loaded
xfs/162	[not run] Assuming DMAPI modules are not loaded
xfs/163	[not run] Assuming DMAPI modules are not loaded
xfs/164 1s ...  1s
xfs/165 1s ...  1s
xfs/166 1s ...  0s
xfs/167 62s ...  61s
xfs/168	[not run] Assuming DMAPI modules are not loaded
xfs/169 15s ...  16s
xfs/170 3s ...  2s
xfs/171 17s ...  18s
xfs/172	[failed, exit status 1]- output mismatch (see /home/test/git/xfstests/results//xfs/172.out.bad)
    --- tests/xfs/172.out	2021-02-28 21:47:48.642579963 -0600
    +++ /home/test/git/xfstests/results//xfs/172.out.bad	2021-04-12 00:51:27.328872669 -0500
    __ -3,9 +3,5 __
     # streaming
     # sync AGs...
     # checking stream AGs...
    -+ expected failure, matching AGs
    -# testing 64 16 20 10 1 0 1 ....
    -# streaming
    -# sync AGs...
    ...
    (Run 'diff -u /home/test/git/xfstests/tests/xfs/172.out /home/test/git/xfstests/results//xfs/172.out.bad'  to see the entire diff)
xfs/173 8s ...  8s
xfs/174 4s ...  3s
xfs/175	[not run] Assuming DMAPI modules are not loaded
xfs/176	[not run] Assuming DMAPI modules are not loaded
xfs/177	[not run] Assuming DMAPI modules are not loaded
xfs/178 1s ...  1s
xfs/179 1s ...  1s
xfs/180 1s ...  1s
xfs/181 11s ...  11s
xfs/182 2s ...  2s
xfs/183 3s ...  3s
xfs/184 2s ...  2s
xfs/185	[not run] Assuming DMAPI modules are not loaded
xfs/186	[not run] attr v1 not supported on /dev/sdb2
xfs/187	[not run] attr v1 not supported on /dev/sdb2
xfs/188 10s ...  9s
xfs/189	[not run] noattr2 mount option not supported on /dev/sdb2
xfs/190 1s ...  1s
xfs/191-input-validation 6s ...  4s
xfs/192 2s ...  2s
xfs/193 2s ...  1s
xfs/194 1s ...  1s
xfs/195	[not run] xfsdump utility required, skipped this test
xfs/196 1s ...  1s
xfs/197	[not run] This test is only valid on 32 bit machines
xfs/198 2s ...  1s
xfs/199 1s ...  1s
xfs/200 2s ...  2s
xfs/201 1s ...  1s
xfs/202 1s ...  1s
xfs/203 2s ...  1s
xfs/204 2s ...  2s
xfs/205 2s ...  2s
xfs/206 2s ...  1s
xfs/207 2s ...  1s
xfs/208 2s ...  2s
xfs/209 1s ...  1s
xfs/210 2s ...  1s
xfs/211 217s ...  228s
xfs/212 2s ...  1s
xfs/213 3s ...  4s
xfs/214 6s ...  3s
xfs/215 1s ...  2s
xfs/216 2s ...  2s
xfs/217 1s ...  1s
xfs/218 2s ...  2s
xfs/219 2s ...  1s
xfs/220 1s ...  1s
xfs/221 2s ...  2s
xfs/222 3s ...  1s
xfs/223 2s ...  2s
xfs/224 2s ...  1s
xfs/225 2s ...  2s
xfs/226 1s ...  1s
xfs/227 299s ...  294s
xfs/228 2s ...  1s
xfs/229 9s ...  8s
xfs/230 2s ...  2s
xfs/231 4s ...  5s
xfs/232 4s ...  4s
xfs/233	[not run] rmapbt not supported by scratch filesystem type: xfs
xfs/234	[not run] rmapbt not supported by scratch filesystem type: xfs
xfs/235	[not run] rmapbt not supported by scratch filesystem type: xfs
xfs/236	[not run] rmapbt not supported by scratch filesystem type: xfs
xfs/237 2s ...  2s
xfs/238 2s ...  1s
xfs/239 1s ...  2s
xfs/240 3s ...  2s
xfs/241 1s ...  2s
xfs/242 2s ...  1s
xfs/243 1s ...  1s
xfs/244	[not run] 16 bit project IDs not supported on /dev/sdb2
xfs/245 1s ...  1s
xfs/246 0s ...  1s
xfs/247 1s ...  0s
xfs/248 2s ...  2s
xfs/249 1s ...  1s
xfs/250 8s ...  7s
xfs/251 2s ...  2s
xfs/252 2s ...  2s
xfs/253 2s ...  2s
xfs/254 1s ...  1s
xfs/255 2s ...  2s
xfs/256 1s ...  1s
xfs/257 2s ...  2s
xfs/258 2s ...  2s
xfs/259 3s ...  3s
xfs/260 1s ...  1s
xfs/261 1s ...  0s
xfs/262	- output mismatch (see /home/test/git/xfstests/results//xfs/262.out.bad)
    --- tests/xfs/262.out	2021-02-28 21:47:48.650579408 -0600
    +++ /home/test/git/xfstests/results//xfs/262.out.bad	2021-04-12 01:03:02.923150108 -0500
    __ -1,3 +1,5 __
     QA output created by 262
     Format and populate
     Force online repairs
    +Error: /mnt/scratch: Kernel metadata scrubbing facility is not available. (phase1.c line 147)
    +/mnt/scratch: operational errors found: 1
    ...
    (Run 'diff -u /home/test/git/xfstests/tests/xfs/262.out /home/test/git/xfstests/results//xfs/262.out.bad'  to see the entire diff)
xfs/263 1s ...  2s
xfs/264 6s ...  5s
xfs/265 8s ...  7s
xfs/266	[not run] xfsdump not found
xfs/267	[not run] xfsdump not found
xfs/268	[not run] xfsdump not found
xfs/269 1s ...  1s
xfs/270 1s ...  1s
xfs/271	[not run] rmapbt not supported by scratch filesystem type: xfs
xfs/272	[not run] rmapbt not supported by scratch filesystem type: xfs
xfs/273 4s ...  116s
xfs/274	[not run] rmapbt not supported by scratch filesystem type: xfs
xfs/275	[not run] This test requires a valid $SCRATCH_LOGDEV
xfs/276	[not run] External volumes not in use, skipped this test
xfs/277	[not run] rmapbt not supported by scratch filesystem type: xfs
xfs/278 1s ...  1s
xfs/279 10s ...  9s
xfs/280 1s ...  2s
xfs/281	[not run] xfsdump not found
xfs/282	[not run] xfsdump not found
xfs/283	[not run] xfsdump not found
xfs/284 1s ...  1s
xfs/285	- output mismatch (see /home/test/git/xfstests/results//xfs/285.out.bad)
    --- tests/xfs/285.out	2021-02-28 21:47:48.650579408 -0600
    +++ /home/test/git/xfstests/results//xfs/285.out.bad	2021-04-12 01:06:37.689415191 -0500
    __ -1,4 +1,6 __
     QA output created by 285
     Format and populate
    +Error: /mnt/scratch: Kernel metadata scrubbing facility is not available. (phase1.c line 147)
    +/mnt/scratch: operational errors found: 1
     Concurrent scrub
     Test done
    ...
    (Run 'diff -u /home/test/git/xfstests/tests/xfs/285.out /home/test/git/xfstests/results//xfs/285.out.bad'  to see the entire diff)
xfs/286	- output mismatch (see /home/test/git/xfstests/results//xfs/286.out.bad)
    --- tests/xfs/286.out	2021-02-28 21:47:48.650579408 -0600
    +++ /home/test/git/xfstests/results//xfs/286.out.bad	2021-04-12 01:07:41.784464380 -0500
    __ -1,4 +1,132 __
     QA output created by 286
     Format and populate
    +Error: /mnt/scratch: Kernel metadata scrubbing facility is not available. (phase1.c line 147)
    +/mnt/scratch: operational errors found: 1
     Concurrent repair
    +Error: /mnt/scratch: Kernel metadata scrubbing facility is not available. (phase1.c line 147)
    +/mnt/scratch: operational errors found: 1
    ...
    (Run 'diff -u /home/test/git/xfstests/tests/xfs/286.out /home/test/git/xfstests/results//xfs/286.out.bad'  to see the entire diff)
xfs/287	[not run] xfsdump not found
xfs/288 0s ...  1s
xfs/289 1s ...  1s
xfs/290 0s ...  1s
xfs/291 45s ...  49s
xfs/292 1s ...  1s
xfs/293 0s ...  0s
xfs/294 17s ...  16s
xfs/295 8s ...  10s
xfs/296	[not run] xfsdump not found
xfs/297 38s ...  43s
xfs/298 3s ...  3s
xfs/299 4s ...  4s
xfs/300	[not run] SELinux not enabled
xfs/301	[not run] xfsdump not found
xfs/302	[not run] xfsdump not found
xfs/303 1s ...  0s
xfs/304 1s ... - output mismatch (see /home/test/git/xfstests/results//xfs/304.out.bad)
    --- tests/xfs/304.out	2021-02-28 21:47:48.650579408 -0600
    +++ /home/test/git/xfstests/results//xfs/304.out.bad	2021-04-12 01:09:55.442806556 -0500
    __ -3,5 +3,6 __
     *** umount
     *** turn off project quotas
     *** umount
    +umount: /mnt/scratch: target is busy.
     *** turn off group/project quotas
     *** umount
    ...
    (Run 'diff -u /home/test/git/xfstests/tests/xfs/304.out /home/test/git/xfstests/results//xfs/304.out.bad'  to see the entire diff)
xfs/305 65s ...  65s
xfs/306 12s ...  12s
xfs/307 2s ...  2s
xfs/308 1s ...  1s
xfs/309 8s ...  8s
xfs/310	[not run] rmapbt not supported by scratch filesystem type: xfs
xfs/311 21s ...  22s
xfs/312 2s ...  1s
xfs/313 1s ...  1s
xfs/314	[not run] rmapbt not supported by scratch filesystem type: xfs
xfs/315 1s ...  1s
xfs/316 1s ...  1s
xfs/317	[not run] rmapbt not supported by scratch filesystem type: xfs
xfs/318 0s ...  1s
xfs/319 2s ...  1s
xfs/320 1s ...  1s
xfs/321 1s ...  1s
xfs/322	[not run] rmapbt not supported by scratch filesystem type: xfs
xfs/323 1s ...  1s
xfs/324 1s ...  1s
xfs/325 1s ...  1s
xfs/326 2s ...  1s
xfs/327 1s ...  2s
xfs/328 30s ...  28s
xfs/329	[not run] rmapbt not supported by scratch filesystem type: xfs
xfs/330 1s ...  1s
xfs/331	[not run] rmapbt not supported by scratch filesystem type: xfs
xfs/332	[not run] rmapbt not supported by scratch filesystem type: xfs
xfs/333	[not run] rmapbt not supported by scratch filesystem type: xfs
xfs/334	[not run] External volumes not in use, skipped this test
xfs/335	[not run] External volumes not in use, skipped this test
xfs/336	[not run] External volumes not in use, skipped this test
xfs/337	[not run] External volumes not in use, skipped this test
xfs/338	[not run] External volumes not in use, skipped this test
xfs/339	[not run] External volumes not in use, skipped this test
xfs/340	[not run] External volumes not in use, skipped this test
xfs/341	[not run] External volumes not in use, skipped this test
xfs/342	[not run] External volumes not in use, skipped this test
xfs/343	[not run] External volumes not in use, skipped this test
xfs/344 1s ...  1s
xfs/345 2s ...  2s
xfs/346 5s ...  6s
xfs/347	- output mismatch (see /home/test/git/xfstests/results//xfs/347.out.bad)
    --- tests/xfs/347.out	2021-02-28 21:47:48.654579130 -0600
    +++ /home/test/git/xfstests/results//xfs/347.out.bad	2021-04-12 01:12:50.420814520 -0500
    __ -5,6 +5,10 __
     2909feb63a37b0e95fe5cfb7f274f7b1  SCRATCH_MNT/test-347/file1
     2909feb63a37b0e95fe5cfb7f274f7b1  SCRATCH_MNT/test-347/file2
     CoW and unmount
    +umount: /mnt/scratch: target is busy.
    +mount: /mnt/scratch: /dev/sdb2 already mounted on /mnt/scratch.
    +cycle mount failed
    +(see /home/test/git/xfstests/results//xfs/347.full for details)
    ...
    (Run 'diff -u /home/test/git/xfstests/tests/xfs/347.out /home/test/git/xfstests/results//xfs/347.out.bad'  to see the entire diff)
xfs/348 7s ...  7s
xfs/349	- output mismatch (see /home/test/git/xfstests/results//xfs/349.out.bad)
    --- tests/xfs/349.out	2021-02-28 21:47:48.654579130 -0600
    +++ /home/test/git/xfstests/results//xfs/349.out.bad	2021-04-12 01:13:00.413385104 -0500
    __ -1,3 +1,5 __
     QA output created by 349
     Format and populate
     Scrub
    +Error: /mnt/scratch: Kernel metadata scrubbing facility is not available. (phase1.c line 147)
    +/mnt/scratch: operational errors found: 1
    ...
    (Run 'diff -u /home/test/git/xfstests/tests/xfs/349.out /home/test/git/xfstests/results//xfs/349.out.bad'  to see the entire diff)
xfs/350	

Other tests might need to be run in order to verify everything is working
as expected. For such tests, the intervention of the maintainers might be
needed.

[1] https://en.wikipedia.org/wiki/Flexible_array_member
[2] https://www.kernel.org/doc/html/v5.9/process/deprecated.html#zero-length-and-one-element-arrays

Link: https://github.com/KSPP/linux/issues/79
Build-tested-by: kernel test robot <lkp@intel.com>
Link: https://lore.kernel.org/lkml/6070a809.7QaU2ofU9h9VwFeh%25lkp@intel.com/
Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
---
Changes in v4:
 - Fix size for kmem_cache_create() in fs/xfs/xfs_super.c:xfs_init_zones().
 - Update changelog text with test results on Linux 5.12-rc6.

Changes in v3:
 - Add multiple inline functions as wrappers for struct_size(), as
   per Darrick's request.
 - Use type size_t instead of uint for a couple of objects.

Changes in v2:
 - Use struct_size() helper in more places.
 - Update changelog text with testing results on Linux 5.12.0-rc2.
 - Fix issue with use of struct_size() with the right struct object.
 - Use flex_array_size() helper.

 fs/xfs/libxfs/xfs_log_format.h |  12 ++--
 fs/xfs/xfs_extfree_item.c      | 102 +++++++++++++++++++++++----------
 fs/xfs/xfs_ondisk.h            |   8 +--
 fs/xfs/xfs_super.c             |  14 ++---
 4 files changed, 90 insertions(+), 46 deletions(-)

Comments

Christoph Hellwig April 12, 2021, 3:29 p.m. UTC | #1
> Below are the results of running xfstests for "all" with the following
> configuration in local.config:

...

> Other tests might need to be run in order to verify everything is working
> as expected. For such tests, the intervention of the maintainers might be
> needed.

This is a little weird for a commit log.  If you want to show results
this would be something that goes into a cover letter.

> +/*
> + * Calculates the size of structure xfs_efi_log_format followed by an
> + * array of n number of efi_extents elements.
> + */
> +static inline size_t
> +sizeof_efi_log_format(size_t n)
> +{
> +	return struct_size((struct xfs_efi_log_format *)0, efi_extents, n);

These helpers are completely silly.  Just keep the existing open code
version using sizeof with the one-off removed.

> -					(sizeof(struct xfs_efd_log_item) +
> -					(XFS_EFD_MAX_FAST_EXTENTS - 1) *
> -					sizeof(struct xfs_extent)),
> -					0, 0, NULL);
> +					 struct_size((struct xfs_efd_log_item *)0,
> +					 efd_format.efd_extents,
> +					 XFS_EFD_MAX_FAST_EXTENTS),
> +					 0, 0, NULL);
>  	if (!xfs_efd_zone)
>  		goto out_destroy_buf_item_zone;
>  
>  	xfs_efi_zone = kmem_cache_create("xfs_efi_item",
> -					 (sizeof(struct xfs_efi_log_item) +
> -					 (XFS_EFI_MAX_FAST_EXTENTS - 1) *
> -					 sizeof(struct xfs_extent)),
> +					 struct_size((struct xfs_efi_log_item *)0,
> +					 efi_format.efi_extents,
> +					 XFS_EFI_MAX_FAST_EXTENTS),

Same here.  And this obsfucated version also adds completely pointless
overly long lines while making the code unreadable.
Gustavo A. R. Silva April 12, 2021, 3:36 p.m. UTC | #2
On 4/12/21 10:29, Christoph Hellwig wrote:
>> Below are the results of running xfstests for "all" with the following
>> configuration in local.config:
> 
> ...
> 
>> Other tests might need to be run in order to verify everything is working
>> as expected. For such tests, the intervention of the maintainers might be
>> needed.
> 
> This is a little weird for a commit log.  If you want to show results
> this would be something that goes into a cover letter.
> 
>> +/*
>> + * Calculates the size of structure xfs_efi_log_format followed by an
>> + * array of n number of efi_extents elements.
>> + */
>> +static inline size_t
>> +sizeof_efi_log_format(size_t n)
>> +{
>> +	return struct_size((struct xfs_efi_log_format *)0, efi_extents, n);
> 
> These helpers are completely silly.  Just keep the existing open code
> version using sizeof with the one-off removed.

This was proposed by Darrick[1]. However, I'm curious, why do you think
they are "completely silly"?

> 
>> -					(sizeof(struct xfs_efd_log_item) +
>> -					(XFS_EFD_MAX_FAST_EXTENTS - 1) *
>> -					sizeof(struct xfs_extent)),
>> -					0, 0, NULL);
>> +					 struct_size((struct xfs_efd_log_item *)0,
>> +					 efd_format.efd_extents,
>> +					 XFS_EFD_MAX_FAST_EXTENTS),
>> +					 0, 0, NULL);
>>  	if (!xfs_efd_zone)
>>  		goto out_destroy_buf_item_zone;
>>  
>>  	xfs_efi_zone = kmem_cache_create("xfs_efi_item",
>> -					 (sizeof(struct xfs_efi_log_item) +
>> -					 (XFS_EFI_MAX_FAST_EXTENTS - 1) *
>> -					 sizeof(struct xfs_extent)),
>> +					 struct_size((struct xfs_efi_log_item *)0,
>> +					 efi_format.efi_extents,
>> +					 XFS_EFI_MAX_FAST_EXTENTS),
> 
> Same here.  And this obsfucated version also adds completely pointless
> overly long lines while making the code unreadable.

This could actually use one of the inline helpers you think are silly. :)

Thanks
--
Gustavo

[1] https://lore.kernel.org/lkml/20210311031745.GT3419940@magnolia/
Darrick J. Wong April 12, 2021, 3:48 p.m. UTC | #3
On Mon, Apr 12, 2021 at 04:29:06PM +0100, Christoph Hellwig wrote:
> > Below are the results of running xfstests for "all" with the following
> > configuration in local.config:
> 
> ...
> 
> > Other tests might need to be run in order to verify everything is working
> > as expected. For such tests, the intervention of the maintainers might be
> > needed.
> 
> This is a little weird for a commit log.  If you want to show results
> this would be something that goes into a cover letter.

Agreed, please don't post fstests output in the commit message.

> > +/*
> > + * Calculates the size of structure xfs_efi_log_format followed by an
> > + * array of n number of efi_extents elements.
> > + */
> > +static inline size_t
> > +sizeof_efi_log_format(size_t n)
> > +{
> > +	return struct_size((struct xfs_efi_log_format *)0, efi_extents, n);
> 
> These helpers are completely silly.  Just keep the existing open code
> version using sizeof with the one-off removed.

A couple of revisions ago I specifically asked Gustavo to create these
'silly' sizeof helpers to clean up...

> > -					(sizeof(struct xfs_efd_log_item) +
> > -					(XFS_EFD_MAX_FAST_EXTENTS - 1) *
> > -					sizeof(struct xfs_extent)),
> > -					0, 0, NULL);
> > +					 struct_size((struct xfs_efd_log_item *)0,
> > +					 efd_format.efd_extents,
> > +					 XFS_EFD_MAX_FAST_EXTENTS),

...these even uglier multiline statements.  I was also going to ask for
these kmem cache users to get cleaned up.  I'd much rather look at:

	xfs_efi_zone = kmem_cache_create("xfs_efi_item",
				sizeof_xfs_efi(XFS_EFI_MAX_FAST_EXTENTS), 0);
	if (!xfs_efi_zone)
		goto the_drop_zone;

even if it means another static inline.

--D

> > +					 0, 0, NULL);
> >  	if (!xfs_efd_zone)
> >  		goto out_destroy_buf_item_zone;
> >  
> >  	xfs_efi_zone = kmem_cache_create("xfs_efi_item",
> > -					 (sizeof(struct xfs_efi_log_item) +
> > -					 (XFS_EFI_MAX_FAST_EXTENTS - 1) *
> > -					 sizeof(struct xfs_extent)),
> > +					 struct_size((struct xfs_efi_log_item *)0,
> > +					 efi_format.efi_extents,
> > +					 XFS_EFI_MAX_FAST_EXTENTS),
> 
> Same here.  And this obsfucated version also adds completely pointless
> overly long lines while making the code unreadable.
Gustavo A. R. Silva April 12, 2021, 3:57 p.m. UTC | #4
On 4/12/21 10:48, Darrick J. Wong wrote:
> On Mon, Apr 12, 2021 at 04:29:06PM +0100, Christoph Hellwig wrote:
>>> Below are the results of running xfstests for "all" with the following
>>> configuration in local.config:
>>
>> ...
>>
>>> Other tests might need to be run in order to verify everything is working
>>> as expected. For such tests, the intervention of the maintainers might be
>>> needed.
>>
>> This is a little weird for a commit log.  If you want to show results
>> this would be something that goes into a cover letter.
> 
> Agreed, please don't post fstests output in the commit message.

OK. I've got it.

> 
>>> +/*
>>> + * Calculates the size of structure xfs_efi_log_format followed by an
>>> + * array of n number of efi_extents elements.
>>> + */
>>> +static inline size_t
>>> +sizeof_efi_log_format(size_t n)
>>> +{
>>> +	return struct_size((struct xfs_efi_log_format *)0, efi_extents, n);
>>
>> These helpers are completely silly.  Just keep the existing open code
>> version using sizeof with the one-off removed.
> 
> A couple of revisions ago I specifically asked Gustavo to create these
> 'silly' sizeof helpers to clean up...
> 
>>> -					(sizeof(struct xfs_efd_log_item) +
>>> -					(XFS_EFD_MAX_FAST_EXTENTS - 1) *
>>> -					sizeof(struct xfs_extent)),
>>> -					0, 0, NULL);
>>> +					 struct_size((struct xfs_efd_log_item *)0,
>>> +					 efd_format.efd_extents,
>>> +					 XFS_EFD_MAX_FAST_EXTENTS),
> 
> ...these even uglier multiline statements.  I was also going to ask for
> these kmem cache users to get cleaned up.  I'd much rather look at:
> 
> 	xfs_efi_zone = kmem_cache_create("xfs_efi_item",
> 				sizeof_xfs_efi(XFS_EFI_MAX_FAST_EXTENTS), 0);
> 	if (!xfs_efi_zone)
> 		goto the_drop_zone;
> 
> even if it means another static inline.

Yep; I agree[1].

Thanks
--
Gustavo

[1] https://lore.kernel.org/lkml/63078523-8a57-36f4-228b-1594f0e3b025@embeddedor.com/
Christoph Hellwig April 13, 2021, 4:53 p.m. UTC | #5
On Mon, Apr 12, 2021 at 08:48:08AM -0700, Darrick J. Wong wrote:
> A couple of revisions ago I specifically asked Gustavo to create these
> 'silly' sizeof helpers to clean up...
> 
> > > -					(sizeof(struct xfs_efd_log_item) +
> > > -					(XFS_EFD_MAX_FAST_EXTENTS - 1) *
> > > -					sizeof(struct xfs_extent)),
> > > -					0, 0, NULL);
> > > +					 struct_size((struct xfs_efd_log_item *)0,
> > > +					 efd_format.efd_extents,
> > > +					 XFS_EFD_MAX_FAST_EXTENTS),
> 
> ...these even uglier multiline statements.  I was also going to ask for
> these kmem cache users to get cleaned up.  I'd much rather look at:
> 
> 	xfs_efi_zone = kmem_cache_create("xfs_efi_item",
> 				sizeof_xfs_efi(XFS_EFI_MAX_FAST_EXTENTS), 0);
> 	if (!xfs_efi_zone)
> 		goto the_drop_zone;
> 
> even if it means another static inline.

Which doesn't really work with struct_size or rather leads to a mess
like the above as struct_size really wants a variable and not just a
type.  Making it really nasty for both allocations and creating slab
caches.  I tried to find a workaround for that, but that makes the
compiler unhappy based its inlining heuristics.

Anyway, a lot of the helpers are pretty silly as they duplicate stuff
without cleaning up the underlying mess.  I tried to sort much of this
out here, still WIP:

http://git.infradead.org/users/hch/xfs.git/shortlog/refs/heads/xfs-array-size
diff mbox series

Patch

diff --git a/fs/xfs/libxfs/xfs_log_format.h b/fs/xfs/libxfs/xfs_log_format.h
index 8bd00da6d2a4..9934a465b441 100644
--- a/fs/xfs/libxfs/xfs_log_format.h
+++ b/fs/xfs/libxfs/xfs_log_format.h
@@ -574,7 +574,7 @@  typedef struct xfs_efi_log_format {
 	uint16_t		efi_size;	/* size of this item */
 	uint32_t		efi_nextents;	/* # extents to free */
 	uint64_t		efi_id;		/* efi identifier */
-	xfs_extent_t		efi_extents[1];	/* array of extents to free */
+	xfs_extent_t		efi_extents[];	/* array of extents to free */
 } xfs_efi_log_format_t;
 
 typedef struct xfs_efi_log_format_32 {
@@ -582,7 +582,7 @@  typedef struct xfs_efi_log_format_32 {
 	uint16_t		efi_size;	/* size of this item */
 	uint32_t		efi_nextents;	/* # extents to free */
 	uint64_t		efi_id;		/* efi identifier */
-	xfs_extent_32_t		efi_extents[1];	/* array of extents to free */
+	xfs_extent_32_t		efi_extents[];	/* array of extents to free */
 } __attribute__((packed)) xfs_efi_log_format_32_t;
 
 typedef struct xfs_efi_log_format_64 {
@@ -590,7 +590,7 @@  typedef struct xfs_efi_log_format_64 {
 	uint16_t		efi_size;	/* size of this item */
 	uint32_t		efi_nextents;	/* # extents to free */
 	uint64_t		efi_id;		/* efi identifier */
-	xfs_extent_64_t		efi_extents[1];	/* array of extents to free */
+	xfs_extent_64_t		efi_extents[];	/* array of extents to free */
 } xfs_efi_log_format_64_t;
 
 /*
@@ -603,7 +603,7 @@  typedef struct xfs_efd_log_format {
 	uint16_t		efd_size;	/* size of this item */
 	uint32_t		efd_nextents;	/* # of extents freed */
 	uint64_t		efd_efi_id;	/* id of corresponding efi */
-	xfs_extent_t		efd_extents[1];	/* array of extents freed */
+	xfs_extent_t		efd_extents[];	/* array of extents freed */
 } xfs_efd_log_format_t;
 
 typedef struct xfs_efd_log_format_32 {
@@ -611,7 +611,7 @@  typedef struct xfs_efd_log_format_32 {
 	uint16_t		efd_size;	/* size of this item */
 	uint32_t		efd_nextents;	/* # of extents freed */
 	uint64_t		efd_efi_id;	/* id of corresponding efi */
-	xfs_extent_32_t		efd_extents[1];	/* array of extents freed */
+	xfs_extent_32_t		efd_extents[];	/* array of extents freed */
 } __attribute__((packed)) xfs_efd_log_format_32_t;
 
 typedef struct xfs_efd_log_format_64 {
@@ -619,7 +619,7 @@  typedef struct xfs_efd_log_format_64 {
 	uint16_t		efd_size;	/* size of this item */
 	uint32_t		efd_nextents;	/* # of extents freed */
 	uint64_t		efd_efi_id;	/* id of corresponding efi */
-	xfs_extent_64_t		efd_extents[1];	/* array of extents freed */
+	xfs_extent_64_t		efd_extents[];	/* array of extents freed */
 } xfs_efd_log_format_64_t;
 
 /*
diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c
index 93223ebb3372..17b3ff8ce05f 100644
--- a/fs/xfs/xfs_extfree_item.c
+++ b/fs/xfs/xfs_extfree_item.c
@@ -73,8 +73,8 @@  static inline int
 xfs_efi_item_sizeof(
 	struct xfs_efi_log_item *efip)
 {
-	return sizeof(struct xfs_efi_log_format) +
-	       (efip->efi_format.efi_nextents - 1) * sizeof(xfs_extent_t);
+	return struct_size(&efip->efi_format, efi_extents,
+			   efip->efi_format.efi_nextents);
 }
 
 STATIC void
@@ -153,17 +153,14 @@  xfs_efi_init(
 
 {
 	struct xfs_efi_log_item	*efip;
-	uint			size;
 
 	ASSERT(nextents > 0);
-	if (nextents > XFS_EFI_MAX_FAST_EXTENTS) {
-		size = (uint)(sizeof(struct xfs_efi_log_item) +
-			((nextents - 1) * sizeof(xfs_extent_t)));
-		efip = kmem_zalloc(size, 0);
-	} else {
+	if (nextents > XFS_EFI_MAX_FAST_EXTENTS)
+		efip = kmem_zalloc(struct_size(efip, efi_format.efi_extents,
+					       nextents), 0);
+	else
 		efip = kmem_cache_zalloc(xfs_efi_zone,
 					 GFP_KERNEL | __GFP_NOFAIL);
-	}
 
 	xfs_log_item_init(mp, &efip->efi_item, XFS_LI_EFI, &xfs_efi_item_ops);
 	efip->efi_format.efi_nextents = nextents;
@@ -174,6 +171,36 @@  xfs_efi_init(
 	return efip;
 }
 
+/*
+ * Calculates the size of structure xfs_efi_log_format followed by an
+ * array of n number of efi_extents elements.
+ */
+static inline size_t
+sizeof_efi_log_format(size_t n)
+{
+	return struct_size((struct xfs_efi_log_format *)0, efi_extents, n);
+}
+
+/*
+ * Calculates the size of structure xfs_efi_log_format_32 followed by an
+ * array of n number of efi_extents elements.
+ */
+static inline size_t
+sizeof_efi_log_format_32(size_t n)
+{
+	return struct_size((struct xfs_efi_log_format_32 *)0, efi_extents, n);
+}
+
+/*
+ * Calculates the size of structure xfs_efi_log_format_64 followed by an
+ * array of n number of efi_extents elements.
+ */
+static inline size_t
+sizeof_efi_log_format_64(size_t n)
+{
+	return struct_size((struct xfs_efi_log_format_64 *)0, efi_extents, n);
+}
+
 /*
  * Copy an EFI format buffer from the given buf, and into the destination
  * EFI format structure.
@@ -186,12 +213,9 @@  xfs_efi_copy_format(xfs_log_iovec_t *buf, xfs_efi_log_format_t *dst_efi_fmt)
 {
 	xfs_efi_log_format_t *src_efi_fmt = buf->i_addr;
 	uint i;
-	uint len = sizeof(xfs_efi_log_format_t) + 
-		(src_efi_fmt->efi_nextents - 1) * sizeof(xfs_extent_t);  
-	uint len32 = sizeof(xfs_efi_log_format_32_t) + 
-		(src_efi_fmt->efi_nextents - 1) * sizeof(xfs_extent_32_t);  
-	uint len64 = sizeof(xfs_efi_log_format_64_t) + 
-		(src_efi_fmt->efi_nextents - 1) * sizeof(xfs_extent_64_t);  
+	size_t len = sizeof_efi_log_format(src_efi_fmt->efi_nextents);
+	size_t len32 = sizeof_efi_log_format_32(src_efi_fmt->efi_nextents);
+	size_t len64 = sizeof_efi_log_format_64(src_efi_fmt->efi_nextents);
 
 	if (buf->i_len == len) {
 		memcpy((char *)dst_efi_fmt, (char*)src_efi_fmt, len);
@@ -253,8 +277,8 @@  static inline int
 xfs_efd_item_sizeof(
 	struct xfs_efd_log_item *efdp)
 {
-	return sizeof(xfs_efd_log_format_t) +
-	       (efdp->efd_format.efd_nextents - 1) * sizeof(xfs_extent_t);
+	return struct_size(&efdp->efd_format, efd_extents,
+			   efdp->efd_format.efd_nextents);
 }
 
 STATIC void
@@ -328,14 +352,12 @@  xfs_trans_get_efd(
 
 	ASSERT(nextents > 0);
 
-	if (nextents > XFS_EFD_MAX_FAST_EXTENTS) {
-		efdp = kmem_zalloc(sizeof(struct xfs_efd_log_item) +
-				(nextents - 1) * sizeof(struct xfs_extent),
-				0);
-	} else {
+	if (nextents > XFS_EFD_MAX_FAST_EXTENTS)
+		efdp = kmem_zalloc(struct_size(efdp, efd_format.efd_extents,
+					nextents), 0);
+	else
 		efdp = kmem_cache_zalloc(xfs_efd_zone,
 					GFP_KERNEL | __GFP_NOFAIL);
-	}
 
 	xfs_log_item_init(tp->t_mountp, &efdp->efd_item, XFS_LI_EFD,
 			  &xfs_efd_item_ops);
@@ -666,11 +688,13 @@  xfs_efi_item_relog(
 	tp->t_flags |= XFS_TRANS_DIRTY;
 	efdp = xfs_trans_get_efd(tp, EFI_ITEM(intent), count);
 	efdp->efd_next_extent = count;
-	memcpy(efdp->efd_format.efd_extents, extp, count * sizeof(*extp));
+	memcpy(efdp->efd_format.efd_extents, extp,
+	       flex_array_size(&efdp->efd_format, efd_extents, count));
 	set_bit(XFS_LI_DIRTY, &efdp->efd_item.li_flags);
 
 	efip = xfs_efi_init(tp->t_mountp, count);
-	memcpy(efip->efi_format.efi_extents, extp, count * sizeof(*extp));
+	memcpy(efip->efi_format.efi_extents, extp,
+	       flex_array_size(&efip->efi_format, efi_extents, count));
 	atomic_set(&efip->efi_next_extent, count);
 	xfs_trans_add_item(tp, &efip->efi_item);
 	set_bit(XFS_LI_DIRTY, &efip->efi_item.li_flags);
@@ -729,6 +753,26 @@  const struct xlog_recover_item_ops xlog_efi_item_ops = {
 	.commit_pass2		= xlog_recover_efi_commit_pass2,
 };
 
+/*
+ * Calculates the size of structure xfs_efd_log_format_32 followed by an
+ * array of n number of efd_extents elements.
+ */
+static inline size_t
+sizeof_efd_log_format_32(size_t n)
+{
+	return struct_size((struct xfs_efd_log_format_32 *)0, efd_extents, n);
+}
+
+/*
+ * Calculates the size of structure xfs_efd_log_format_64 followed by an
+ * array of n number of efd_extents elements.
+ */
+static inline size_t
+sizeof_efd_log_format_64(size_t n)
+{
+	return struct_size((struct xfs_efd_log_format_64 *)0, efd_extents, n);
+}
+
 /*
  * This routine is called when an EFD format structure is found in a committed
  * transaction in the log. Its purpose is to cancel the corresponding EFI if it
@@ -746,10 +790,10 @@  xlog_recover_efd_commit_pass2(
 	struct xfs_efd_log_format	*efd_formatp;
 
 	efd_formatp = item->ri_buf[0].i_addr;
-	ASSERT((item->ri_buf[0].i_len == (sizeof(xfs_efd_log_format_32_t) +
-		((efd_formatp->efd_nextents - 1) * sizeof(xfs_extent_32_t)))) ||
-	       (item->ri_buf[0].i_len == (sizeof(xfs_efd_log_format_64_t) +
-		((efd_formatp->efd_nextents - 1) * sizeof(xfs_extent_64_t)))));
+	ASSERT(item->ri_buf[0].i_len ==
+			sizeof_efd_log_format_32(efd_formatp->efd_nextents) ||
+	       item->ri_buf[0].i_len ==
+			sizeof_efd_log_format_64(efd_formatp->efd_nextents));
 
 	xlog_recover_release_intent(log, XFS_LI_EFI, efd_formatp->efd_efi_id);
 	return 0;
diff --git a/fs/xfs/xfs_ondisk.h b/fs/xfs/xfs_ondisk.h
index 0aa87c210104..f58e0510385a 100644
--- a/fs/xfs/xfs_ondisk.h
+++ b/fs/xfs/xfs_ondisk.h
@@ -118,10 +118,10 @@  xfs_check_ondisk_structs(void)
 	/* log structures */
 	XFS_CHECK_STRUCT_SIZE(struct xfs_buf_log_format,	88);
 	XFS_CHECK_STRUCT_SIZE(struct xfs_dq_logformat,		24);
-	XFS_CHECK_STRUCT_SIZE(struct xfs_efd_log_format_32,	28);
-	XFS_CHECK_STRUCT_SIZE(struct xfs_efd_log_format_64,	32);
-	XFS_CHECK_STRUCT_SIZE(struct xfs_efi_log_format_32,	28);
-	XFS_CHECK_STRUCT_SIZE(struct xfs_efi_log_format_64,	32);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_efd_log_format_32,	16);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_efd_log_format_64,	16);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_efi_log_format_32,	16);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_efi_log_format_64,	16);
 	XFS_CHECK_STRUCT_SIZE(struct xfs_extent_32,		12);
 	XFS_CHECK_STRUCT_SIZE(struct xfs_extent_64,		16);
 	XFS_CHECK_STRUCT_SIZE(struct xfs_log_dinode,		176);
diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
index e5e0713bebcd..923145737110 100644
--- a/fs/xfs/xfs_super.c
+++ b/fs/xfs/xfs_super.c
@@ -1937,17 +1937,17 @@  xfs_init_zones(void)
 		goto out_destroy_trans_zone;
 
 	xfs_efd_zone = kmem_cache_create("xfs_efd_item",
-					(sizeof(struct xfs_efd_log_item) +
-					(XFS_EFD_MAX_FAST_EXTENTS - 1) *
-					sizeof(struct xfs_extent)),
-					0, 0, NULL);
+					 struct_size((struct xfs_efd_log_item *)0,
+					 efd_format.efd_extents,
+					 XFS_EFD_MAX_FAST_EXTENTS),
+					 0, 0, NULL);
 	if (!xfs_efd_zone)
 		goto out_destroy_buf_item_zone;
 
 	xfs_efi_zone = kmem_cache_create("xfs_efi_item",
-					 (sizeof(struct xfs_efi_log_item) +
-					 (XFS_EFI_MAX_FAST_EXTENTS - 1) *
-					 sizeof(struct xfs_extent)),
+					 struct_size((struct xfs_efi_log_item *)0,
+					 efi_format.efi_extents,
+					 XFS_EFI_MAX_FAST_EXTENTS),
 					 0, 0, NULL);
 	if (!xfs_efi_zone)
 		goto out_destroy_efd_zone;