From nobody Wed Oct 8 08:14:50 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A6D5828DB68 for ; Mon, 30 Jun 2025 16:20:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751300436; cv=none; b=EaHPD6dp7/UpNl3ie/dagELr3HHLOzGp16tg4KdzxcospqWyu6ClC+bQu/SdHyHSD5uoIKf08lNnnj5OAsGk8GcwOp5PisXqMXw5znd9Cxpxyb0jzUWfaNsP5cu9DE/49cdGNTPcclVYCJ5QjQAChUuZ/mWL/x+4DhuKoiiDo90= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751300436; c=relaxed/simple; bh=405yist4yMaxw4IS6RXGFCYMQ8sbLn5sxnAxnQbkXig=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=LUyKKZRJxmLv5T062UPsu3J26CgwXSFaQPHWdp5ge3DT5TxkwD8S0OFEvCYJfo8nCapxG3xcQDcmjjVds7c/jNYOioFeDNoLGfSI+VLGsVqe3z4JDzUkaJ3s4Ol7LijhTtwfRNhflUp27heOO9vp68RSPTLHUJctwVwvPABj6Gg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=PCXqEZwk; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="PCXqEZwk" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1751300432; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=uMw1MFnpojtypzHkn05zWpJethntAUQwYfXFArukH0Q=; b=PCXqEZwkCnUSDJMR6ErAYpj8eucvVijOgMTxm2OKtV9ISEEgMV2eQXXZpt1yo5PNDTsTry yOYEyIMkcwZlDro4ZEtZZ47QcEgPlvo5wzFbwRnkY0uELR6eRV9W0si7VBQkN8U5YFmP+4 lBD48CAOlXKOQYAucohk6hxEVH1eBHY= Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-632-Q7SU5A6EPdyeXMnbLY7gIw-1; Mon, 30 Jun 2025 12:20:31 -0400 X-MC-Unique: Q7SU5A6EPdyeXMnbLY7gIw-1 X-Mimecast-MFC-AGG-ID: Q7SU5A6EPdyeXMnbLY7gIw_1751300430 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-452ff9e054eso21843225e9.2 for ; Mon, 30 Jun 2025 09:20:30 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751300430; x=1751905230; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=uMw1MFnpojtypzHkn05zWpJethntAUQwYfXFArukH0Q=; b=KjkjNBfbdVgcstZtrozQEtcefMoPs6r8+3LSTIaJe5yllCKeSdngCtJhvu2UBwYhDL 54eipBnV+22Od9fpHq+u88PPiPleuAevlcarVC3RNAvqcF0fiYVMlgUIsgqz6o+wanO3 +JspX/02EiDCu21W0k/yHGX4nT4IdWWeB1B9+8xv0Z5Ba0/vCKkVMFZmP/uB6PzG49aj 7MlUKI6yhJkRJ6pzFOWqi4VSFoV2oyuG/cK//0KKUrrV+2M8V9wlo1K+Ht33VyOCd8DR zrubudCF4hOASvBXedHNhq+CDdo9gh0PiaZroHvZsChPP5eX2/yzRaGcvvHuhyAoqylq zQLA== X-Forwarded-Encrypted: i=1; AJvYcCVAQMjBPKdFYEK7NZtYG10nJqK1iIygw7Q84wD/r+wG+GeOl2pNQuljwZY9rjNGgysbDkz9FjTTZbcb36w=@vger.kernel.org X-Gm-Message-State: AOJu0Yx0llsyYkzEzw4VxsO4WqzsYrIXp9dwcBjMSSMhvW5jZjl0c8Hm S5L2eU1XhJ60if7xghYsnV6J5HO9BLCYdEl1iMVt0LvArXYV0UqvxFb0+gozbjBydZhXWnafxq0 dASoIWbCx3mtuJutTvSxnfzZRi2RsLOx47oqvpR5OKg5r5qlVZnyP5pQig6VUOpwE X-Gm-Gg: ASbGncuHiFgK2XIFZS+Mee8yQ3/twhZdV4pGSObf+NxSk3HkfKF4mFicVZBEC+FEI6t UU10NNqO9xJCDRut2gixM+cP0WLKSlBSPr3n7gtjvnc+dXd5PzHs+mo2TKTSyn/SpsiHYiPbZQP 1t2/5QUgrKJDj4kyq4s4JbE9I9F+hxQbzC1yzAj3JhUMFipmpnIkatJCNl3ijGtjQD5CnwN42mT Pr/OR5FvLG5OjO9kKjYzNF2trvWiPNKv1RBWuqrJRU9zwmXZmHTZOChpqTvuqImr5vhnE9X8dSL N7JCxOJ+L7ZIv1JeYkatFGMaJmnZ X-Received: by 2002:a05:600c:1e0d:b0:43c:e478:889 with SMTP id 5b1f17b1804b1-4538edeb1e3mr161343645e9.0.1751300429453; Mon, 30 Jun 2025 09:20:29 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFdkljFvCKeSQ1u0BXXsAm74xNUPB3nS5Hy8RFzspogoQFN7rnotzQQPQAQkzWhiN8lH4Wb6A== X-Received: by 2002:a05:600c:1e0d:b0:43c:e478:889 with SMTP id 5b1f17b1804b1-4538edeb1e3mr161343255e9.0.1751300428854; Mon, 30 Jun 2025 09:20:28 -0700 (PDT) Received: from [127.0.0.2] (ip-217-030-074-039.aim-net.cz. [217.30.74.39]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4538233c1easm168769245e9.3.2025.06.30.09.20.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Jun 2025 09:20:28 -0700 (PDT) From: Andrey Albershteyn X-Google-Original-From: Andrey Albershteyn Date: Mon, 30 Jun 2025 18:20:11 +0200 Subject: [PATCH v6 1/6] fs: split fileattr related helpers into separate file Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250630-xattrat-syscall-v6-1-c4e3bc35227b@kernel.org> References: <20250630-xattrat-syscall-v6-0-c4e3bc35227b@kernel.org> In-Reply-To: <20250630-xattrat-syscall-v6-0-c4e3bc35227b@kernel.org> To: Amir Goldstein , Arnd Bergmann , Casey Schaufler , Christian Brauner , Jan Kara , =?utf-8?q?Pali_Roh=C3=A1r?= , Paul Moore Cc: linux-api@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-xfs@vger.kernel.org, selinux@vger.kernel.org, Andrey Albershteyn X-Mailer: b4 0.15-dev X-Developer-Signature: v=1; a=openpgp-sha256; l=20201; i=aalbersh@kernel.org; h=from:subject:message-id; bh=A9huJot8yJ6n24cQpc1B4SCSkRw4M/p64ocZxwkwKPA=; b=owJ4nJvAy8zAJea2/JXEGuOHHIyn1ZIYMpJ2er1/wWyyk5njPCP7QZdlijMtuRYtntI8/6bIl f9hYgdWTfnWUcrCIMbFICumyLJOWmtqUpFU/hGDGnmYOaxMIEMYuDgFYCICKxn+5xzeNFFOMV7H h+vOUqsjn+db2Sic5D230YBfeLtf7pl7Fgz/DG/eXnvTrev1x0lm/Vt/Pbogs8n2vo4Rx/meOPb 3Fron2AEDb0hD X-Developer-Key: i=aalbersh@kernel.org; a=openpgp; fpr=AE1B2A9562721A6FC4307C1F46A7EA18AC33E108 From: Andrey Albershteyn This patch moves function related to file extended attributes manipulations to separate file. Refactoring only. Signed-off-by: Andrey Albershteyn Reviewed-by: "Darrick J. Wong" Reviewed-by: Amir Goldstein Reviewed-by: Jan Kara --- fs/Makefile | 3 +- fs/file_attr.c | 318 +++++++++++++++++++++++++++++++++++++++++++= ++++ fs/ioctl.c | 309 -------------------------------------------= -- include/linux/fileattr.h | 4 + 4 files changed, 324 insertions(+), 310 deletions(-) diff --git a/fs/Makefile b/fs/Makefile index 79c08b914c47..334654f9584b 100644 --- a/fs/Makefile +++ b/fs/Makefile @@ -15,7 +15,8 @@ obj-y :=3D open.o read_write.o file_table.o super.o \ pnode.o splice.o sync.o utimes.o d_path.o \ stack.o fs_struct.o statfs.o fs_pin.o nsfs.o \ fs_types.o fs_context.o fs_parser.o fsopen.o init.o \ - kernel_read_file.o mnt_idmapping.o remap_range.o pidfs.o + kernel_read_file.o mnt_idmapping.o remap_range.o pidfs.o \ + file_attr.o =20 obj-$(CONFIG_BUFFER_HEAD) +=3D buffer.o mpage.o obj-$(CONFIG_PROC_FS) +=3D proc_namespace.o diff --git a/fs/file_attr.c b/fs/file_attr.c new file mode 100644 index 000000000000..2910b7047721 --- /dev/null +++ b/fs/file_attr.c @@ -0,0 +1,318 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include + +/** + * fileattr_fill_xflags - initialize fileattr with xflags + * @fa: fileattr pointer + * @xflags: FS_XFLAG_* flags + * + * Set ->fsx_xflags, ->fsx_valid and ->flags (translated xflags). All + * other fields are zeroed. + */ +void fileattr_fill_xflags(struct fileattr *fa, u32 xflags) +{ + memset(fa, 0, sizeof(*fa)); + fa->fsx_valid =3D true; + fa->fsx_xflags =3D xflags; + if (fa->fsx_xflags & FS_XFLAG_IMMUTABLE) + fa->flags |=3D FS_IMMUTABLE_FL; + if (fa->fsx_xflags & FS_XFLAG_APPEND) + fa->flags |=3D FS_APPEND_FL; + if (fa->fsx_xflags & FS_XFLAG_SYNC) + fa->flags |=3D FS_SYNC_FL; + if (fa->fsx_xflags & FS_XFLAG_NOATIME) + fa->flags |=3D FS_NOATIME_FL; + if (fa->fsx_xflags & FS_XFLAG_NODUMP) + fa->flags |=3D FS_NODUMP_FL; + if (fa->fsx_xflags & FS_XFLAG_DAX) + fa->flags |=3D FS_DAX_FL; + if (fa->fsx_xflags & FS_XFLAG_PROJINHERIT) + fa->flags |=3D FS_PROJINHERIT_FL; +} +EXPORT_SYMBOL(fileattr_fill_xflags); + +/** + * fileattr_fill_flags - initialize fileattr with flags + * @fa: fileattr pointer + * @flags: FS_*_FL flags + * + * Set ->flags, ->flags_valid and ->fsx_xflags (translated flags). + * All other fields are zeroed. + */ +void fileattr_fill_flags(struct fileattr *fa, u32 flags) +{ + memset(fa, 0, sizeof(*fa)); + fa->flags_valid =3D true; + fa->flags =3D flags; + if (fa->flags & FS_SYNC_FL) + fa->fsx_xflags |=3D FS_XFLAG_SYNC; + if (fa->flags & FS_IMMUTABLE_FL) + fa->fsx_xflags |=3D FS_XFLAG_IMMUTABLE; + if (fa->flags & FS_APPEND_FL) + fa->fsx_xflags |=3D FS_XFLAG_APPEND; + if (fa->flags & FS_NODUMP_FL) + fa->fsx_xflags |=3D FS_XFLAG_NODUMP; + if (fa->flags & FS_NOATIME_FL) + fa->fsx_xflags |=3D FS_XFLAG_NOATIME; + if (fa->flags & FS_DAX_FL) + fa->fsx_xflags |=3D FS_XFLAG_DAX; + if (fa->flags & FS_PROJINHERIT_FL) + fa->fsx_xflags |=3D FS_XFLAG_PROJINHERIT; +} +EXPORT_SYMBOL(fileattr_fill_flags); + +/** + * vfs_fileattr_get - retrieve miscellaneous file attributes + * @dentry: the object to retrieve from + * @fa: fileattr pointer + * + * Call i_op->fileattr_get() callback, if exists. + * + * Return: 0 on success, or a negative error on failure. + */ +int vfs_fileattr_get(struct dentry *dentry, struct fileattr *fa) +{ + struct inode *inode =3D d_inode(dentry); + + if (!inode->i_op->fileattr_get) + return -ENOIOCTLCMD; + + return inode->i_op->fileattr_get(dentry, fa); +} +EXPORT_SYMBOL(vfs_fileattr_get); + +/** + * copy_fsxattr_to_user - copy fsxattr to userspace. + * @fa: fileattr pointer + * @ufa: fsxattr user pointer + * + * Return: 0 on success, or -EFAULT on failure. + */ +int copy_fsxattr_to_user(const struct fileattr *fa, struct fsxattr __user = *ufa) +{ + struct fsxattr xfa; + + memset(&xfa, 0, sizeof(xfa)); + xfa.fsx_xflags =3D fa->fsx_xflags; + xfa.fsx_extsize =3D fa->fsx_extsize; + xfa.fsx_nextents =3D fa->fsx_nextents; + xfa.fsx_projid =3D fa->fsx_projid; + xfa.fsx_cowextsize =3D fa->fsx_cowextsize; + + if (copy_to_user(ufa, &xfa, sizeof(xfa))) + return -EFAULT; + + return 0; +} +EXPORT_SYMBOL(copy_fsxattr_to_user); + +static int copy_fsxattr_from_user(struct fileattr *fa, + struct fsxattr __user *ufa) +{ + struct fsxattr xfa; + + if (copy_from_user(&xfa, ufa, sizeof(xfa))) + return -EFAULT; + + fileattr_fill_xflags(fa, xfa.fsx_xflags); + fa->fsx_extsize =3D xfa.fsx_extsize; + fa->fsx_nextents =3D xfa.fsx_nextents; + fa->fsx_projid =3D xfa.fsx_projid; + fa->fsx_cowextsize =3D xfa.fsx_cowextsize; + + return 0; +} + +/* + * Generic function to check FS_IOC_FSSETXATTR/FS_IOC_SETFLAGS values and = reject + * any invalid configurations. + * + * Note: must be called with inode lock held. + */ +static int fileattr_set_prepare(struct inode *inode, + const struct fileattr *old_ma, + struct fileattr *fa) +{ + int err; + + /* + * The IMMUTABLE and APPEND_ONLY flags can only be changed by + * the relevant capability. + */ + if ((fa->flags ^ old_ma->flags) & (FS_APPEND_FL | FS_IMMUTABLE_FL) && + !capable(CAP_LINUX_IMMUTABLE)) + return -EPERM; + + err =3D fscrypt_prepare_setflags(inode, old_ma->flags, fa->flags); + if (err) + return err; + + /* + * Project Quota ID state is only allowed to change from within the init + * namespace. Enforce that restriction only if we are trying to change + * the quota ID state. Everything else is allowed in user namespaces. + */ + if (current_user_ns() !=3D &init_user_ns) { + if (old_ma->fsx_projid !=3D fa->fsx_projid) + return -EINVAL; + if ((old_ma->fsx_xflags ^ fa->fsx_xflags) & + FS_XFLAG_PROJINHERIT) + return -EINVAL; + } else { + /* + * Caller is allowed to change the project ID. If it is being + * changed, make sure that the new value is valid. + */ + if (old_ma->fsx_projid !=3D fa->fsx_projid && + !projid_valid(make_kprojid(&init_user_ns, fa->fsx_projid))) + return -EINVAL; + } + + /* Check extent size hints. */ + if ((fa->fsx_xflags & FS_XFLAG_EXTSIZE) && !S_ISREG(inode->i_mode)) + return -EINVAL; + + if ((fa->fsx_xflags & FS_XFLAG_EXTSZINHERIT) && + !S_ISDIR(inode->i_mode)) + return -EINVAL; + + if ((fa->fsx_xflags & FS_XFLAG_COWEXTSIZE) && + !S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode)) + return -EINVAL; + + /* + * It is only valid to set the DAX flag on regular files and + * directories on filesystems. + */ + if ((fa->fsx_xflags & FS_XFLAG_DAX) && + !(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode))) + return -EINVAL; + + /* Extent size hints of zero turn off the flags. */ + if (fa->fsx_extsize =3D=3D 0) + fa->fsx_xflags &=3D ~(FS_XFLAG_EXTSIZE | FS_XFLAG_EXTSZINHERIT); + if (fa->fsx_cowextsize =3D=3D 0) + fa->fsx_xflags &=3D ~FS_XFLAG_COWEXTSIZE; + + return 0; +} + +/** + * vfs_fileattr_set - change miscellaneous file attributes + * @idmap: idmap of the mount + * @dentry: the object to change + * @fa: fileattr pointer + * + * After verifying permissions, call i_op->fileattr_set() callback, if + * exists. + * + * Verifying attributes involves retrieving current attributes with + * i_op->fileattr_get(), this also allows initializing attributes that have + * not been set by the caller to current values. Inode lock is held + * thoughout to prevent racing with another instance. + * + * Return: 0 on success, or a negative error on failure. + */ +int vfs_fileattr_set(struct mnt_idmap *idmap, struct dentry *dentry, + struct fileattr *fa) +{ + struct inode *inode =3D d_inode(dentry); + struct fileattr old_ma =3D {}; + int err; + + if (!inode->i_op->fileattr_set) + return -ENOIOCTLCMD; + + if (!inode_owner_or_capable(idmap, inode)) + return -EPERM; + + inode_lock(inode); + err =3D vfs_fileattr_get(dentry, &old_ma); + if (!err) { + /* initialize missing bits from old_ma */ + if (fa->flags_valid) { + fa->fsx_xflags |=3D old_ma.fsx_xflags & ~FS_XFLAG_COMMON; + fa->fsx_extsize =3D old_ma.fsx_extsize; + fa->fsx_nextents =3D old_ma.fsx_nextents; + fa->fsx_projid =3D old_ma.fsx_projid; + fa->fsx_cowextsize =3D old_ma.fsx_cowextsize; + } else { + fa->flags |=3D old_ma.flags & ~FS_COMMON_FL; + } + err =3D fileattr_set_prepare(inode, &old_ma, fa); + if (!err) + err =3D inode->i_op->fileattr_set(idmap, dentry, fa); + } + inode_unlock(inode); + + return err; +} +EXPORT_SYMBOL(vfs_fileattr_set); + +int ioctl_getflags(struct file *file, unsigned int __user *argp) +{ + struct fileattr fa =3D { .flags_valid =3D true }; /* hint only */ + int err; + + err =3D vfs_fileattr_get(file->f_path.dentry, &fa); + if (!err) + err =3D put_user(fa.flags, argp); + return err; +} +EXPORT_SYMBOL(ioctl_getflags); + +int ioctl_setflags(struct file *file, unsigned int __user *argp) +{ + struct mnt_idmap *idmap =3D file_mnt_idmap(file); + struct dentry *dentry =3D file->f_path.dentry; + struct fileattr fa; + unsigned int flags; + int err; + + err =3D get_user(flags, argp); + if (!err) { + err =3D mnt_want_write_file(file); + if (!err) { + fileattr_fill_flags(&fa, flags); + err =3D vfs_fileattr_set(idmap, dentry, &fa); + mnt_drop_write_file(file); + } + } + return err; +} +EXPORT_SYMBOL(ioctl_setflags); + +int ioctl_fsgetxattr(struct file *file, void __user *argp) +{ + struct fileattr fa =3D { .fsx_valid =3D true }; /* hint only */ + int err; + + err =3D vfs_fileattr_get(file->f_path.dentry, &fa); + if (!err) + err =3D copy_fsxattr_to_user(&fa, argp); + + return err; +} +EXPORT_SYMBOL(ioctl_fsgetxattr); + +int ioctl_fssetxattr(struct file *file, void __user *argp) +{ + struct mnt_idmap *idmap =3D file_mnt_idmap(file); + struct dentry *dentry =3D file->f_path.dentry; + struct fileattr fa; + int err; + + err =3D copy_fsxattr_from_user(&fa, argp); + if (!err) { + err =3D mnt_want_write_file(file); + if (!err) { + err =3D vfs_fileattr_set(idmap, dentry, &fa); + mnt_drop_write_file(file); + } + } + return err; +} +EXPORT_SYMBOL(ioctl_fssetxattr); diff --git a/fs/ioctl.c b/fs/ioctl.c index 69107a245b4c..0248cb8db2d3 100644 --- a/fs/ioctl.c +++ b/fs/ioctl.c @@ -453,315 +453,6 @@ static int ioctl_file_dedupe_range(struct file *file, return ret; } =20 -/** - * fileattr_fill_xflags - initialize fileattr with xflags - * @fa: fileattr pointer - * @xflags: FS_XFLAG_* flags - * - * Set ->fsx_xflags, ->fsx_valid and ->flags (translated xflags). All - * other fields are zeroed. - */ -void fileattr_fill_xflags(struct fileattr *fa, u32 xflags) -{ - memset(fa, 0, sizeof(*fa)); - fa->fsx_valid =3D true; - fa->fsx_xflags =3D xflags; - if (fa->fsx_xflags & FS_XFLAG_IMMUTABLE) - fa->flags |=3D FS_IMMUTABLE_FL; - if (fa->fsx_xflags & FS_XFLAG_APPEND) - fa->flags |=3D FS_APPEND_FL; - if (fa->fsx_xflags & FS_XFLAG_SYNC) - fa->flags |=3D FS_SYNC_FL; - if (fa->fsx_xflags & FS_XFLAG_NOATIME) - fa->flags |=3D FS_NOATIME_FL; - if (fa->fsx_xflags & FS_XFLAG_NODUMP) - fa->flags |=3D FS_NODUMP_FL; - if (fa->fsx_xflags & FS_XFLAG_DAX) - fa->flags |=3D FS_DAX_FL; - if (fa->fsx_xflags & FS_XFLAG_PROJINHERIT) - fa->flags |=3D FS_PROJINHERIT_FL; -} -EXPORT_SYMBOL(fileattr_fill_xflags); - -/** - * fileattr_fill_flags - initialize fileattr with flags - * @fa: fileattr pointer - * @flags: FS_*_FL flags - * - * Set ->flags, ->flags_valid and ->fsx_xflags (translated flags). - * All other fields are zeroed. - */ -void fileattr_fill_flags(struct fileattr *fa, u32 flags) -{ - memset(fa, 0, sizeof(*fa)); - fa->flags_valid =3D true; - fa->flags =3D flags; - if (fa->flags & FS_SYNC_FL) - fa->fsx_xflags |=3D FS_XFLAG_SYNC; - if (fa->flags & FS_IMMUTABLE_FL) - fa->fsx_xflags |=3D FS_XFLAG_IMMUTABLE; - if (fa->flags & FS_APPEND_FL) - fa->fsx_xflags |=3D FS_XFLAG_APPEND; - if (fa->flags & FS_NODUMP_FL) - fa->fsx_xflags |=3D FS_XFLAG_NODUMP; - if (fa->flags & FS_NOATIME_FL) - fa->fsx_xflags |=3D FS_XFLAG_NOATIME; - if (fa->flags & FS_DAX_FL) - fa->fsx_xflags |=3D FS_XFLAG_DAX; - if (fa->flags & FS_PROJINHERIT_FL) - fa->fsx_xflags |=3D FS_XFLAG_PROJINHERIT; -} -EXPORT_SYMBOL(fileattr_fill_flags); - -/** - * vfs_fileattr_get - retrieve miscellaneous file attributes - * @dentry: the object to retrieve from - * @fa: fileattr pointer - * - * Call i_op->fileattr_get() callback, if exists. - * - * Return: 0 on success, or a negative error on failure. - */ -int vfs_fileattr_get(struct dentry *dentry, struct fileattr *fa) -{ - struct inode *inode =3D d_inode(dentry); - - if (!inode->i_op->fileattr_get) - return -ENOIOCTLCMD; - - return inode->i_op->fileattr_get(dentry, fa); -} -EXPORT_SYMBOL(vfs_fileattr_get); - -/** - * copy_fsxattr_to_user - copy fsxattr to userspace. - * @fa: fileattr pointer - * @ufa: fsxattr user pointer - * - * Return: 0 on success, or -EFAULT on failure. - */ -int copy_fsxattr_to_user(const struct fileattr *fa, struct fsxattr __user = *ufa) -{ - struct fsxattr xfa; - - memset(&xfa, 0, sizeof(xfa)); - xfa.fsx_xflags =3D fa->fsx_xflags; - xfa.fsx_extsize =3D fa->fsx_extsize; - xfa.fsx_nextents =3D fa->fsx_nextents; - xfa.fsx_projid =3D fa->fsx_projid; - xfa.fsx_cowextsize =3D fa->fsx_cowextsize; - - if (copy_to_user(ufa, &xfa, sizeof(xfa))) - return -EFAULT; - - return 0; -} -EXPORT_SYMBOL(copy_fsxattr_to_user); - -static int copy_fsxattr_from_user(struct fileattr *fa, - struct fsxattr __user *ufa) -{ - struct fsxattr xfa; - - if (copy_from_user(&xfa, ufa, sizeof(xfa))) - return -EFAULT; - - fileattr_fill_xflags(fa, xfa.fsx_xflags); - fa->fsx_extsize =3D xfa.fsx_extsize; - fa->fsx_nextents =3D xfa.fsx_nextents; - fa->fsx_projid =3D xfa.fsx_projid; - fa->fsx_cowextsize =3D xfa.fsx_cowextsize; - - return 0; -} - -/* - * Generic function to check FS_IOC_FSSETXATTR/FS_IOC_SETFLAGS values and = reject - * any invalid configurations. - * - * Note: must be called with inode lock held. - */ -static int fileattr_set_prepare(struct inode *inode, - const struct fileattr *old_ma, - struct fileattr *fa) -{ - int err; - - /* - * The IMMUTABLE and APPEND_ONLY flags can only be changed by - * the relevant capability. - */ - if ((fa->flags ^ old_ma->flags) & (FS_APPEND_FL | FS_IMMUTABLE_FL) && - !capable(CAP_LINUX_IMMUTABLE)) - return -EPERM; - - err =3D fscrypt_prepare_setflags(inode, old_ma->flags, fa->flags); - if (err) - return err; - - /* - * Project Quota ID state is only allowed to change from within the init - * namespace. Enforce that restriction only if we are trying to change - * the quota ID state. Everything else is allowed in user namespaces. - */ - if (current_user_ns() !=3D &init_user_ns) { - if (old_ma->fsx_projid !=3D fa->fsx_projid) - return -EINVAL; - if ((old_ma->fsx_xflags ^ fa->fsx_xflags) & - FS_XFLAG_PROJINHERIT) - return -EINVAL; - } else { - /* - * Caller is allowed to change the project ID. If it is being - * changed, make sure that the new value is valid. - */ - if (old_ma->fsx_projid !=3D fa->fsx_projid && - !projid_valid(make_kprojid(&init_user_ns, fa->fsx_projid))) - return -EINVAL; - } - - /* Check extent size hints. */ - if ((fa->fsx_xflags & FS_XFLAG_EXTSIZE) && !S_ISREG(inode->i_mode)) - return -EINVAL; - - if ((fa->fsx_xflags & FS_XFLAG_EXTSZINHERIT) && - !S_ISDIR(inode->i_mode)) - return -EINVAL; - - if ((fa->fsx_xflags & FS_XFLAG_COWEXTSIZE) && - !S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode)) - return -EINVAL; - - /* - * It is only valid to set the DAX flag on regular files and - * directories on filesystems. - */ - if ((fa->fsx_xflags & FS_XFLAG_DAX) && - !(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode))) - return -EINVAL; - - /* Extent size hints of zero turn off the flags. */ - if (fa->fsx_extsize =3D=3D 0) - fa->fsx_xflags &=3D ~(FS_XFLAG_EXTSIZE | FS_XFLAG_EXTSZINHERIT); - if (fa->fsx_cowextsize =3D=3D 0) - fa->fsx_xflags &=3D ~FS_XFLAG_COWEXTSIZE; - - return 0; -} - -/** - * vfs_fileattr_set - change miscellaneous file attributes - * @idmap: idmap of the mount - * @dentry: the object to change - * @fa: fileattr pointer - * - * After verifying permissions, call i_op->fileattr_set() callback, if - * exists. - * - * Verifying attributes involves retrieving current attributes with - * i_op->fileattr_get(), this also allows initializing attributes that have - * not been set by the caller to current values. Inode lock is held - * thoughout to prevent racing with another instance. - * - * Return: 0 on success, or a negative error on failure. - */ -int vfs_fileattr_set(struct mnt_idmap *idmap, struct dentry *dentry, - struct fileattr *fa) -{ - struct inode *inode =3D d_inode(dentry); - struct fileattr old_ma =3D {}; - int err; - - if (!inode->i_op->fileattr_set) - return -ENOIOCTLCMD; - - if (!inode_owner_or_capable(idmap, inode)) - return -EPERM; - - inode_lock(inode); - err =3D vfs_fileattr_get(dentry, &old_ma); - if (!err) { - /* initialize missing bits from old_ma */ - if (fa->flags_valid) { - fa->fsx_xflags |=3D old_ma.fsx_xflags & ~FS_XFLAG_COMMON; - fa->fsx_extsize =3D old_ma.fsx_extsize; - fa->fsx_nextents =3D old_ma.fsx_nextents; - fa->fsx_projid =3D old_ma.fsx_projid; - fa->fsx_cowextsize =3D old_ma.fsx_cowextsize; - } else { - fa->flags |=3D old_ma.flags & ~FS_COMMON_FL; - } - err =3D fileattr_set_prepare(inode, &old_ma, fa); - if (!err) - err =3D inode->i_op->fileattr_set(idmap, dentry, fa); - } - inode_unlock(inode); - - return err; -} -EXPORT_SYMBOL(vfs_fileattr_set); - -static int ioctl_getflags(struct file *file, unsigned int __user *argp) -{ - struct fileattr fa =3D { .flags_valid =3D true }; /* hint only */ - int err; - - err =3D vfs_fileattr_get(file->f_path.dentry, &fa); - if (!err) - err =3D put_user(fa.flags, argp); - return err; -} - -static int ioctl_setflags(struct file *file, unsigned int __user *argp) -{ - struct mnt_idmap *idmap =3D file_mnt_idmap(file); - struct dentry *dentry =3D file->f_path.dentry; - struct fileattr fa; - unsigned int flags; - int err; - - err =3D get_user(flags, argp); - if (!err) { - err =3D mnt_want_write_file(file); - if (!err) { - fileattr_fill_flags(&fa, flags); - err =3D vfs_fileattr_set(idmap, dentry, &fa); - mnt_drop_write_file(file); - } - } - return err; -} - -static int ioctl_fsgetxattr(struct file *file, void __user *argp) -{ - struct fileattr fa =3D { .fsx_valid =3D true }; /* hint only */ - int err; - - err =3D vfs_fileattr_get(file->f_path.dentry, &fa); - if (!err) - err =3D copy_fsxattr_to_user(&fa, argp); - - return err; -} - -static int ioctl_fssetxattr(struct file *file, void __user *argp) -{ - struct mnt_idmap *idmap =3D file_mnt_idmap(file); - struct dentry *dentry =3D file->f_path.dentry; - struct fileattr fa; - int err; - - err =3D copy_fsxattr_from_user(&fa, argp); - if (!err) { - err =3D mnt_want_write_file(file); - if (!err) { - err =3D vfs_fileattr_set(idmap, dentry, &fa); - mnt_drop_write_file(file); - } - } - return err; -} - static int ioctl_getfsuuid(struct file *file, void __user *argp) { struct super_block *sb =3D file_inode(file)->i_sb; diff --git a/include/linux/fileattr.h b/include/linux/fileattr.h index 47c05a9851d0..6030d0bf7ad3 100644 --- a/include/linux/fileattr.h +++ b/include/linux/fileattr.h @@ -55,5 +55,9 @@ static inline bool fileattr_has_fsx(const struct fileattr= *fa) int vfs_fileattr_get(struct dentry *dentry, struct fileattr *fa); int vfs_fileattr_set(struct mnt_idmap *idmap, struct dentry *dentry, struct fileattr *fa); +int ioctl_getflags(struct file *file, unsigned int __user *argp); +int ioctl_setflags(struct file *file, unsigned int __user *argp); +int ioctl_fsgetxattr(struct file *file, void __user *argp); +int ioctl_fssetxattr(struct file *file, void __user *argp); =20 #endif /* _LINUX_FILEATTR_H */ --=20 2.47.2 From nobody Wed Oct 8 08:14:50 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B10872900A4 for ; Mon, 30 Jun 2025 16:20:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751300438; cv=none; b=FHPumJt9Ti451TUzqkDzarnuoXkXyeDKecckmo6EusLKAOfNoRiT4/ElDEkPw1DQK2GmghVbTQzd8QtVQ35ia7RFi3XdxVcPKmDr+nA4t+0WNO3FwNOjBdv1kfiRh7FhxwcWDdcwKLXZumCFoNoXDi9qWR82PpyCgnwnBB+NlzU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751300438; c=relaxed/simple; bh=bO/jpswV1LWNhjalyWMDjdR/z42wKAwo8hIHFNHoxHc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QNv2mDeQju2xQiijwNsBbIo33KtnvF+L5VWnQ71Ylrkyb0yf77qdrwmCgUEHr9Ljbvlwhxywl0vNNMXXzVTKJIiijh5yI8cbHP+NBGZu1+vCHXPRpBcuc5IzbQbJir+pCEMFcFAfXaGMOnonTtg7AnrtwRlayM08u4evUutjA8E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=Qi+BF9Vf; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="Qi+BF9Vf" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1751300435; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=x/ldgdzsRv8e0UT+Jrv0yb/WEFGbntMvFcer/+29UGk=; b=Qi+BF9VfeXZ5nMshbm+xDzhhUr+iNBU2s5ppGqYeXO1reBL1ohgGbjjYg1UZ1E6UNiRwrT UFjYI2uJiQSAo6+AsPgevcWgNKzgZwXA8mMb9/MAWsHsaV+f+NWLy74HLlhdi/cpvDrFNc CMtRBKPX9KhMZ96IaCu4KcukFIBNlGw= Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-107-6LuBw58rNlCL3BEBXI1HiQ-1; Mon, 30 Jun 2025 12:20:34 -0400 X-MC-Unique: 6LuBw58rNlCL3BEBXI1HiQ-1 X-Mimecast-MFC-AGG-ID: 6LuBw58rNlCL3BEBXI1HiQ_1751300433 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-450db029f2aso20884025e9.3 for ; Mon, 30 Jun 2025 09:20:34 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751300433; x=1751905233; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=x/ldgdzsRv8e0UT+Jrv0yb/WEFGbntMvFcer/+29UGk=; b=Pcu/LLwZxKAiWBKB8pmwEgMqR6VTMVFHoS2d2PakNE1I1KQ3bIp7vxAA0Gfj9QYD2i uhmw5Sa72siEWDFvG1cJZKw+WVXXoZhzrkjB6HIU8ywGldgGeVOEuUdjVhAGswWtgI1c UB51hvQeMuC6ASFzowZ1rw0UPEZRT0tIPQ6CLE10lOJiUpT1j+zVsy+cHrYF0Z/89lZj xTjndVROTBKFgoRzKH+R6x/5Esmon3g9vVtdk+R3UyMxyjfRofY27YX9KFTunp5czTn6 Lza52GCOWTLfQF7wRzYsEiugzm/v4OwfexpdapHc69MlwId9sGEp8M8EWzx3bVQK9u0d EzYg== X-Forwarded-Encrypted: i=1; AJvYcCWLtkldoP4nOF6a6wyNcxprc9G1P820p/7n/zG93eysZalyZV1MM2+hNCxCg85Z8Qyr4QB+XeVbsLq1lHM=@vger.kernel.org X-Gm-Message-State: AOJu0Yy4LjxSVLWJwFgm39xnMIZPPmE7VQCPYg4urEJ93jbcJ72nDG3j VKYeI2PrVyLHp8kylcST7xTPpCldMAwJ056owee6oenn15uCl93AkAGCs/Hx8MdPRGLJb3Z2cuW 9LmhIRLhmC0xE/z2U9QAHCuzgalCaHGe9CmlvrE/xIHLSIHGi3OEmBOpMmzRUXceR X-Gm-Gg: ASbGncvCJ7v6PNWxCYoq8XeRzIjOmbk3gzkZR7PQdKUX4K8ospKA8hU+uHh6Ijdhotr nCwx3B3c12j9BtMKGIGO8MYgeWH4LVPGeplQhut7Pc7z3Ddsf1reMw81peREMfL2Ft3hSEq19vE idMzNtK8ZbXfIx+qXxy7sNoMCHHfke6Z+pYvSj1VDzeXgN6Rg94tJs6o+lAPiXzpRlL25MwanRB v/1fWPo+vjCsVdJFqAqW65K9GxmLt36rwKGcp5PDcu8MN9eogvTSbCEjrG7Wca/e0aASv+WAuAx /YL0pDNgqrbE5YmcA6iuTdQEXeMP X-Received: by 2002:a05:600c:458b:b0:450:b9c0:c7d2 with SMTP id 5b1f17b1804b1-45391b6b96dmr112684315e9.11.1751300433120; Mon, 30 Jun 2025 09:20:33 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFduavveB4cdYSeQ2qocLMKSrImBMaC6aj6NuX+uihLHHyN/rjbOwaD5qNXSxUq7WLZl2/mug== X-Received: by 2002:a05:600c:458b:b0:450:b9c0:c7d2 with SMTP id 5b1f17b1804b1-45391b6b96dmr112684075e9.11.1751300432717; Mon, 30 Jun 2025 09:20:32 -0700 (PDT) Received: from [127.0.0.2] (ip-217-030-074-039.aim-net.cz. [217.30.74.39]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4538233c1easm168769245e9.3.2025.06.30.09.20.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Jun 2025 09:20:29 -0700 (PDT) From: Andrey Albershteyn X-Google-Original-From: Andrey Albershteyn Date: Mon, 30 Jun 2025 18:20:12 +0200 Subject: [PATCH v6 2/6] lsm: introduce new hooks for setting/getting inode fsxattr Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250630-xattrat-syscall-v6-2-c4e3bc35227b@kernel.org> References: <20250630-xattrat-syscall-v6-0-c4e3bc35227b@kernel.org> In-Reply-To: <20250630-xattrat-syscall-v6-0-c4e3bc35227b@kernel.org> To: Amir Goldstein , Arnd Bergmann , Casey Schaufler , Christian Brauner , Jan Kara , =?utf-8?q?Pali_Roh=C3=A1r?= , Paul Moore Cc: linux-api@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-xfs@vger.kernel.org, selinux@vger.kernel.org, Andrey Albershteyn X-Mailer: b4 0.15-dev X-Developer-Signature: v=1; a=openpgp-sha256; l=5238; i=aalbersh@kernel.org; h=from:subject:message-id; bh=bO/jpswV1LWNhjalyWMDjdR/z42wKAwo8hIHFNHoxHc=; b=owJ4nJvAy8zAJea2/JXEGuOHHIyn1ZIYMpJ2ev2XWlBSZ1NT29LbkmzeYMpctqZpt8v5pdwnD coswzK/b+ooZWEQ42KQFVNkWSetNTWpSCr/iEGNPMwcViaQIQxcnAIwkX2zGP5wFThm6IgLsXdV /tpyS4eJUcfv1pbw5zrMD884LNDjf2LJyNAdtarms/SlmIr7p/6vnKwRF9nfmmrtkis1Y3v8UtZ duqwAYNREEw== X-Developer-Key: i=aalbersh@kernel.org; a=openpgp; fpr=AE1B2A9562721A6FC4307C1F46A7EA18AC33E108 Introduce new hooks for setting and getting filesystem extended attributes on inode (FS_IOC_FSGETXATTR). Cc: selinux@vger.kernel.org Cc: Paul Moore Acked-by: Paul Moore Signed-off-by: Andrey Albershteyn Acked-by: "Darrick J. Wong" Reviewed-by: Jan Kara --- fs/file_attr.c | 19 ++++++++++++++++--- include/linux/lsm_hook_defs.h | 2 ++ include/linux/security.h | 16 ++++++++++++++++ security/security.c | 30 ++++++++++++++++++++++++++++++ 4 files changed, 64 insertions(+), 3 deletions(-) diff --git a/fs/file_attr.c b/fs/file_attr.c index 2910b7047721..be62d97cc444 100644 --- a/fs/file_attr.c +++ b/fs/file_attr.c @@ -76,10 +76,15 @@ EXPORT_SYMBOL(fileattr_fill_flags); int vfs_fileattr_get(struct dentry *dentry, struct fileattr *fa) { struct inode *inode =3D d_inode(dentry); + int error; =20 if (!inode->i_op->fileattr_get) return -ENOIOCTLCMD; =20 + error =3D security_inode_file_getattr(dentry, fa); + if (error) + return error; + return inode->i_op->fileattr_get(dentry, fa); } EXPORT_SYMBOL(vfs_fileattr_get); @@ -242,12 +247,20 @@ int vfs_fileattr_set(struct mnt_idmap *idmap, struct = dentry *dentry, } else { fa->flags |=3D old_ma.flags & ~FS_COMMON_FL; } + err =3D fileattr_set_prepare(inode, &old_ma, fa); - if (!err) - err =3D inode->i_op->fileattr_set(idmap, dentry, fa); + if (err) + goto out; + err =3D security_inode_file_setattr(dentry, fa); + if (err) + goto out; + err =3D inode->i_op->fileattr_set(idmap, dentry, fa); + if (err) + goto out; } + +out: inode_unlock(inode); - return err; } EXPORT_SYMBOL(vfs_fileattr_set); diff --git a/include/linux/lsm_hook_defs.h b/include/linux/lsm_hook_defs.h index bf3bbac4e02a..9600a4350e79 100644 --- a/include/linux/lsm_hook_defs.h +++ b/include/linux/lsm_hook_defs.h @@ -157,6 +157,8 @@ LSM_HOOK(int, 0, inode_removexattr, struct mnt_idmap *i= dmap, struct dentry *dentry, const char *name) LSM_HOOK(void, LSM_RET_VOID, inode_post_removexattr, struct dentry *dentry, const char *name) +LSM_HOOK(int, 0, inode_file_setattr, struct dentry *dentry, struct fileatt= r *fa) +LSM_HOOK(int, 0, inode_file_getattr, struct dentry *dentry, struct fileatt= r *fa) LSM_HOOK(int, 0, inode_set_acl, struct mnt_idmap *idmap, struct dentry *dentry, const char *acl_name, struct posix_acl *kacl) LSM_HOOK(void, LSM_RET_VOID, inode_post_set_acl, struct dentry *dentry, diff --git a/include/linux/security.h b/include/linux/security.h index dba349629229..9ed0d0e0c81f 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -451,6 +451,10 @@ int security_inode_listxattr(struct dentry *dentry); int security_inode_removexattr(struct mnt_idmap *idmap, struct dentry *dentry, const char *name); void security_inode_post_removexattr(struct dentry *dentry, const char *na= me); +int security_inode_file_setattr(struct dentry *dentry, + struct fileattr *fa); +int security_inode_file_getattr(struct dentry *dentry, + struct fileattr *fa); int security_inode_need_killpriv(struct dentry *dentry); int security_inode_killpriv(struct mnt_idmap *idmap, struct dentry *dentry= ); int security_inode_getsecurity(struct mnt_idmap *idmap, @@ -1052,6 +1056,18 @@ static inline void security_inode_post_removexattr(s= truct dentry *dentry, const char *name) { } =20 +static inline int security_inode_file_setattr(struct dentry *dentry, + struct fileattr *fa) +{ + return 0; +} + +static inline int security_inode_file_getattr(struct dentry *dentry, + struct fileattr *fa) +{ + return 0; +} + static inline int security_inode_need_killpriv(struct dentry *dentry) { return cap_inode_need_killpriv(dentry); diff --git a/security/security.c b/security/security.c index 596d41818577..711b4de40b8d 100644 --- a/security/security.c +++ b/security/security.c @@ -2622,6 +2622,36 @@ void security_inode_post_removexattr(struct dentry *= dentry, const char *name) call_void_hook(inode_post_removexattr, dentry, name); } =20 +/** + * security_inode_file_setattr() - check if setting fsxattr is allowed + * @dentry: file to set filesystem extended attributes on + * @fa: extended attributes to set on the inode + * + * Called when file_setattr() syscall or FS_IOC_FSSETXATTR ioctl() is call= ed on + * inode + * + * Return: Returns 0 if permission is granted. + */ +int security_inode_file_setattr(struct dentry *dentry, struct fileattr *fa) +{ + return call_int_hook(inode_file_setattr, dentry, fa); +} + +/** + * security_inode_file_getattr() - check if retrieving fsxattr is allowed + * @dentry: file to retrieve filesystem extended attributes from + * @fa: extended attributes to get + * + * Called when file_getattr() syscall or FS_IOC_FSGETXATTR ioctl() is call= ed on + * inode + * + * Return: Returns 0 if permission is granted. + */ +int security_inode_file_getattr(struct dentry *dentry, struct fileattr *fa) +{ + return call_int_hook(inode_file_getattr, dentry, fa); +} + /** * security_inode_need_killpriv() - Check if security_inode_killpriv() req= uired * @dentry: associated dentry --=20 2.47.2 From nobody Wed Oct 8 08:14:50 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8B03728DF2F for ; Mon, 30 Jun 2025 16:20:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751300440; cv=none; b=a5Wnxl49KS0SDruJhdXbeHH9uj26niohTE8KCMKjqZBeQpd/+si6MJXpo37WdNrrNNniji4oRq6vpen+YmCa8iAyv9bCxIrKHlfKXZx8DAz8aH/xwwimUa/PesEdu3vmwdDCmjXItW71D9VlkuLXBnAipq6zC8E7P0lg8yfiGHs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751300440; c=relaxed/simple; bh=1fmnKQClA+Eq4TXGJEAAeuvdJ0gw1NSpnjK1+MgJX8U=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VWOujm2WYd0UfdLHnclQv5fHLl/LdurP8tsx/lEpqTfG5xIoi2nFIyL9FouUu906ucRAeGBt+aC14Fp/vQ6nXSFjR7unCmxNazKF/XTuPm/gGw6W0i/Msjbw/50sRpHYSPnh3J2FOeaoAAlzd7eTEaOBZGNOX+T1+EIZMo+1sh8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=gzcNb/rV; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="gzcNb/rV" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1751300437; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=retAznaHagyZVmXo9T/cqkc6BvJhqtSJTEOEchYRx98=; b=gzcNb/rVLruQias5SRzx7tBsEVVBBgrv54jT/226ObQhU6ynbCRGWYuxPsCW+o5XNpNF8B Q9OTTekF8XGdBncE3CWXW/8PVZjrC6nsaluc7kjDSMqvarrLml8piz7TI9/1JM5DPOJ6CU zL315jEPdYTK9+WZedVyTlQqH5mkHmo= Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-574-BYc5XKH-MGCm0ZcihIGHrg-1; Mon, 30 Jun 2025 12:20:35 -0400 X-MC-Unique: BYc5XKH-MGCm0ZcihIGHrg-1 X-Mimecast-MFC-AGG-ID: BYc5XKH-MGCm0ZcihIGHrg_1751300434 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-4530ec2c87cso15205655e9.0 for ; Mon, 30 Jun 2025 09:20:35 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751300434; x=1751905234; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=retAznaHagyZVmXo9T/cqkc6BvJhqtSJTEOEchYRx98=; b=N0SCDfoxXP5yTp8YxQVZmBE6ZLuiEWSUOWEMQxchPWninvMLzUb2I0ziFAToRt/vGH 7REyKE+Wlg5cJubPwcExqHfQHa0vRUAX5Dffghw1RFS0rRwEZx2rkjoq36fN7Agc7NCS Z1Cg2zI2uo4RANSa/honA5nBYQkAgQirBqs9XbQKSPL1ZnYQl7CPNgXUhndJHuwLPe4L ubgaG67cm/zkB08JH0o4Gd5SWZpiPMFK6hAaDpaUyChFzRPXP+SSlzd5HEnC97m6XLzj llJm5WuebUhX2PRGcFx+4gKi4u3Zt+QH9l17V/A5B3s8MlAJ3xYRkpVzU0d1/PVAf0O5 lnQw== X-Forwarded-Encrypted: i=1; AJvYcCWgZvdKo5Bgov09DQG4htTikwW0UPOg+f2N0T/9YgsRAlu6dYRyOztdqScsAlrvpAPkYSweqP4C3iBw9yg=@vger.kernel.org X-Gm-Message-State: AOJu0Ywe9eHzyyGLF/e7DFNQYI+rMOGbIg/n2tdB58RUk8q2QM8aPyyf KIW7a27pdC4kl5/qonS30GVp04yRoa7PcuCbBiHCnd/SRYHmUKmxg26fVSppe8t37wNCRKPX4op IjEUSXwDh3/GosB0cvUtbe3NCfNN6NiJN5XdIkt6l9fd4WRNXmyCQqe2QE9nUOs+1 X-Gm-Gg: ASbGncvhZtcUsw71GQBN56mUqh3FbZbtCsFKayXKGw+XkBWbp3RL8L/4oWTsOUcEwq/ ZkkggJid4Gc3rP5TwObNiWnSbBxPzDMooh2rvFQJaG5++NOVgAXPNItTmZLyYNZkabtaSXfpA1l ziswKKbwCs19xEvYJjLSIWsAE7jUXU9vd/R4lWprcivuVKhFugIJVHSSYYIDlYJzFRshCj+eKc+ V3R6JLNaB1zY6+qV7sDRvt/BBHrdYr3nxz6R2ei+u6y/vQZfrLkzof0ot2NnzS4GEoX/GCt3D3R A1sYhImNUeli9yVvi7M2PXjqas1C X-Received: by 2002:a05:600c:4706:b0:453:8bc7:5e53 with SMTP id 5b1f17b1804b1-4538edf9e08mr161397335e9.0.1751300433928; Mon, 30 Jun 2025 09:20:33 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFGWz29iLt9Ec8/QxCebaTYhDNjHorIH/1Bz8WoGZW+4+aLu8ceqioBoXyyLjXlnzKczI0zmg== X-Received: by 2002:a05:600c:4706:b0:453:8bc7:5e53 with SMTP id 5b1f17b1804b1-4538edf9e08mr161396915e9.0.1751300433504; Mon, 30 Jun 2025 09:20:33 -0700 (PDT) Received: from [127.0.0.2] (ip-217-030-074-039.aim-net.cz. [217.30.74.39]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4538233c1easm168769245e9.3.2025.06.30.09.20.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Jun 2025 09:20:33 -0700 (PDT) From: Andrey Albershteyn X-Google-Original-From: Andrey Albershteyn Date: Mon, 30 Jun 2025 18:20:13 +0200 Subject: [PATCH v6 3/6] selinux: implement inode_file_[g|s]etattr hooks Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250630-xattrat-syscall-v6-3-c4e3bc35227b@kernel.org> References: <20250630-xattrat-syscall-v6-0-c4e3bc35227b@kernel.org> In-Reply-To: <20250630-xattrat-syscall-v6-0-c4e3bc35227b@kernel.org> To: Amir Goldstein , Arnd Bergmann , Casey Schaufler , Christian Brauner , Jan Kara , =?utf-8?q?Pali_Roh=C3=A1r?= , Paul Moore Cc: linux-api@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-xfs@vger.kernel.org, selinux@vger.kernel.org, Andrey Albershteyn X-Mailer: b4 0.15-dev X-Developer-Signature: v=1; a=openpgp-sha256; l=1658; i=aalbersh@kernel.org; h=from:subject:message-id; bh=1fmnKQClA+Eq4TXGJEAAeuvdJ0gw1NSpnjK1+MgJX8U=; b=owJ4nJvAy8zAJea2/JXEGuOHHIyn1ZIYMpJ2enPFVZ/teivMYHN62xWL+csXzExLCz/utC+5a qlnSu+es2IdpSwMYlwMsmKKLOuktaYmFUnlHzGokYeZw8oEMoSBi1MAJtLpxfA/JuEJW8yuCy1M T8/dSOzS2vKR9eSE8LZb6+3t7Q8UKSrYMzIsni+mekNPS2F99OTy5xf2ZfnlXYgJXX4lZxPf5md lmZX8AEY/R7U= X-Developer-Key: i=aalbersh@kernel.org; a=openpgp; fpr=AE1B2A9562721A6FC4307C1F46A7EA18AC33E108 These hooks are called on inode extended attribute retrieval/change. Cc: selinux@vger.kernel.org Cc: Paul Moore Acked-by: Paul Moore Signed-off-by: Andrey Albershteyn --- security/selinux/hooks.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 595ceb314aeb..be7aca2269fa 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -3480,6 +3480,18 @@ static int selinux_inode_removexattr(struct mnt_idma= p *idmap, return -EACCES; } =20 +static int selinux_inode_file_setattr(struct dentry *dentry, + struct fileattr *fa) +{ + return dentry_has_perm(current_cred(), dentry, FILE__SETATTR); +} + +static int selinux_inode_file_getattr(struct dentry *dentry, + struct fileattr *fa) +{ + return dentry_has_perm(current_cred(), dentry, FILE__GETATTR); +} + static int selinux_path_notify(const struct path *path, u64 mask, unsigned int obj_type) { @@ -7350,6 +7362,8 @@ static struct security_hook_list selinux_hooks[] __ro= _after_init =3D { LSM_HOOK_INIT(inode_getxattr, selinux_inode_getxattr), LSM_HOOK_INIT(inode_listxattr, selinux_inode_listxattr), LSM_HOOK_INIT(inode_removexattr, selinux_inode_removexattr), + LSM_HOOK_INIT(inode_file_getattr, selinux_inode_file_getattr), + LSM_HOOK_INIT(inode_file_setattr, selinux_inode_file_setattr), LSM_HOOK_INIT(inode_set_acl, selinux_inode_set_acl), LSM_HOOK_INIT(inode_get_acl, selinux_inode_get_acl), LSM_HOOK_INIT(inode_remove_acl, selinux_inode_remove_acl), --=20 2.47.2 From nobody Wed Oct 8 08:14:50 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6A01E292933 for ; Mon, 30 Jun 2025 16:20:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751300441; cv=none; b=AkfilJptRPXC6sScDs8c45Ah0JL7Mg6ZaHPsIVvNEt2uRxteoGX11ptTWC5gsXp3b50yt1TwZRePzSqKLwTzLx9zAMsicj8qrxmB1xRi6TFJG/K06hmMOUS7tyfCBlxZG/BP704dxK+I44rVPPhZ7NyIGpuZADfYzwNUkZjV4k4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751300441; c=relaxed/simple; bh=IwADuJENyczf/bwBuYPIR4rrw/CJ1prOrfW5cqesY5Q=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=a8AE4MpAU2MtKN9Pye7Lewsj1NtjwEXxVtHKxsGHJW5X3SbbU+riSRZa4UbvkSdMGgOawe5JAW7bcSUd0Rb+sFAGhwVyACrfj8OEHQy/IXmSwjcRF3MUaSXeLYUW0piSvZ0x80vs+VyNNVTpVdhwjCRXdR5TYJLvAJ0Acke2Pzk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=BSDXf2Bx; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="BSDXf2Bx" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1751300438; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=GlL+qFUOPnhKYJXl/arb34Hj2cUvdXFZcSDvCm6FshI=; b=BSDXf2BxDmQcbc7xit41eQGOXn+fKGfe+EPxnfMGAN3VnHL8atv13HOCdyoT7/X2QShq/3 U0jLnmAawfv48Myg3gbz+WrAaoQQ6HqlNdK/f8X0mbWL1EssBpLmaIS37L+Ti5JRdZL3yJ OZhNxfobSIG12/gStkZBD5lYdx3U0Qc= Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-602-6FjfLbnFM7eXYUBwggdB2w-1; Mon, 30 Jun 2025 12:20:36 -0400 X-MC-Unique: 6FjfLbnFM7eXYUBwggdB2w-1 X-Mimecast-MFC-AGG-ID: 6FjfLbnFM7eXYUBwggdB2w_1751300435 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-450df53d461so19509985e9.1 for ; Mon, 30 Jun 2025 09:20:36 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751300435; x=1751905235; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=GlL+qFUOPnhKYJXl/arb34Hj2cUvdXFZcSDvCm6FshI=; b=AB6FhExPlFkZgo0pHUVGMmUcmbx0oGt/yg5wq1eNc+BwFsTlWz+f28uT9cVJiZF6lK yftYvR4LuMwd2/MnqBAZ4JJ8DeuyTMAdi1bmwPHOEqfL9Wy/U0uCQlWnR1qmnv/wvX5H jeV6/QkaDxw4nRCRyxBSisdcMwTu+3ftFCtE1N/sS3dyrWCqhcTgnFtNy97EgJWiKdaB CZgOdT8OI1U4pdhHTtCB4Nh+ZaSXVUm4FfV5X/qK0oYmvpRUEOFn6ZPbJ5pN4CE87MBv 9ZihoOA0oJ/zMQuz7zOcs/tLXhy0y+lPodQKCjM9RrgvwUJiBLDbVEd8KXlkgwxIRuzM Y4mA== X-Forwarded-Encrypted: i=1; AJvYcCVu5vZWblUOpITeiKrUnReCK1ioHfBfLUwcZ2MCX6maxHfxNQCQouu40EugIYIGtbdeBS6vrqQPubQAu3g=@vger.kernel.org X-Gm-Message-State: AOJu0Ywv3V1ogyqZiYFnKxUsBfmd6lIsRZnnFN4CXmzEucTJ4pIX8/oi BaDhixP2WYI8dCOWRDpuob/0v+v5fJvTt0vBRKp1/lxpxPnkGp62mndItHDcdRq78v0YODpiH4l PdXCUDMf294fitUl6qDcZQVBLu9SSJba0mm64M+8ZZZt0EmuOy5h644j16S2+bHa9yW2NJwwc X-Gm-Gg: ASbGncukzfxSDi9yYWCRt3uZUSvD44JdvUBuV+CsZ6rD7vfeveBqYwwC5Ki+PZOD/m8 g9TEuOzS9zXjY+PRQ4sr0gJgbsx+WrMpcxHEtrv+SPn5vqcMeXopLLRDHhYKJ8wPOMELGYmKAia o73CgrwM96kRzZjCA8fkXgzuN4qob7lat0+sF0tKRJJ1+DK5w9fTi/u8ovunEwkRBiQbCf341CG xGMqJFUUZwIAafke2wpa/c7WMvcOALjtl/zHM6fg/Tyz9KsbUwlJLrRdR+C6iejrkDWosjMq6Oc age1HSjRbIDPYyP0A6bSWvweD0g/ X-Received: by 2002:a05:600c:4ed3:b0:43d:45a:8fc1 with SMTP id 5b1f17b1804b1-4538f244121mr145675545e9.4.1751300434960; Mon, 30 Jun 2025 09:20:34 -0700 (PDT) X-Google-Smtp-Source: AGHT+IE0mlgM2WuBIj0NGAO7JpYDWypMZ7nhIDOKUHExDDi9JTWtN36FkNXEpiG/WFqMOZqsmfA9XA== X-Received: by 2002:a05:600c:4ed3:b0:43d:45a:8fc1 with SMTP id 5b1f17b1804b1-4538f244121mr145675185e9.4.1751300434446; Mon, 30 Jun 2025 09:20:34 -0700 (PDT) Received: from [127.0.0.2] (ip-217-030-074-039.aim-net.cz. [217.30.74.39]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4538233c1easm168769245e9.3.2025.06.30.09.20.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Jun 2025 09:20:33 -0700 (PDT) From: Andrey Albershteyn X-Google-Original-From: Andrey Albershteyn Date: Mon, 30 Jun 2025 18:20:14 +0200 Subject: [PATCH v6 4/6] fs: make vfs_fileattr_[get|set] return -EOPNOSUPP Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250630-xattrat-syscall-v6-4-c4e3bc35227b@kernel.org> References: <20250630-xattrat-syscall-v6-0-c4e3bc35227b@kernel.org> In-Reply-To: <20250630-xattrat-syscall-v6-0-c4e3bc35227b@kernel.org> To: Amir Goldstein , Arnd Bergmann , Casey Schaufler , Christian Brauner , Jan Kara , =?utf-8?q?Pali_Roh=C3=A1r?= , Paul Moore Cc: linux-api@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-xfs@vger.kernel.org, selinux@vger.kernel.org, Andrey Albershteyn X-Mailer: b4 0.15-dev X-Developer-Signature: v=1; a=openpgp-sha256; l=3358; i=aalbersh@kernel.org; h=from:subject:message-id; bh=IwADuJENyczf/bwBuYPIR4rrw/CJ1prOrfW5cqesY5Q=; b=owJ4nJvAy8zAJea2/JXEGuOHHIyn1ZIYMpJ2en+qD5NXqUucEMbfvf3H22r17tAf/0/fjdsaf U5u8crGl5s6SlkYxLgYZMUUWdZJa01NKpLKP2JQIw8zh5UJZAgDF6cATORUFiPD6u3Sewp/NG2b tVPL4QNj7k2l1J5t+vvM4lviFD/6OvFoMTLcKsnetPxBseFWzV/7Vhf92JD/dMKHlSE7FWuMv/1 eZT2DHwBb9Uul X-Developer-Key: i=aalbersh@kernel.org; a=openpgp; fpr=AE1B2A9562721A6FC4307C1F46A7EA18AC33E108 Future patches will add new syscalls which use these functions. As this interface won't be used for ioctls only, the EOPNOSUPP is more appropriate return code. This patch converts return code from ENOIOCTLCMD to EOPNOSUPP for vfs_fileattr_get and vfs_fileattr_set. To save old behavior translate EOPNOSUPP back for current users - overlayfs, encryptfs and fs/ioctl.c. Signed-off-by: Andrey Albershteyn Reviewed-by: "Darrick J. Wong" Reviewed-by: Jan Kara --- fs/ecryptfs/inode.c | 8 +++++++- fs/file_attr.c | 12 ++++++++++-- fs/overlayfs/inode.c | 2 +- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index 493d7f194956..a55c1375127f 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c @@ -1126,7 +1126,13 @@ static int ecryptfs_removexattr(struct dentry *dentr= y, struct inode *inode, =20 static int ecryptfs_fileattr_get(struct dentry *dentry, struct fileattr *f= a) { - return vfs_fileattr_get(ecryptfs_dentry_to_lower(dentry), fa); + int rc; + + rc =3D vfs_fileattr_get(ecryptfs_dentry_to_lower(dentry), fa); + if (rc =3D=3D -EOPNOTSUPP) + rc =3D -ENOIOCTLCMD; + + return rc; } =20 static int ecryptfs_fileattr_set(struct mnt_idmap *idmap, diff --git a/fs/file_attr.c b/fs/file_attr.c index be62d97cc444..4e85fa00c092 100644 --- a/fs/file_attr.c +++ b/fs/file_attr.c @@ -79,7 +79,7 @@ int vfs_fileattr_get(struct dentry *dentry, struct fileat= tr *fa) int error; =20 if (!inode->i_op->fileattr_get) - return -ENOIOCTLCMD; + return -EOPNOTSUPP; =20 error =3D security_inode_file_getattr(dentry, fa); if (error) @@ -229,7 +229,7 @@ int vfs_fileattr_set(struct mnt_idmap *idmap, struct de= ntry *dentry, int err; =20 if (!inode->i_op->fileattr_set) - return -ENOIOCTLCMD; + return -EOPNOTSUPP; =20 if (!inode_owner_or_capable(idmap, inode)) return -EPERM; @@ -271,6 +271,8 @@ int ioctl_getflags(struct file *file, unsigned int __us= er *argp) int err; =20 err =3D vfs_fileattr_get(file->f_path.dentry, &fa); + if (err =3D=3D -EOPNOTSUPP) + err =3D -ENOIOCTLCMD; if (!err) err =3D put_user(fa.flags, argp); return err; @@ -292,6 +294,8 @@ int ioctl_setflags(struct file *file, unsigned int __us= er *argp) fileattr_fill_flags(&fa, flags); err =3D vfs_fileattr_set(idmap, dentry, &fa); mnt_drop_write_file(file); + if (err =3D=3D -EOPNOTSUPP) + err =3D -ENOIOCTLCMD; } } return err; @@ -304,6 +308,8 @@ int ioctl_fsgetxattr(struct file *file, void __user *ar= gp) int err; =20 err =3D vfs_fileattr_get(file->f_path.dentry, &fa); + if (err =3D=3D -EOPNOTSUPP) + err =3D -ENOIOCTLCMD; if (!err) err =3D copy_fsxattr_to_user(&fa, argp); =20 @@ -324,6 +330,8 @@ int ioctl_fssetxattr(struct file *file, void __user *ar= gp) if (!err) { err =3D vfs_fileattr_set(idmap, dentry, &fa); mnt_drop_write_file(file); + if (err =3D=3D -EOPNOTSUPP) + err =3D -ENOIOCTLCMD; } } return err; diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c index 6f0e15f86c21..096d44712bb1 100644 --- a/fs/overlayfs/inode.c +++ b/fs/overlayfs/inode.c @@ -721,7 +721,7 @@ int ovl_real_fileattr_get(const struct path *realpath, = struct fileattr *fa) return err; =20 err =3D vfs_fileattr_get(realpath->dentry, fa); - if (err =3D=3D -ENOIOCTLCMD) + if (err =3D=3D -EOPNOTSUPP) err =3D -ENOTTY; return err; } --=20 2.47.2 From nobody Wed Oct 8 08:14:50 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D248C293443 for ; Mon, 30 Jun 2025 16:20:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751300443; cv=none; b=fFVR6Ma4Eu3DVHHUgpJodfYyYaPoE8hsvAFV3hoYQoeFTdfkHFFCdlwgng5npgPPz7Vbql9MlJVeYKLW+D8tf+5WzgrgySw3mQ/lYrkNlufLPUmWP5CFoh17KKPugB4gn5aaRCb1+Cj4leuWMc1j/WjlA1+EU0C/jmRvAVbjj58= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751300443; c=relaxed/simple; bh=foooJvFPpaD5U1NIc0z1whyvvGUcJuzLkZ/bh7+WhsI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WStHmUJjsKNXVpnwdHLKzOAsDYVLrtuRa2LAjqRZEGa1u8zFkcg1fncL3t+Lrrqec2uLfPSN0JnLQB3XVXILyqukhtWulBqE776yvQA5wp0Am3oK94Ei7n3pmhCBUb4Ys6VaNziA6IsjhD++nHch7pLl/cHdnd1vP7fg8Pkth3o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=YHNEn+uX; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="YHNEn+uX" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1751300439; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=DdCDc+5wwhrTWZmiggiHt07OVS9wseyBUBrB0c0lZSY=; b=YHNEn+uXzVBzU/XwxZMw0/d3gYAWzStdYNp7808Xf182VgyNHjsLFfd0rfJZP9kymnNeZx v3VjZ/Sd8k4prAq5sRilREDE9fb5j1kUNP2UL6CJBXV56Urf6brBzk0Zwz9RHYRwGE+50q ylcqF6xEfztZE7DpDX7etb+b1wPWsHs= Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-517-6wIahQsgNS2UUiOhHUsPLg-1; Mon, 30 Jun 2025 12:20:37 -0400 X-MC-Unique: 6wIahQsgNS2UUiOhHUsPLg-1 X-Mimecast-MFC-AGG-ID: 6wIahQsgNS2UUiOhHUsPLg_1751300437 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-4530ec2c87cso15206055e9.0 for ; Mon, 30 Jun 2025 09:20:37 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751300437; x=1751905237; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=DdCDc+5wwhrTWZmiggiHt07OVS9wseyBUBrB0c0lZSY=; b=RLY56dOPTaKEoSt1qw7gOE4Aortpv7Bp9Z8hsV2xwNJ1hqzIX4Pz6827/AWpce5gZr bGYRXghDlmnh0OqRlCb3LVhL7jIMVYh/m92IFVE5TdaLNl5jFKyaVWGxHFl9FBzeLqsc 9dQnKnDw68djI4pdPOjOo1YLdskuhPZtANwCLh8BQEAm/OCl4Dh9rdr+ePlheLehm3+T DbI4Jtj5YF2ROsWHjbAFydTrZ8AAzbvP4C3z/YlZHMc8QUOazYdxDwh6u87jZ9n1lht9 qcbbxmSJ9JwPKoCTTUssdk9QDWr0fcGkOeGuqUfOuMkMYlkoxUEpjAJwv/cO0cwfHO16 U+lw== X-Forwarded-Encrypted: i=1; AJvYcCW1cNo4/9YUxL/FXJIdsjNEfkFmU+puBTM1JFJmmkiTSLzerjj283aKXkl9wjzWvIgtTY3kfIWXu3+EXTk=@vger.kernel.org X-Gm-Message-State: AOJu0Yw9abFpVrD6KiXoGRo9c4g8AGvBWNy9Q1mdapF4H0kxPtvK5dqf qDAotDl7DOTpFIcUfDv4DYyoCBUEg+DYvOQMV7q2GtDkgtOTHpNj3xJzhZSctahLJUodtPgWEsl hjOp8J81YVJrkOdonLyaKUW55VEe9EfjBhT9EjlJ/Yd+nseNBMhAr1DZaO+oF0ER5 X-Gm-Gg: ASbGncumVdRtLIKOKqLWq6Lm3v9dO0+E8DINeADNeO5klrL9kgEYV6Ub9UdsNDHlXfj hw0hqlqrqiw43Hib8Y+svuQkK/uxzCTDGDGY0umRyqGLj379Gy7Qk6NQa5adeM5gS/taIwGjfkt awZS0/QKC8tx2oxycXh2KOPTIol0iYxXDytUIN5xuz1qqobIQ3WZ53c5eV/9eDobxR2mMJw7aOb E3LEVtmoFXGDZjmblh9WNxaGOJhg/hgvLbDLvUym/YyAmWHKVKtQxlL2nc9xP2mJNBGbEXPVN1b c0E0hI3Ma98q8BWJSThSC9xC1h9Z X-Received: by 2002:a05:600c:83c6:b0:453:aca:4d05 with SMTP id 5b1f17b1804b1-453a7264638mr5226415e9.31.1751300436481; Mon, 30 Jun 2025 09:20:36 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFBcIwNOVZbbeCVmBSm0GSwp6bviZIHyE1JnfXVzq6+huhRLCuA9yHQd2Lb4OcWzcyg0+4Wrw== X-Received: by 2002:a05:600c:83c6:b0:453:aca:4d05 with SMTP id 5b1f17b1804b1-453a7264638mr5226125e9.31.1751300436014; Mon, 30 Jun 2025 09:20:36 -0700 (PDT) Received: from [127.0.0.2] (ip-217-030-074-039.aim-net.cz. [217.30.74.39]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4538233c1easm168769245e9.3.2025.06.30.09.20.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Jun 2025 09:20:34 -0700 (PDT) From: Andrey Albershteyn X-Google-Original-From: Andrey Albershteyn Date: Mon, 30 Jun 2025 18:20:15 +0200 Subject: [PATCH v6 5/6] fs: prepare for extending file_get/setattr() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250630-xattrat-syscall-v6-5-c4e3bc35227b@kernel.org> References: <20250630-xattrat-syscall-v6-0-c4e3bc35227b@kernel.org> In-Reply-To: <20250630-xattrat-syscall-v6-0-c4e3bc35227b@kernel.org> To: Amir Goldstein , Arnd Bergmann , Casey Schaufler , Christian Brauner , Jan Kara , =?utf-8?q?Pali_Roh=C3=A1r?= , Paul Moore Cc: linux-api@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-xfs@vger.kernel.org, selinux@vger.kernel.org, Andrey Albershteyn , Andrey Albershteyn X-Mailer: b4 0.15-dev X-Developer-Signature: v=1; a=openpgp-sha256; l=3056; i=aalbersh@kernel.org; h=from:subject:message-id; bh=IIV2cRquSoQDpyjj3fxxhkDYmgsYRlcj84QBPmOyXno=; b=owJ4nJvAy8zAJea2/JXEGuOHHIyn1ZIYMpJ2epvKL1KqqgkNvm3IsfeBdK/GQ7Vj5kGz+g/JP HzuvPaEY2JHKQuDGBeDrJgiyzppralJRVL5Rwxq5GHmsDKBDGHg4hSAiTw8zvCHM/bZTbHepcd0 TPsaqyd8c9JX2aGyiV17oUCzhl/651W7GRlu3/i+kvuc0IKOb351FTMWH2dpPJxivOQ0xzIFl6o LPLncAL7sRno= X-Developer-Key: i=aalbersh@kernel.org; a=openpgp; fpr=AE1B2A9562721A6FC4307C1F46A7EA18AC33E108 From: Amir Goldstein We intend to add support for more xflags to selective filesystems and We cannot rely on copy_struct_from_user() to detect this extension. In preparation of extending the API, do not allow setting xflags unknown by this kernel version. Also do not pass the read-only flags and read-only field fsx_nextents to filesystem. These changes should not affect existing chattr programs that use the ioctl to get fsxattr before setting the new values. Link: https://lore.kernel.org/linux-fsdevel/20250216164029.20673-4-pali@ker= nel.org/ Cc: Pali Roh=C3=A1r Cc: Andrey Albershteyn Signed-off-by: Amir Goldstein Signed-off-by: Andrey Albershteyn Reviewed-by: Jan Kara --- fs/file_attr.c | 8 +++++++- include/linux/fileattr.h | 20 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/fs/file_attr.c b/fs/file_attr.c index 4e85fa00c092..62f08872d4ad 100644 --- a/fs/file_attr.c +++ b/fs/file_attr.c @@ -99,9 +99,10 @@ EXPORT_SYMBOL(vfs_fileattr_get); int copy_fsxattr_to_user(const struct fileattr *fa, struct fsxattr __user = *ufa) { struct fsxattr xfa; + __u32 mask =3D FS_XFLAGS_MASK; =20 memset(&xfa, 0, sizeof(xfa)); - xfa.fsx_xflags =3D fa->fsx_xflags; + xfa.fsx_xflags =3D fa->fsx_xflags & mask; xfa.fsx_extsize =3D fa->fsx_extsize; xfa.fsx_nextents =3D fa->fsx_nextents; xfa.fsx_projid =3D fa->fsx_projid; @@ -118,11 +119,16 @@ static int copy_fsxattr_from_user(struct fileattr *fa, struct fsxattr __user *ufa) { struct fsxattr xfa; + __u32 mask =3D FS_XFLAGS_MASK; =20 if (copy_from_user(&xfa, ufa, sizeof(xfa))) return -EFAULT; =20 + if (xfa.fsx_xflags & ~mask) + return -EINVAL; + fileattr_fill_xflags(fa, xfa.fsx_xflags); + fa->fsx_xflags &=3D ~FS_XFLAG_RDONLY_MASK; fa->fsx_extsize =3D xfa.fsx_extsize; fa->fsx_nextents =3D xfa.fsx_nextents; fa->fsx_projid =3D xfa.fsx_projid; diff --git a/include/linux/fileattr.h b/include/linux/fileattr.h index 6030d0bf7ad3..e2a2f4ae242d 100644 --- a/include/linux/fileattr.h +++ b/include/linux/fileattr.h @@ -14,6 +14,26 @@ FS_XFLAG_NODUMP | FS_XFLAG_NOATIME | FS_XFLAG_DAX | \ FS_XFLAG_PROJINHERIT) =20 +/* Read-only inode flags */ +#define FS_XFLAG_RDONLY_MASK \ + (FS_XFLAG_PREALLOC | FS_XFLAG_HASATTR) + +/* Flags to indicate valid value of fsx_ fields */ +#define FS_XFLAG_VALUES_MASK \ + (FS_XFLAG_EXTSIZE | FS_XFLAG_COWEXTSIZE) + +/* Flags for directories */ +#define FS_XFLAG_DIRONLY_MASK \ + (FS_XFLAG_RTINHERIT | FS_XFLAG_NOSYMLINKS | FS_XFLAG_EXTSZINHERIT) + +/* Misc settable flags */ +#define FS_XFLAG_MISC_MASK \ + (FS_XFLAG_REALTIME | FS_XFLAG_NODEFRAG | FS_XFLAG_FILESTREAM) + +#define FS_XFLAGS_MASK \ + (FS_XFLAG_COMMON | FS_XFLAG_RDONLY_MASK | FS_XFLAG_VALUES_MASK | \ + FS_XFLAG_DIRONLY_MASK | FS_XFLAG_MISC_MASK) + /* * Merged interface for miscellaneous file attributes. 'flags' originates= from * ext* and 'fsx_flags' from xfs. There's some overlap between the two, w= hich --=20 2.47.2 From nobody Wed Oct 8 08:14:50 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EE10629344F for ; Mon, 30 Jun 2025 16:20:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751300445; cv=none; b=rnMWR4WdcOEmyjGfigxOKf9wudOvAWCjxBpASJIjATwEUkBqMsiTfBnTisX05AJ8UscbYEUv+gJE2vFLsrIu3HXTiiiYtLkFCuWefii9gw0Q202KZxEzm2R44ZusW+wbA3QFEWnw1xNyt0CexNreCWcndpDZ+S1G9SD/vHIQYxA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751300445; c=relaxed/simple; bh=/0DPgYqHwXH68zqTi+bZwoE769iGHAO3Kk0ZsNgUTCc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=axRDUW4OkLGDMGvAhtao8+AG820D13IiOCXd1sgJbxcQX8ZZtr+9JVtQ4LqDrhsduc1qezelYl8Oyj5OgJPR0lup4253+SkdcsseMaR/BYjhQM2qzCwN2inWKT18lvcmJYWDfUMjgdZmkmo2lmK/fKbhyi6OZ62fSzeivspq5XA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=fkVbT02D; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="fkVbT02D" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1751300441; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=SoyF2Lbb+EmANh+ApKAOj3j7GqG7GRYmSFuKrQ30Lm4=; b=fkVbT02D5Tgno3JeZHArPrg+I70LfcAdpz8Rq/5m8yPK88JpbQNUSmxAJ7qtaTMMDNdsZQ mShxdnxJNQVbf7KPQD2dDnEtBQ5OS8wzSb9oiYeRhu7tgaU2n9uDXzlKd/gpAKZG5+OAW6 tgURfCY74GtDGrEIWd+Bi9TIA0HJmgw= Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-468-szakgKPdOnuXp_KlPnVcvQ-1; Mon, 30 Jun 2025 12:20:40 -0400 X-MC-Unique: szakgKPdOnuXp_KlPnVcvQ-1 X-Mimecast-MFC-AGG-ID: szakgKPdOnuXp_KlPnVcvQ_1751300437 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-4535ee06160so17608835e9.3 for ; Mon, 30 Jun 2025 09:20:38 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751300437; x=1751905237; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=SoyF2Lbb+EmANh+ApKAOj3j7GqG7GRYmSFuKrQ30Lm4=; b=kisVLReQFA6LPO2ulL++d4uNUhwR6qIiJb1HY8VbFTcwCdcRtcwnUy6rzt6uDgSfmR R0Tf5OOLmlYCzpr0vAAilc6eEsMXY8qtotZ1C5W74KquDTHJVEwMbO6SfQvUAIQDHL64 seR0ZeBG2E/f9KtjhXeB1IaVA/4zQP5x9/iA8wP/sTjOyRtWk3RMoJCLDFI/44e0FGOR Qm/NEXEGOkniLvY/vewp0kA5S0Ap/fZrwAbB2cJC9nFtvd8j9kQn5El3DfV/bmCFLj2J 7TDe4VTlut+ZgE8NMbm3T5NcQmQH8K8tMdEtl9+xOHAFmY+regrdylNN3Q1ZPnu7OD/u MBnw== X-Forwarded-Encrypted: i=1; AJvYcCVUn5DghRUyaWUasZwXqDbvmhBdzAmQo6FhHBnwTKHD4O97+ckzgxtcaRXPsYqfqToqlWWUNsl52fj3gE4=@vger.kernel.org X-Gm-Message-State: AOJu0YzsOq09IPXpLRBLdWzjzyrYziQmmEtubSK+b9z5mFoFNHk6LuZ9 pHsSok/M82bD5oZYr3hyrXbZBLzw0AccDSrgY2txlk3alhWDDGp00XhrvI6h4UOvPnWbIHltDkS K8Bl3M3L+j28zQuAzrH3MRClIcEUu9lTaZJCwP/k3yXBmuUNPWUcxdms+FkDESvvR X-Gm-Gg: ASbGncuB7AMrP9qt7i9qpfdw1MCOL5jH/FGRtXT0irPCBzB+AjD4qlx7OuCuuSP4oDZ G4ZvF7EyfFmIcWaAL7jfX2ladaHUOhg8Vtq6I7SDgXmuQo2tBM0+g80Ml8utCxxMRzzF3Go+3ot s8UWkCkri3ApDmBy3qhTj/lzoKVZDHbrl13wsWvlffDckqoR8DL3rYUXNhaxBf3adWjeAJz+oQH sSOD3AoickP1c0BUCcIe4tKwMKghsJ5Hjy9QLmVKakf7McT2rfJQ+eO9gIQN6QHX5WnU8n/DGwt A6+wD655nVRQi3LY2cEl09dB44v5 X-Received: by 2002:a05:600c:6285:b0:450:d01f:de6f with SMTP id 5b1f17b1804b1-4538ee51961mr161000475e9.15.1751300437327; Mon, 30 Jun 2025 09:20:37 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGtorg9o36AVQP+WBvPMzp87fcnrKpmxG66TjtrB1Pb0Yem+Q0XFJ/tFsqwzgrGlrSTf0Zcqw== X-Received: by 2002:a05:600c:6285:b0:450:d01f:de6f with SMTP id 5b1f17b1804b1-4538ee51961mr161000125e9.15.1751300436799; Mon, 30 Jun 2025 09:20:36 -0700 (PDT) Received: from [127.0.0.2] (ip-217-030-074-039.aim-net.cz. [217.30.74.39]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4538233c1easm168769245e9.3.2025.06.30.09.20.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Jun 2025 09:20:36 -0700 (PDT) From: Andrey Albershteyn X-Google-Original-From: Andrey Albershteyn Date: Mon, 30 Jun 2025 18:20:16 +0200 Subject: [PATCH v6 6/6] fs: introduce file_getattr and file_setattr syscalls Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250630-xattrat-syscall-v6-6-c4e3bc35227b@kernel.org> References: <20250630-xattrat-syscall-v6-0-c4e3bc35227b@kernel.org> In-Reply-To: <20250630-xattrat-syscall-v6-0-c4e3bc35227b@kernel.org> To: Amir Goldstein , Arnd Bergmann , Casey Schaufler , Christian Brauner , Jan Kara , =?utf-8?q?Pali_Roh=C3=A1r?= , Paul Moore Cc: linux-api@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-xfs@vger.kernel.org, selinux@vger.kernel.org, Andrey Albershteyn , Andrey Albershteyn X-Mailer: b4 0.15-dev X-Developer-Signature: v=1; a=openpgp-sha256; l=17773; i=aalbersh@kernel.org; h=from:subject:message-id; bh=ZLLC0uab4T1vYFSlMig/IXObB26c+FZcBUGNwVHWico=; b=kA0DAAoWRqfqGKwz4QgByyZiAGhiuUuhJ+RO7hD/JfzUzRBkyP8w2z93FUimejVHPUZNkWHxZ Yh1BAAWCgAdFiEErhsqlWJyGm/EMHwfRqfqGKwz4QgFAmhiuUsACgkQRqfqGKwz4QhnewD/S9Nl MnvwpB18h4axOdsLw8cZ4Q7S3k3edh73tjuUyi8A/1SlEIftICnrt8K3Xw2U8+GIv+c4gQ9Y2GV vRCwGlq4K X-Developer-Key: i=aalbersh@kernel.org; a=openpgp; fpr=AE1B2A9562721A6FC4307C1F46A7EA18AC33E108 From: Andrey Albershteyn Introduce file_getattr() and file_setattr() syscalls to manipulate inode extended attributes. The syscalls takes pair of file descriptor and pathname. Then it operates on inode opened accroding to openat() semantics. The struct fsx_fileattr is passed to obtain/change extended attributes. This is an alternative to FS_IOC_FSSETXATTR ioctl with a difference that file don't need to be open as we can reference it with a path instead of fd. By having this we can manipulated inode extended attributes not only on regular files but also on special ones. This is not possible with FS_IOC_FSSETXATTR ioctl as with special files we can not call ioctl() directly on the filesystem inode using fd. This patch adds two new syscalls which allows userspace to get/set extended inode attributes on special files by using parent directory and a path - *at() like syscall. CC: linux-api@vger.kernel.org CC: linux-fsdevel@vger.kernel.org CC: linux-xfs@vger.kernel.org Signed-off-by: Andrey Albershteyn Acked-by: Arnd Bergmann Reviewed-by: Jan Kara --- arch/alpha/kernel/syscalls/syscall.tbl | 2 + arch/arm/tools/syscall.tbl | 2 + arch/arm64/tools/syscall_32.tbl | 2 + arch/m68k/kernel/syscalls/syscall.tbl | 2 + arch/microblaze/kernel/syscalls/syscall.tbl | 2 + arch/mips/kernel/syscalls/syscall_n32.tbl | 2 + arch/mips/kernel/syscalls/syscall_n64.tbl | 2 + arch/mips/kernel/syscalls/syscall_o32.tbl | 2 + arch/parisc/kernel/syscalls/syscall.tbl | 2 + arch/powerpc/kernel/syscalls/syscall.tbl | 2 + arch/s390/kernel/syscalls/syscall.tbl | 2 + arch/sh/kernel/syscalls/syscall.tbl | 2 + arch/sparc/kernel/syscalls/syscall.tbl | 2 + arch/x86/entry/syscalls/syscall_32.tbl | 2 + arch/x86/entry/syscalls/syscall_64.tbl | 2 + arch/xtensa/kernel/syscalls/syscall.tbl | 2 + fs/file_attr.c | 148 ++++++++++++++++++++++++= ++++ include/linux/syscalls.h | 6 ++ include/uapi/asm-generic/unistd.h | 8 +- include/uapi/linux/fs.h | 18 ++++ scripts/syscall.tbl | 2 + 21 files changed, 213 insertions(+), 1 deletion(-) diff --git a/arch/alpha/kernel/syscalls/syscall.tbl b/arch/alpha/kernel/sys= calls/syscall.tbl index 2dd6340de6b4..16dca28ebf17 100644 --- a/arch/alpha/kernel/syscalls/syscall.tbl +++ b/arch/alpha/kernel/syscalls/syscall.tbl @@ -507,3 +507,5 @@ 575 common listxattrat sys_listxattrat 576 common removexattrat sys_removexattrat 577 common open_tree_attr sys_open_tree_attr +578 common file_getattr sys_file_getattr +579 common file_setattr sys_file_setattr diff --git a/arch/arm/tools/syscall.tbl b/arch/arm/tools/syscall.tbl index 27c1d5ebcd91..b07e699aaa3c 100644 --- a/arch/arm/tools/syscall.tbl +++ b/arch/arm/tools/syscall.tbl @@ -482,3 +482,5 @@ 465 common listxattrat sys_listxattrat 466 common removexattrat sys_removexattrat 467 common open_tree_attr sys_open_tree_attr +468 common file_getattr sys_file_getattr +469 common file_setattr sys_file_setattr diff --git a/arch/arm64/tools/syscall_32.tbl b/arch/arm64/tools/syscall_32.= tbl index 0765b3a8d6d6..8d9088bc577d 100644 --- a/arch/arm64/tools/syscall_32.tbl +++ b/arch/arm64/tools/syscall_32.tbl @@ -479,3 +479,5 @@ 465 common listxattrat sys_listxattrat 466 common removexattrat sys_removexattrat 467 common open_tree_attr sys_open_tree_attr +468 common file_getattr sys_file_getattr +469 common file_setattr sys_file_setattr diff --git a/arch/m68k/kernel/syscalls/syscall.tbl b/arch/m68k/kernel/sysca= lls/syscall.tbl index 9fe47112c586..f41d38dfbf13 100644 --- a/arch/m68k/kernel/syscalls/syscall.tbl +++ b/arch/m68k/kernel/syscalls/syscall.tbl @@ -467,3 +467,5 @@ 465 common listxattrat sys_listxattrat 466 common removexattrat sys_removexattrat 467 common open_tree_attr sys_open_tree_attr +468 common file_getattr sys_file_getattr +469 common file_setattr sys_file_setattr diff --git a/arch/microblaze/kernel/syscalls/syscall.tbl b/arch/microblaze/= kernel/syscalls/syscall.tbl index 7b6e97828e55..580af574fe73 100644 --- a/arch/microblaze/kernel/syscalls/syscall.tbl +++ b/arch/microblaze/kernel/syscalls/syscall.tbl @@ -473,3 +473,5 @@ 465 common listxattrat sys_listxattrat 466 common removexattrat sys_removexattrat 467 common open_tree_attr sys_open_tree_attr +468 common file_getattr sys_file_getattr +469 common file_setattr sys_file_setattr diff --git a/arch/mips/kernel/syscalls/syscall_n32.tbl b/arch/mips/kernel/s= yscalls/syscall_n32.tbl index aa70e371bb54..d824ffe9a014 100644 --- a/arch/mips/kernel/syscalls/syscall_n32.tbl +++ b/arch/mips/kernel/syscalls/syscall_n32.tbl @@ -406,3 +406,5 @@ 465 n32 listxattrat sys_listxattrat 466 n32 removexattrat sys_removexattrat 467 n32 open_tree_attr sys_open_tree_attr +468 n32 file_getattr sys_file_getattr +469 n32 file_setattr sys_file_setattr diff --git a/arch/mips/kernel/syscalls/syscall_n64.tbl b/arch/mips/kernel/s= yscalls/syscall_n64.tbl index 1e8c44c7b614..7a7049c2c307 100644 --- a/arch/mips/kernel/syscalls/syscall_n64.tbl +++ b/arch/mips/kernel/syscalls/syscall_n64.tbl @@ -382,3 +382,5 @@ 465 n64 listxattrat sys_listxattrat 466 n64 removexattrat sys_removexattrat 467 n64 open_tree_attr sys_open_tree_attr +468 n64 file_getattr sys_file_getattr +469 n64 file_setattr sys_file_setattr diff --git a/arch/mips/kernel/syscalls/syscall_o32.tbl b/arch/mips/kernel/s= yscalls/syscall_o32.tbl index 114a5a1a6230..d330274f0601 100644 --- a/arch/mips/kernel/syscalls/syscall_o32.tbl +++ b/arch/mips/kernel/syscalls/syscall_o32.tbl @@ -455,3 +455,5 @@ 465 o32 listxattrat sys_listxattrat 466 o32 removexattrat sys_removexattrat 467 o32 open_tree_attr sys_open_tree_attr +468 o32 file_getattr sys_file_getattr +469 o32 file_setattr sys_file_setattr diff --git a/arch/parisc/kernel/syscalls/syscall.tbl b/arch/parisc/kernel/s= yscalls/syscall.tbl index 94df3cb957e9..88a788a7b18d 100644 --- a/arch/parisc/kernel/syscalls/syscall.tbl +++ b/arch/parisc/kernel/syscalls/syscall.tbl @@ -466,3 +466,5 @@ 465 common listxattrat sys_listxattrat 466 common removexattrat sys_removexattrat 467 common open_tree_attr sys_open_tree_attr +468 common file_getattr sys_file_getattr +469 common file_setattr sys_file_setattr diff --git a/arch/powerpc/kernel/syscalls/syscall.tbl b/arch/powerpc/kernel= /syscalls/syscall.tbl index 9a084bdb8926..b453e80dfc00 100644 --- a/arch/powerpc/kernel/syscalls/syscall.tbl +++ b/arch/powerpc/kernel/syscalls/syscall.tbl @@ -558,3 +558,5 @@ 465 common listxattrat sys_listxattrat 466 common removexattrat sys_removexattrat 467 common open_tree_attr sys_open_tree_attr +468 common file_getattr sys_file_getattr +469 common file_setattr sys_file_setattr diff --git a/arch/s390/kernel/syscalls/syscall.tbl b/arch/s390/kernel/sysca= lls/syscall.tbl index a4569b96ef06..8a6744d658db 100644 --- a/arch/s390/kernel/syscalls/syscall.tbl +++ b/arch/s390/kernel/syscalls/syscall.tbl @@ -470,3 +470,5 @@ 465 common listxattrat sys_listxattrat sys_listxattrat 466 common removexattrat sys_removexattrat sys_removexattrat 467 common open_tree_attr sys_open_tree_attr sys_open_tree_attr +468 common file_getattr sys_file_getattr sys_file_getattr +469 common file_setattr sys_file_setattr sys_file_setattr diff --git a/arch/sh/kernel/syscalls/syscall.tbl b/arch/sh/kernel/syscalls/= syscall.tbl index 52a7652fcff6..5e9c9eff5539 100644 --- a/arch/sh/kernel/syscalls/syscall.tbl +++ b/arch/sh/kernel/syscalls/syscall.tbl @@ -471,3 +471,5 @@ 465 common listxattrat sys_listxattrat 466 common removexattrat sys_removexattrat 467 common open_tree_attr sys_open_tree_attr +468 common file_getattr sys_file_getattr +469 common file_setattr sys_file_setattr diff --git a/arch/sparc/kernel/syscalls/syscall.tbl b/arch/sparc/kernel/sys= calls/syscall.tbl index 83e45eb6c095..ebb7d06d1044 100644 --- a/arch/sparc/kernel/syscalls/syscall.tbl +++ b/arch/sparc/kernel/syscalls/syscall.tbl @@ -513,3 +513,5 @@ 465 common listxattrat sys_listxattrat 466 common removexattrat sys_removexattrat 467 common open_tree_attr sys_open_tree_attr +468 common file_getattr sys_file_getattr +469 common file_setattr sys_file_setattr diff --git a/arch/x86/entry/syscalls/syscall_32.tbl b/arch/x86/entry/syscal= ls/syscall_32.tbl index ac007ea00979..4877e16da69a 100644 --- a/arch/x86/entry/syscalls/syscall_32.tbl +++ b/arch/x86/entry/syscalls/syscall_32.tbl @@ -473,3 +473,5 @@ 465 i386 listxattrat sys_listxattrat 466 i386 removexattrat sys_removexattrat 467 i386 open_tree_attr sys_open_tree_attr +468 i386 file_getattr sys_file_getattr +469 i386 file_setattr sys_file_setattr diff --git a/arch/x86/entry/syscalls/syscall_64.tbl b/arch/x86/entry/syscal= ls/syscall_64.tbl index cfb5ca41e30d..92cf0fe2291e 100644 --- a/arch/x86/entry/syscalls/syscall_64.tbl +++ b/arch/x86/entry/syscalls/syscall_64.tbl @@ -391,6 +391,8 @@ 465 common listxattrat sys_listxattrat 466 common removexattrat sys_removexattrat 467 common open_tree_attr sys_open_tree_attr +468 common file_getattr sys_file_getattr +469 common file_setattr sys_file_setattr =20 # # Due to a historical design error, certain syscalls are numbered differen= tly diff --git a/arch/xtensa/kernel/syscalls/syscall.tbl b/arch/xtensa/kernel/s= yscalls/syscall.tbl index f657a77314f8..374e4cb788d8 100644 --- a/arch/xtensa/kernel/syscalls/syscall.tbl +++ b/arch/xtensa/kernel/syscalls/syscall.tbl @@ -438,3 +438,5 @@ 465 common listxattrat sys_listxattrat 466 common removexattrat sys_removexattrat 467 common open_tree_attr sys_open_tree_attr +468 common file_getattr sys_file_getattr +469 common file_setattr sys_file_setattr diff --git a/fs/file_attr.c b/fs/file_attr.c index 62f08872d4ad..fda9d847eee5 100644 --- a/fs/file_attr.c +++ b/fs/file_attr.c @@ -3,6 +3,10 @@ #include #include #include +#include +#include + +#include "internal.h" =20 /** * fileattr_fill_xflags - initialize fileattr with xflags @@ -89,6 +93,19 @@ int vfs_fileattr_get(struct dentry *dentry, struct filea= ttr *fa) } EXPORT_SYMBOL(vfs_fileattr_get); =20 +static void fileattr_to_fsx_fileattr(const struct fileattr *fa, + struct fsx_fileattr *fsx) +{ + __u32 mask =3D FS_XFLAGS_MASK; + + memset(fsx, 0, sizeof(struct fsx_fileattr)); + fsx->fsx_xflags =3D fa->fsx_xflags & mask; + fsx->fsx_extsize =3D fa->fsx_extsize; + fsx->fsx_nextents =3D fa->fsx_nextents; + fsx->fsx_projid =3D fa->fsx_projid; + fsx->fsx_cowextsize =3D fa->fsx_cowextsize; +} + /** * copy_fsxattr_to_user - copy fsxattr to userspace. * @fa: fileattr pointer @@ -115,6 +132,23 @@ int copy_fsxattr_to_user(const struct fileattr *fa, st= ruct fsxattr __user *ufa) } EXPORT_SYMBOL(copy_fsxattr_to_user); =20 +static int fsx_fileattr_to_fileattr(const struct fsx_fileattr *fsx, + struct fileattr *fa) +{ + __u32 mask =3D FS_XFLAGS_MASK; + + if (fsx->fsx_xflags & ~mask) + return -EINVAL; + + fileattr_fill_xflags(fa, fsx->fsx_xflags); + fa->fsx_xflags &=3D ~FS_XFLAG_RDONLY_MASK; + fa->fsx_extsize =3D fsx->fsx_extsize; + fa->fsx_projid =3D fsx->fsx_projid; + fa->fsx_cowextsize =3D fsx->fsx_cowextsize; + + return 0; +} + static int copy_fsxattr_from_user(struct fileattr *fa, struct fsxattr __user *ufa) { @@ -343,3 +377,117 @@ int ioctl_fssetxattr(struct file *file, void __user *= argp) return err; } EXPORT_SYMBOL(ioctl_fssetxattr); + +SYSCALL_DEFINE5(file_getattr, int, dfd, const char __user *, filename, + struct fsx_fileattr __user *, ufsx, size_t, usize, + unsigned int, at_flags) +{ + struct fileattr fa; + struct path filepath __free(path_put) =3D {}; + int error; + unsigned int lookup_flags =3D 0; + struct filename *name __free(putname) =3D NULL; + struct fsx_fileattr fsx; + + BUILD_BUG_ON(sizeof(struct fsx_fileattr) < FSX_FILEATTR_SIZE_VER0); + BUILD_BUG_ON(sizeof(struct fsx_fileattr) !=3D FSX_FILEATTR_SIZE_LATEST); + + if ((at_flags & ~(AT_SYMLINK_NOFOLLOW | AT_EMPTY_PATH)) !=3D 0) + return -EINVAL; + + if (!(at_flags & AT_SYMLINK_NOFOLLOW)) + lookup_flags |=3D LOOKUP_FOLLOW; + + if (usize > PAGE_SIZE) + return -E2BIG; + + if (usize < FSX_FILEATTR_SIZE_VER0) + return -EINVAL; + + name =3D getname_maybe_null(filename, at_flags); + if (IS_ERR(name)) + return PTR_ERR(name); + + if (!name && dfd >=3D 0) { + CLASS(fd, f)(dfd); + + filepath =3D fd_file(f)->f_path; + path_get(&filepath); + } else { + error =3D filename_lookup(dfd, name, lookup_flags, &filepath, + NULL); + if (error) + return error; + } + + error =3D vfs_fileattr_get(filepath.dentry, &fa); + if (error) + return error; + + fileattr_to_fsx_fileattr(&fa, &fsx); + error =3D copy_struct_to_user(ufsx, usize, &fsx, + sizeof(struct fsx_fileattr), NULL); + + return error; +} + +SYSCALL_DEFINE5(file_setattr, int, dfd, const char __user *, filename, + struct fsx_fileattr __user *, ufsx, size_t, usize, + unsigned int, at_flags) +{ + struct fileattr fa; + struct path filepath __free(path_put) =3D {}; + int error; + unsigned int lookup_flags =3D 0; + struct filename *name __free(putname) =3D NULL; + struct fsx_fileattr fsx; + + BUILD_BUG_ON(sizeof(struct fsx_fileattr) < FSX_FILEATTR_SIZE_VER0); + BUILD_BUG_ON(sizeof(struct fsx_fileattr) !=3D FSX_FILEATTR_SIZE_LATEST); + + if ((at_flags & ~(AT_SYMLINK_NOFOLLOW | AT_EMPTY_PATH)) !=3D 0) + return -EINVAL; + + if (!(at_flags & AT_SYMLINK_NOFOLLOW)) + lookup_flags |=3D LOOKUP_FOLLOW; + + if (usize > PAGE_SIZE) + return -E2BIG; + + if (usize < FSX_FILEATTR_SIZE_VER0) + return -EINVAL; + + error =3D copy_struct_from_user(&fsx, sizeof(struct fsx_fileattr), ufsx, + usize); + if (error) + return error; + + error =3D fsx_fileattr_to_fileattr(&fsx, &fa); + if (error) + return error; + + name =3D getname_maybe_null(filename, at_flags); + if (IS_ERR(name)) + return PTR_ERR(name); + + if (!name && dfd >=3D 0) { + CLASS(fd, f)(dfd); + + filepath =3D fd_file(f)->f_path; + path_get(&filepath); + } else { + error =3D filename_lookup(dfd, name, lookup_flags, &filepath, + NULL); + if (error) + return error; + } + + error =3D mnt_want_write(filepath.mnt); + if (!error) { + error =3D vfs_fileattr_set(mnt_idmap(filepath.mnt), + filepath.dentry, &fa); + mnt_drop_write(filepath.mnt); + } + + return error; +} diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index e5603cc91963..179acbe28fec 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h @@ -371,6 +371,12 @@ asmlinkage long sys_removexattrat(int dfd, const char = __user *path, asmlinkage long sys_lremovexattr(const char __user *path, const char __user *name); asmlinkage long sys_fremovexattr(int fd, const char __user *name); +asmlinkage long sys_file_getattr(int dfd, const char __user *filename, + struct fsx_fileattr __user *ufsx, size_t usize, + unsigned int at_flags); +asmlinkage long sys_file_setattr(int dfd, const char __user *filename, + struct fsx_fileattr __user *ufsx, size_t usize, + unsigned int at_flags); asmlinkage long sys_getcwd(char __user *buf, unsigned long size); asmlinkage long sys_eventfd2(unsigned int count, int flags); asmlinkage long sys_epoll_create1(int flags); diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/u= nistd.h index 2892a45023af..04e0077fb4c9 100644 --- a/include/uapi/asm-generic/unistd.h +++ b/include/uapi/asm-generic/unistd.h @@ -852,8 +852,14 @@ __SYSCALL(__NR_removexattrat, sys_removexattrat) #define __NR_open_tree_attr 467 __SYSCALL(__NR_open_tree_attr, sys_open_tree_attr) =20 +/* fs/inode.c */ +#define __NR_file_getattr 468 +__SYSCALL(__NR_file_getattr, sys_file_getattr) +#define __NR_file_setattr 469 +__SYSCALL(__NR_file_setattr, sys_file_setattr) + #undef __NR_syscalls -#define __NR_syscalls 468 +#define __NR_syscalls 470 =20 /* * 32 bit systems traditionally used different diff --git a/include/uapi/linux/fs.h b/include/uapi/linux/fs.h index 0098b0ce8ccb..0784f2033ba4 100644 --- a/include/uapi/linux/fs.h +++ b/include/uapi/linux/fs.h @@ -148,6 +148,24 @@ struct fsxattr { unsigned char fsx_pad[8]; }; =20 +/* + * Variable size structure for file_[sg]et_attr(). + * + * Note. This is alternative to the structure 'struct fileattr'/'struct fs= xattr'. + * As this structure is passed to/from userspace with its size, this can + * be versioned based on the size. + */ +struct fsx_fileattr { + __u32 fsx_xflags; /* xflags field value (get/set) */ + __u32 fsx_extsize; /* extsize field value (get/set)*/ + __u32 fsx_nextents; /* nextents field value (get) */ + __u32 fsx_projid; /* project identifier (get/set) */ + __u32 fsx_cowextsize; /* CoW extsize field value (get/set) */ +}; + +#define FSX_FILEATTR_SIZE_VER0 20 +#define FSX_FILEATTR_SIZE_LATEST FSX_FILEATTR_SIZE_VER0 + /* * Flags for the fsx_xflags field */ diff --git a/scripts/syscall.tbl b/scripts/syscall.tbl index 580b4e246aec..d1ae5e92c615 100644 --- a/scripts/syscall.tbl +++ b/scripts/syscall.tbl @@ -408,3 +408,5 @@ 465 common listxattrat sys_listxattrat 466 common removexattrat sys_removexattrat 467 common open_tree_attr sys_open_tree_attr +468 common file_getattr sys_file_getattr +469 common file_setattr sys_file_setattr --=20 2.47.2