All of lore.kernel.org
 help / color / mirror / Atom feed
* [Bug 221915] New: XFS: oversized xattr transaction causes unkillable hang in xlog_grant_head_check
@ 2026-08-24  5:50 bugzilla-daemon
  0 siblings, 0 replies; only message in thread
From: bugzilla-daemon @ 2026-08-24  5:50 UTC (permalink / raw)
  To: linux-xfs

https://bugzilla.kernel.org/show_bug.cgi?id=221915

            Bug ID: 221915
           Summary: XFS: oversized xattr transaction causes unkillable
                    hang in xlog_grant_head_check
           Product: File System
           Version: 2.5
          Hardware: All
                OS: Linux
            Status: NEW
          Severity: high
          Priority: P3
         Component: XFS
          Assignee: filesystem_xfs@kernel-bugs.kernel.org
          Reporter: 2855020996@qq.com
        Regression: No

Created attachment 310718
  --> https://bugzilla.kernel.org/attachment.cgi?id=310718&action=edit
submit

Linux mainline 7.2-rc7 still contains a reproducible XFS hang in the log grant
reservation path.

While fuzzing current mainline with syzkaller, I reproduced an old class of
hang previously reported by syzbot as:

```text
INFO: task hung in xlog_grant_head_check
```

The issue can be reduced to mounting a crafted XFS filesystem image with a
small log and issuing a single large `security.ima` xattr operation.

The minimized syzkaller sequence is approximately:

```text
syz_mount_image$xfs(..., "./file0", ..., image)

setxattr$security_ima("./file0", "security.ima",
                     {sha1, ...}, 0xfffe, 0)
```

The task then becomes permanently blocked:

```text
INFO: task syz.0.17:10462 blocked for more than 143 seconds.

Call Trace:
 __schedule+0x12e4/0x64e0
 schedule+0xe7/0x2d0
 xlog_grant_head_wait+0x13f/0xd00 fs/xfs/xfs_log.c:217
 xlog_grant_head_check+0x48f/0x4e0 fs/xfs/xfs_log.c:279
 xfs_log_reserve+0x2d2/0x850 fs/xfs/xfs_log.c:387
 xfs_trans_reserve fs/xfs/trans.c:174 [inline]
 xfs_trans_alloc+0x3c5/0xd40 fs/xfs/xfs_trans.c:256
 xfs_trans_alloc_inode+0x198/0x3b0 fs/xfs/xfs_trans.c:1080
 xfs_attr_set+0x40b/0x10f0 fs/xfs/libxfs/xfs_attr.c:1184
 xfs_attr_change+0x379/0x500 fs/xfs/xfs_xattr.c:128
 ...
 __x64_sys_setxattr+0xc6/0x140 fs/xattr.c:764
```

## Trigger

The reproducer uses:

```text
- a crafted XFS v5 filesystem image
- a relatively small XFS log
- one approximately 64 KB security.ima xattr value
```

The large xattr causes XFS to request a transaction reservation that appears to
be larger than the amount of log space that can ever become available on the
crafted filesystem.

The task enters:

```text
xfs_log_reserve()
  -> xlog_grant_head_check()
     -> xlog_grant_head_wait()
```

and does not return.

The wait does not appear to resolve even after log tail progress, and the
blocked task is effectively unkillable while waiting in D state.

Eventually the kernel reports the task through the hung-task detector. With
`hung_task_panic=1`, this can also result in a kernel panic.

## Suspected cause

My current hypothesis is that XFS can enter `xlog_grant_head_wait()` for a
transaction reservation that is impossible to satisfy.

For this crafted filesystem, the requested transaction reservation appears to
exceed the usable size of the XFS log.

Normally, `xlog_grant_head_wait()` waits for log tail movement to free
sufficient reservation space. However, if:

```text
requested reservation > maximum usable log space
```

then no amount of log tail pushing can ever make the reservation satisfiable.

The task therefore waits indefinitely.

This suggests that the reservation path may be missing a sanity check rejecting
transactions whose requested reservation exceeds the maximum amount of log
space that can ever be granted.

Another possible fix would be for the xattr path to split sufficiently large
operations into smaller transactions.

This analysis has not yet been fully proven, but it is consistent with the
minimized reproducer and the observed permanent wait.

## Expected behavior

A userspace operation that requires a transaction larger than the filesystem
log can accommodate should fail cleanly, for example with an appropriate error
such as `-ENOSPC` or another reservation failure.

It should not result in an indefinitely blocked and unkillable task.

## Actual behavior

A single large `setxattr()` can cause the task to block indefinitely in:

```text
xlog_grant_head_wait()
```

The operation never returns, and the kernel eventually reports:

```text
INFO: task ... blocked for more than 143 seconds
```

## Reproducer

The complete syzkaller reproducer consists of the crafted XFS image and the
two-operation program described above.

```text
1. Mount crafted XFS image.
2. setxattr("security.ima", ..., size=0xfffe)
3. Wait for the task to become permanently blocked in
   xlog_grant_head_wait().
```

The full syzkaller reproducer, filesystem image, kernel configuration, and
console log can be attached to this report.

## Environment

```text
Kernel:
7.2.0-rc7-00232-gdcb68831eac7

Tree:
stock mainline

Filesystem:
XFS v5

Configuration:
syzkaller upstream KASAN configuration

Architecture:
x86-64
```

## Previous report

A similar syzbot report existed in 2018 under the title:

```text
INFO: task hung in xlog_grant_head_check
```

The tracker has been dormant for several years and the previous cause
analysis/bisection did not result in a confirmed fix.

The issue is still reproducible on current mainline 7.2-rc7 with a very small
reproducer.

References:

https://lwn.net/Articles/755633/

https://lkml.org/lkml/2018/5/22/1056

Found-by: syzkaller on linux-7.2.0-rc7-00232-gdcb68831eac7

-- 
You may reply to this email to add a comment.

You are receiving this mail because:
You are watching the assignee of the bug.

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2026-08-24  5:50 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-24  5:50 [Bug 221915] New: XFS: oversized xattr transaction causes unkillable hang in xlog_grant_head_check bugzilla-daemon

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.