summaryrefslogtreecommitdiff
path: root/fs
diff options
context:
space:
mode:
authorHongling Zeng <zenghongling@kylinos.cn>2026-08-26 13:59:53 +0800
committerNamjae Jeon <linkinjeon@kernel.org>2026-08-31 19:43:59 +0900
commit4dc8f4ee2d46d5d1e749ddd1b94912c72e796162 (patch)
tree61c6729f25e5d579e1c48cd5cc219eff4e3713b6 /fs
parent03c6ecc4b4b13a3901f207152451fdd2d82e40c4 (diff)
downloadlinux-4dc8f4ee2d46d5d1e749ddd1b94912c72e796162.tar.gz
linux-4dc8f4ee2d46d5d1e749ddd1b94912c72e796162.zip
ntfs: handle signal interruption in fallocate
The ntfs_attr_fallocate() function checks for pending signals during allocation loops and exits early via 'out' label. However, when a signal interrupts the operation with err == 0, the function returns 0 (success) instead of -EINTR. The signal_pending() checks at the allocation loops jump to 'out' without setting err = -EINTR, so the function returns success even when interrupted by a signal. Set err = -EINTR when jumping to the signal exit path, and only override when no other error is pending. This ensures: - Allocation interrupted by signal returns -EINTR - Allocation that completed successfully before signal arrived returns 0 - Other errors are preserved and not overwritten by -EINTR Fixes: 495e90fa3348 ("ntfs: update attrib operations") Cc: stable@vger.kernel.org Signed-off-by: Hongling Zeng <zenghongling@kylinos.cn> Reviewed-by: Baolin Liu <liubaolin@kylinos.cn> Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
Diffstat (limited to 'fs')
-rw-r--r--fs/ntfs/attrib.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/fs/ntfs/attrib.c b/fs/ntfs/attrib.c
index b3e941423a3f..848a0d338b89 100644
--- a/fs/ntfs/attrib.c
+++ b/fs/ntfs/attrib.c
@@ -5709,7 +5709,7 @@ int ntfs_attr_fallocate(struct ntfs_inode *ni, loff_t start, loff_t byte_len, bo
}
if (signal_pending(current))
- goto out;
+ goto signal_out;
vcn += alloc_cnt;
try_alloc_cnt -= alloc_cnt;
@@ -5730,7 +5730,7 @@ int ntfs_attr_fallocate(struct ntfs_inode *ni, loff_t start, loff_t byte_len, bo
up_write(&ni->runlist.lock);
mutex_unlock(&ni->mrec_lock);
if (err || signal_pending(current))
- goto out;
+ goto signal_out;
vcn += alloc_cnt;
try_alloc_cnt -= alloc_cnt;
@@ -5756,4 +5756,8 @@ out_unmap:
mutex_unlock(&ni->mrec_lock);
out:
return err >= 0 ? 0 : err;
+signal_out:
+ if (!err)
+ err = -EINTR;
+ goto out;
}