2
0
mirror of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git synced 2025-09-04 20:19:47 +08:00
linux/fs/xfs/libxfs
Eric Sandeen ae668cd567 xfs: do not propagate ENODATA disk errors into xattr code
ENODATA (aka ENOATTR) has a very specific meaning in the xfs xattr code;
namely, that the requested attribute name could not be found.

However, a medium error from disk may also return ENODATA. At best,
this medium error may escape to userspace as "attribute not found"
when in fact it's an IO (disk) error.

At worst, we may oops in xfs_attr_leaf_get() when we do:

	error = xfs_attr_leaf_hasname(args, &bp);
	if (error == -ENOATTR)  {
		xfs_trans_brelse(args->trans, bp);
		return error;
	}

because an ENODATA/ENOATTR error from disk leaves us with a null bp,
and the xfs_trans_brelse will then null-deref it.

As discussed on the list, we really need to modify the lower level
IO functions to trap all disk errors and ensure that we don't let
unique errors like this leak up into higher xfs functions - many
like this should be remapped to EIO.

However, this patch directly addresses a reported bug in the xattr
code, and should be safe to backport to stable kernels. A larger-scope
patch to handle more unique errors at lower levels can follow later.

(Note, prior to 07120f1abd we did not oops, but we did return the
wrong error code to userspace.)

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Fixes: 07120f1abd ("xfs: Add xfs_has_attr and subroutines")
Cc: stable@vger.kernel.org # v5.9+
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
2025-08-26 11:00:33 +02:00
..
xfs_ag_resv.c xfs: allow inode-based btrees to reserve space in the data device 2024-12-23 13:06:03 -08:00
xfs_ag_resv.h xfs: get rid of xfs_ag_resv_rmapbt_alloc 2024-07-04 14:36:13 +05:30
xfs_ag.c xfs: remove the flags argument to xfs_buf_get_uncached 2025-03-18 14:47:45 +01:00
xfs_ag.h xfs: move the min and max group block numbers to xfs_group 2024-11-05 13:38:44 -08:00
xfs_alloc_btree.c xfs: refactor cmp_key_with_cur routines to take advantage of cmp_int() 2025-07-24 17:30:13 +02:00
xfs_alloc_btree.h xfs: standardize the btree maxrecs function parameters 2024-09-01 08:58:20 -07:00
xfs_alloc.c xfs: catch stale AGF/AGF metadata 2025-06-27 14:13:34 +02:00
xfs_alloc.h xfs: support logging EFIs for realtime extents 2024-11-05 13:38:42 -08:00
xfs_attr_leaf.c xfs: distinguish extra split from real ENOSPC from xfs_attr3_leaf_split 2024-10-07 08:00:11 +02:00
xfs_attr_leaf.h xfs: return bool from xfs_attr3_leaf_add 2024-10-07 08:00:11 +02:00
xfs_attr_remote.c xfs: do not propagate ENODATA disk errors into xattr code 2025-08-26 11:00:33 +02:00
xfs_attr_remote.h xfs: create a helper to compute the blockcount of a max sized remote value 2024-05-02 07:48:36 -07:00
xfs_attr_sf.h xfs: pass the attr value to put_listent when possible 2024-04-23 07:47:00 -07:00
xfs_attr.c xfs: prepare to reuse the dquot pointer space in struct xfs_inode 2024-12-23 13:06:03 -08:00
xfs_attr.h xfs: fix xfs_init_attr_trans not handling explicit operation codes 2024-05-27 15:55:52 +05:30
xfs_bit.c
xfs_bit.h
xfs_bmap_btree.c xfs: refactor cmp_key_with_cur routines to take advantage of cmp_int() 2025-07-24 17:30:13 +02:00
xfs_bmap_btree.h xfs: make xfs_iroot_realloc a bmap btree function 2024-12-23 13:06:02 -08:00
xfs_bmap.c xfs: allow block allocator to take an alignment hint 2025-05-07 14:25:31 -07:00
xfs_bmap.h xfs: allow block allocator to take an alignment hint 2025-05-07 14:25:31 -07:00
xfs_btree_mem.c xfs: create a shadow rmap btree during realtime rmap repair 2024-12-23 13:06:09 -08:00
xfs_btree_mem.h
xfs_btree_staging.c xfs: online repair of the realtime rmap btree 2024-12-23 13:06:09 -08:00
xfs_btree_staging.h
xfs_btree.c xfs: refactor xfs_btree_diff_two_ptrs() to take advantage of cmp_int() 2025-07-24 17:30:13 +02:00
xfs_btree.h xfs: refactor xfs_btree_diff_two_ptrs() to take advantage of cmp_int() 2025-07-24 17:30:13 +02:00
xfs_cksum.h
xfs_da_btree.c xfs: do not propagate ENODATA disk errors into xattr code 2025-08-26 11:00:33 +02:00
xfs_da_btree.h xfs: create attr log item opcodes and formats for parent pointers 2024-04-23 07:46:57 -07:00
xfs_da_format.h xfs: turn XFS_ATTR3_RMT_BUF_SPACE into a function 2024-05-02 07:48:36 -07:00
xfs_defer.c xfs: support logging EFIs for realtime extents 2024-11-05 13:38:42 -08:00
xfs_defer.h xfs: add a realtime flag to the refcount update log redo items 2024-12-23 13:06:11 -08:00
xfs_dir2_block.c xfs: validate explicit directory block buffer owners 2024-04-15 14:58:52 -07:00
xfs_dir2_data.c xfs: don't walk off the end of a directory data block 2024-07-01 09:32:29 +05:30
xfs_dir2_leaf.c xfs: validate explicit directory free block owners 2024-04-15 14:58:52 -07:00
xfs_dir2_node.c xfs: validate explicit directory free block owners 2024-04-15 14:58:52 -07:00
xfs_dir2_priv.h xfs: don't walk off the end of a directory data block 2024-07-01 09:32:29 +05:30
xfs_dir2_sf.c
xfs_dir2.c xfs/libxfs: replace kmalloc() and memcpy() with kmemdup() 2025-01-13 14:58:04 +01:00
xfs_dir2.h xfs: mark xfs_dir_isempty static 2025-01-13 14:55:06 +01:00
xfs_dquot_buf.c xfs: use metadir for quota inodes 2024-11-05 13:38:45 -08:00
xfs_errortag.h xfs: allow inode-based btrees to reserve space in the data device 2024-12-23 13:06:03 -08:00
xfs_exchmaps.c xfs: realtime rmap btree transaction reservations 2024-12-23 13:06:04 -08:00
xfs_exchmaps.h xfs: use atomic extent swapping to fix user file fork data 2024-04-15 14:58:53 -07:00
xfs_format.h fs/xfs: replace strncpy with memtostr_pad() 2025-07-24 17:30:14 +02:00
xfs_fs.h xfs: enable fsmap reporting for internal RT devices 2025-03-03 08:17:08 -07:00
xfs_group.c xfs: improve the xg_active_ref check in xfs_group_free 2025-07-24 17:30:14 +02:00
xfs_group.h xfs: support zone gaps 2025-03-03 08:17:09 -07:00
xfs_health.h xfs: report realtime refcount btree corruption errors to the health system 2024-12-23 13:06:14 -08:00
xfs_ialloc_btree.c xfs: refactor cmp_key_with_cur routines to take advantage of cmp_int() 2025-07-24 17:30:13 +02:00
xfs_ialloc_btree.h xfs: standardize the btree maxrecs function parameters 2024-09-01 08:58:20 -07:00
xfs_ialloc.c xfs: catch stale AGF/AGF metadata 2025-06-27 14:13:34 +02:00
xfs_ialloc.h xfs: pass the icreate args object to xfs_dialloc 2024-09-01 08:58:19 -07:00
xfs_iext_tree.c
xfs_inode_buf.c xfs: kill XBF_UNMAPPED 2025-03-10 14:29:44 +01:00
xfs_inode_buf.h xfs: enforce metadata inode flag 2024-11-05 13:38:31 -08:00
xfs_inode_fork.c xfs: wire up a new metafile type for the realtime refcount 2024-12-23 13:06:12 -08:00
xfs_inode_fork.h xfs: make xfs_iroot_realloc a bmap btree function 2024-12-23 13:06:02 -08:00
xfs_inode_util.c xfs: define the zoned on-disk format 2025-03-03 08:16:45 -07:00
xfs_inode_util.h xfs: hoist inode free function to libxfs 2024-07-02 11:36:59 -07:00
xfs_log_format.h xfs: define the zoned on-disk format 2025-03-03 08:16:45 -07:00
xfs_log_recover.h xfs: don't use a xfs_log_iovec for ri_buf in log recovery 2025-07-24 17:30:15 +02:00
xfs_log_rlimit.c xfs: commit CoW-based atomic writes atomically 2025-05-07 14:25:32 -07:00
xfs_metadir.c xfs: allow inode-based btrees to reserve space in the data device 2024-12-23 13:06:03 -08:00
xfs_metadir.h xfs: read and write metadata inode directory tree 2024-11-05 13:38:31 -08:00
xfs_metafile.c xfs: reduce metafile reservations 2025-03-03 08:16:43 -07:00
xfs_metafile.h xfs: make metabtree reservations global 2025-03-03 08:16:43 -07:00
xfs_ondisk.h xfs: define the zoned on-disk format 2025-03-03 08:16:45 -07:00
xfs_parent.c xfs: add raw parent pointer apis to support repair 2024-04-23 07:47:04 -07:00
xfs_parent.h xfs: add raw parent pointer apis to support repair 2024-04-23 07:47:04 -07:00
xfs_quota_defs.h xfs: use metadir for quota inodes 2024-11-05 13:38:45 -08:00
xfs_refcount_btree.c xfs: refactor cmp_key_with_cur routines to take advantage of cmp_int() 2025-07-24 17:30:13 +02:00
xfs_refcount_btree.h xfs: standardize the btree maxrecs function parameters 2024-09-01 08:58:20 -07:00
xfs_refcount.c xfs: return the allocated transaction from xfs_trans_alloc_empty 2025-07-24 17:30:13 +02:00
xfs_refcount.h xfs: recover CoW leftovers in the realtime volume 2024-12-23 13:06:13 -08:00
xfs_rmap_btree.c xfs: refactor cmp_key_with_cur routines to take advantage of cmp_int() 2025-07-24 17:30:13 +02:00
xfs_rmap_btree.h xfs: standardize the btree maxrecs function parameters 2024-09-01 08:58:20 -07:00
xfs_rmap.c xfs: update rmap to allow cow staging extents in the rt rmap 2024-12-23 13:06:12 -08:00
xfs_rmap.h xfs: add a realtime flag to the rmap update log redo items 2024-12-23 13:06:04 -08:00
xfs_rtbitmap.c xfs: define the zoned on-disk format 2025-03-03 08:16:45 -07:00
xfs_rtbitmap.h xfs: online repair of realtime bitmaps for a realtime group 2024-12-23 13:06:08 -08:00
xfs_rtgroup.c xfs: define the zoned on-disk format 2025-03-03 08:16:45 -07:00
xfs_rtgroup.h xfs: support zone gaps 2025-03-03 08:17:09 -07:00
xfs_rtrefcount_btree.c xfs: refactor cmp_key_with_cur routines to take advantage of cmp_int() 2025-07-24 17:30:13 +02:00
xfs_rtrefcount_btree.h xfs: create routine to allocate and initialize a realtime refcount btree inode 2024-12-23 13:06:12 -08:00
xfs_rtrmap_btree.c xfs: refactor cmp_key_with_cur routines to take advantage of cmp_int() 2025-07-24 17:30:13 +02:00
xfs_rtrmap_btree.h xfs: add a xfs_rtrmap_highest_rgbno helper 2025-03-03 08:16:45 -07:00
xfs_sb.c xfs: Remove duplicate xfs_rtbitmap.h header 2025-03-12 10:00:43 +01:00
xfs_sb.h xfs: make xfs_rtblock_t a segmented address like xfs_fsblock_t 2024-11-05 13:38:44 -08:00
xfs_shared.h xfs: introduce realtime refcount btree ondisk definitions 2024-12-23 13:06:10 -08:00
xfs_symlink_remote.c xfs: return from xfs_symlink_verify early on V4 filesystems 2024-12-12 17:45:13 -08:00
xfs_symlink_remote.h xfs: pass the owner to xfs_symlink_write_target 2024-04-15 14:58:57 -07:00
xfs_trans_inode.c xfs: switch to multigrain timestamps 2024-10-10 10:20:52 +02:00
xfs_trans_resv.c xfs: allow sysadmins to specify a maximum atomic write limit at mount time 2025-05-07 14:25:33 -07:00
xfs_trans_resv.h xfs: allow sysadmins to specify a maximum atomic write limit at mount time 2025-05-07 14:25:33 -07:00
xfs_trans_space.c xfs: Add parent pointers to rename 2024-04-23 07:46:59 -07:00
xfs_trans_space.h xfs: realtime rmap btree transaction reservations 2024-12-23 13:06:04 -08:00
xfs_types.c xfs: make xfs_rtblock_t a segmented address like xfs_fsblock_t 2024-11-05 13:38:44 -08:00
xfs_types.h xfs: add support for zoned space reservations 2025-03-03 08:17:07 -07:00
xfs_zones.c xfs: support zone gaps 2025-03-03 08:17:09 -07:00
xfs_zones.h xfs: parse and validate hardware zone information 2025-03-03 08:16:46 -07:00