From nobody Sat Feb 7 19:45:33 2026 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 CDFD721931B for ; Tue, 13 May 2025 09:18:18 +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=1747127903; cv=none; b=rhvkC1eLPRsM7L/YV6EMzeaSCJip31TSyXE8kFN1MV4UJjZJ94XA14r/UMuxLTQLMOcqCPyWzleQypavyGd12p5xY4MMPT1lfkIOTM8l9o20JM/4iNBe1HumBQSy1c6sLCw1u24MkN9v8p/7X2qffd7UstKL9eCYpXbJ8a/INPU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747127903; c=relaxed/simple; bh=lWnpmRGbimw9Ccwg9DRdBJUFR0Hwxn4Kj8mLRBOmaRI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=AHISbgXjDY9SnJEyaiB2SvCgO9UO5tuv0jTESg6fVnM8LKnQca2aoSdv/BBascmZ/jZawtoqANJVagQVEUq7mSFJnLQ0pBSAp4wO1teGdHIurQYjUTxVosMTORTnhl7CP09LDoquK5K/DFe3I2Wzxn0YLgWiDaM2VWbUdlze5G0= 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=gI3+dEYj; 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="gI3+dEYj" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1747127896; 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=DOzCZLZ8C63sKEIEu8NsBxg+KeZh/fdqLcOoc3mUKBU=; b=gI3+dEYjtINQEbFFquWp/b5kCKuuFUkRVntaKkZBOTCxUlQphCpj3WF/yJ7n8Fi8Spr2mQ zAFZarOheGpfpJ4z1UzMPXjgDZdU9088cQ9O9gdo3qPCVJA0G+ybR4iNWAbizNKZSW6Mpv Oj2QfNvBrygAVwrxWNiHVQ5r6m+2O48= Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-167-SR_SexkfObeskBW-5jaIUA-1; Tue, 13 May 2025 05:18:14 -0400 X-MC-Unique: SR_SexkfObeskBW-5jaIUA-1 X-Mimecast-MFC-AGG-ID: SR_SexkfObeskBW-5jaIUA_1747127893 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-441c96c1977so35385865e9.0 for ; Tue, 13 May 2025 02:18:14 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747127893; x=1747732693; 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=DOzCZLZ8C63sKEIEu8NsBxg+KeZh/fdqLcOoc3mUKBU=; b=OF8DDBJLUek3gr25y9afJ+dHt/yQITnoI+cEVr47DfcPEwHMB7B6EPrREVHnF6MS2c v7Nk4boQrDnr5PUOOqrvPuTx9UJKiaSEFnn6wn602N84p0Qt3or1t5cC/vXKxHyEmRso ufnK5vvBEfOzeo9QGujzQ2iLfaNfi1M8HdvhLQQUBwUlF/I3cm++GNMK3lpr7qnc4MQV 58Gn1yD4oGJgoTe+Q+2VwggPa/IOGf3SeVUFmEWv0MNHpJdXWVGwxZRo1sL42lVqZCDH LpPUFGMMuQvpuK+mcg4MKooLbrXRnVXAE6fcxKiWQnsbS3XD8pb3s28Cl9sB5BY+8XJQ kakQ== X-Forwarded-Encrypted: i=1; AJvYcCUHAy1I4xnGljh5DoVrJh5QvM0LPKrPnHz0Qd07KnsCfKg7iYFZaiMU5aWPm+clC9RSMGFtp7RZv4SvpwM=@vger.kernel.org X-Gm-Message-State: AOJu0Yw9Qppu2OFhxFwr1XElKHy/0gtrGQmRzrEoHBfEO3T+gvysBbjO w1sITQDU22WcO4azKSr3CHqjyojv8fXAG7n5ihtdEOlqefHfqqS++10IXnIKTqMiygIwDaW4iiq kwHWSbDefCxCIpfUU+wmHu6/RL8iOXWybDQYWd4E8FVPpGrcoSZ/VrjkNJIQa X-Gm-Gg: ASbGncuMDr+k2CUBVu9JtIea9lAUSRV+CbQObvEGBsZV/eK5IacovXCgQWFDSLxlPoS 1WWyOAZmWnsPkm+5Mmy84XmL5qQJ3F7ZVTMBWIfPh0pyzPg0p0Vqca0zuAYk4UiwEN3tt/Ef8gb GWPd+zsNBrSfT6Inb+/ciRy8lCu1AniaX0biCfwlnQ/hcaVJstdmU+5aKz/K5BfOQDprZTs9sYn bjjyrJUmDNbbySh+PPNtXK6FvdgwU92S3a5++Jr51R6Oey4aKIkYZ3lnW37OsAXTc1vcNw3wJNI eMbVYfi+EnSj5lY9JqsuBmTG2IOnUXCL+O2lJnJ0p5A6fFo= X-Received: by 2002:a05:600c:8519:b0:43c:e481:3353 with SMTP id 5b1f17b1804b1-442d6dacbdcmr169707305e9.17.1747127892300; Tue, 13 May 2025 02:18:12 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGBuJrtbmvMX9xwpvAxClBheb2s3ohv9cGy2aD4ig7ITjNjphrAXpH8BqrKzkCdOaBQ+kwPMg== X-Received: by 2002:a05:600c:8519:b0:43c:e481:3353 with SMTP id 5b1f17b1804b1-442d6dacbdcmr169706665e9.17.1747127891729; Tue, 13 May 2025 02:18:11 -0700 (PDT) Received: from [127.0.0.2] (109-92-26-237.static.isp.telekom.rs. [109.92.26.237]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-442ed666dc7sm12345655e9.18.2025.05.13.02.18.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 May 2025 02:18:08 -0700 (PDT) From: Andrey Albershteyn X-Google-Original-From: Andrey Albershteyn Date: Tue, 13 May 2025 11:17:54 +0200 Subject: [PATCH v5 1/7] 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: <20250513-xattrat-syscall-v5-1-22bb9c6c767f@kernel.org> References: <20250513-xattrat-syscall-v5-0-22bb9c6c767f@kernel.org> In-Reply-To: <20250513-xattrat-syscall-v5-0-22bb9c6c767f@kernel.org> To: Richard Henderson , Matt Turner , Russell King , Catalin Marinas , Will Deacon , Geert Uytterhoeven , Michal Simek , Thomas Bogendoerfer , "James E.J. Bottomley" , Helge Deller , Madhavan Srinivasan , Michael Ellerman , Nicholas Piggin , Christophe Leroy , Naveen N Rao , Heiko Carstens , Vasily Gorbik , Alexander Gordeev , Christian Borntraeger , Sven Schnelle , Yoshinori Sato , Rich Felker , John Paul Adrian Glaubitz , "David S. Miller" , Andreas Larsson , Andy Lutomirski , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Chris Zankel , Max Filippov , Alexander Viro , Christian Brauner , Jan Kara , =?utf-8?q?Micka=C3=ABl_Sala=C3=BCn?= , =?utf-8?q?G=C3=BCnther_Noack?= , Arnd Bergmann , =?utf-8?q?Pali_Roh=C3=A1r?= , Paul Moore , James Morris , "Serge E. Hallyn" , Stephen Smalley , Ondrej Mosnacek , Tyler Hicks , Miklos Szeredi , Amir Goldstein Cc: linux-alpha@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-m68k@lists.linux-m68k.org, linux-mips@vger.kernel.org, linux-parisc@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-s390@vger.kernel.org, linux-sh@vger.kernel.org, sparclinux@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-security-module@vger.kernel.org, linux-api@vger.kernel.org, linux-arch@vger.kernel.org, selinux@vger.kernel.org, ecryptfs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-xfs@vger.kernel.org, Andrey Albershteyn X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=20425; i=aalbersh@kernel.org; h=from:subject:message-id; bh=vlFp/kLaUfFXsyM4cL1jhHJcu0Pt3JZYRE4Ehh6SGDM=; b=owJ4nJvAy8zAJea2/JXEGuOHHIyn1ZIYMpT5vHn9IktOzAjg7rM+cT7S23P6Xwmxz3vKp3W4B IjoKqm1WnaUsjCIcTHIiimyrJPWmppUJJV/xKBGHmYOKxPIEAYuTgGYyMEnDP80dwd/37JjnnOF U2yAg5GN2cRFKl6uAZqv5LP6/ok1Gn5n+M1my1ThejzLQaXl+AzP2BatbBfzCJFHT78lnHiTWrb 3LwMA1ZlCMQ== 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. Just refactoring. Signed-off-by: Andrey Albershteyn --- 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 77fd7f7b5d02478621f06304e447cc4a387a7167..2f1daaea86da456672234cf4df3= 5e63e39a3e71d 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 0000000000000000000000000000000000000000..2910b7047721df893540ff8a7c9= 92558390eaa3a --- /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 c91fd2b46a77f6f1ea99aab56b4d92b6d9a8c534..5bf1e4215252e3fe4febfc9646b= b8209aadc76f0 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 47c05a9851d0600964b644c9c7218faacfd865f8..6030d0bf7ad32693a0f48a6f284= 75d97e768bb3e 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 Sat Feb 7 19:45:33 2026 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 3220F21770D for ; Tue, 13 May 2025 09:18:21 +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=1747127904; cv=none; b=do4QOxVvjCH9qHJ4jbkxGPGsPx7MMHOxunIXRFtyPW6AjYfWSjuoGhFQxDR2lydavhd+JANt1U95wJ+F37o7BgAfDX6uqoSHuWmLtah2k0hrSzWvwiSZkGmiRt5IOIcQ0cW+kq9o/quWJ5qUwkTvBVv1Fj7ZBrvFnsqPZLFEmUE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747127904; c=relaxed/simple; bh=YQGIdXvgchaWb1V6UiKUwEOK/o3C4y9T6tou+r20L0U=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=etC17uvoEOGpTPQr36n8dtJ6c/okJM2gmPrlFnqp4OibDdzYrcJZOmH4zQWpYle9HySXrcTRbeJ3r4TgRXmafoXtGpYaoaqZmOdmkJJKCrh3gYd2n8gbv3vDlXprFZkl9FMxSNyg9CFl1d+fsCUN11vDPMVcblOEZErL6X6+DzI= 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=Cm6vb4i3; 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="Cm6vb4i3" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1747127899; 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=kQLwPqXkUI6z4QQX8G7LIPfd+304h8Dijb2vEngn3fA=; b=Cm6vb4i3+v9qrjPJDFqLXJtPMwhlYXth1H7amHQQgZx+5CE21+SO8CzavEW3iw9aXCvvig /oqT7T9L/D38fGBVLz/kyu2jZq3Jm0BgFb+5bxXgfHv7imRTI+7kwPEca8claO0A+Rrs2o cUDTmHx75/kLN2JY6d+oIPXpCFxkxyE= 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-515-v3PlicHYPpO_fCkN72xMIQ-1; Tue, 13 May 2025 05:18:17 -0400 X-MC-Unique: v3PlicHYPpO_fCkN72xMIQ-1 X-Mimecast-MFC-AGG-ID: v3PlicHYPpO_fCkN72xMIQ_1747127896 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-43cec217977so26749495e9.0 for ; Tue, 13 May 2025 02:18:17 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747127896; x=1747732696; 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=kQLwPqXkUI6z4QQX8G7LIPfd+304h8Dijb2vEngn3fA=; b=C89iKdH3Y4BN8EzT2DJHNGlAvVv+ZBap4ALgsECPg7xJidJ+Cvw2nT2+KKU5byfFAF GgLler/PTS0YpLuG14PJxBeMiK50zlBtpoDYNecocn2R4J1b3t5lRioZ8Y/7Md2Fetnv hcI8e5oBj+IhhwAIaUjSvUjyXfSQ+pPVSif9hdRZNdtuNS1k42gL3K02N/9yx5DfRCbw cp8Sdeh0kPo5kYomgI0C7REoaF/I4N4rK1uSkDjaVFGMrr6Tm91kJBaMemuYgHdY3Wr5 QQSK61k8Jp1Maecru5kEWzEOKhKmmJj3AgIVx57+BsDz2sovjNOsijeEGlR2ISowXVVW KDWA== X-Forwarded-Encrypted: i=1; AJvYcCWUro2UAlIZdtDH0xZ0Xq/ou+i5NPy4OVfVfrbkbbr0Dggx0/empPw/CWV2hXeBrooTpqyF1vv3YWwvaIU=@vger.kernel.org X-Gm-Message-State: AOJu0Yx7N5SbiZyfxig72Vm+xRes8kg+oocOh7HblDNQaNTcbrlyhpQM gDD9hZqJnwF1gzrAiCVIMz0zJ5MyV4iOUpepuL+EXxwp8Uili6q1fYNYhyOQq1wQf8KmZ42o1sJ DJdyV78OBoFMm1J5TrR8ZWEKzoPs8r7m16iQW2mIbVdQ84KSav6XkWl8XrI15 X-Gm-Gg: ASbGncvItRuA7bttjS6IY2HyGwPYg6EXiGoRAtcQDEvc+97pgRD520mNVs4RWtq6gcU G4wxGXwdb6alLbkBb1au5YLDy1vrJz2Qk+FuQbsctrBF9VIUdHjKkX9LSHRmTRtgjfoQnqNI9Tf rVDkV5B+CTaepeyoN96GEXfw5BWijEikKxsz+zfMxvAXUqQT0g84IRRDO3N5rpTlB3gCZDD1Iq2 GOmA/IQ3UqNv6VaGQkz1Ovx0TeAxhQzqK/7MZ2CjbY9N5qKJ4TpCSh1uE9bxtP46GK9EOH//WGB +HvfRWFY6RSqXG16ItFRsvNiFSo4riO0Meuk+E84gvyC21Y= X-Received: by 2002:a05:600c:3c8c:b0:43d:224:86b5 with SMTP id 5b1f17b1804b1-442d89ca4f8mr121131775e9.4.1747127896014; Tue, 13 May 2025 02:18:16 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHgkQ6lr6jSThr2Cb3q6ZMQrTYHBuqnvQFthxFwxp9l7aEmx3rs55WDKKU2lMzSuNkJYBOxWQ== X-Received: by 2002:a05:600c:3c8c:b0:43d:224:86b5 with SMTP id 5b1f17b1804b1-442d89ca4f8mr121130905e9.4.1747127895389; Tue, 13 May 2025 02:18:15 -0700 (PDT) Received: from [127.0.0.2] (109-92-26-237.static.isp.telekom.rs. [109.92.26.237]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-442ed666dc7sm12345655e9.18.2025.05.13.02.18.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 May 2025 02:18:14 -0700 (PDT) From: Andrey Albershteyn X-Google-Original-From: Andrey Albershteyn Date: Tue, 13 May 2025 11:17:55 +0200 Subject: [PATCH v5 2/7] 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: <20250513-xattrat-syscall-v5-2-22bb9c6c767f@kernel.org> References: <20250513-xattrat-syscall-v5-0-22bb9c6c767f@kernel.org> In-Reply-To: <20250513-xattrat-syscall-v5-0-22bb9c6c767f@kernel.org> To: Richard Henderson , Matt Turner , Russell King , Catalin Marinas , Will Deacon , Geert Uytterhoeven , Michal Simek , Thomas Bogendoerfer , "James E.J. Bottomley" , Helge Deller , Madhavan Srinivasan , Michael Ellerman , Nicholas Piggin , Christophe Leroy , Naveen N Rao , Heiko Carstens , Vasily Gorbik , Alexander Gordeev , Christian Borntraeger , Sven Schnelle , Yoshinori Sato , Rich Felker , John Paul Adrian Glaubitz , "David S. Miller" , Andreas Larsson , Andy Lutomirski , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Chris Zankel , Max Filippov , Alexander Viro , Christian Brauner , Jan Kara , =?utf-8?q?Micka=C3=ABl_Sala=C3=BCn?= , =?utf-8?q?G=C3=BCnther_Noack?= , Arnd Bergmann , =?utf-8?q?Pali_Roh=C3=A1r?= , Paul Moore , James Morris , "Serge E. Hallyn" , Stephen Smalley , Ondrej Mosnacek , Tyler Hicks , Miklos Szeredi , Amir Goldstein Cc: linux-alpha@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-m68k@lists.linux-m68k.org, linux-mips@vger.kernel.org, linux-parisc@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-s390@vger.kernel.org, linux-sh@vger.kernel.org, sparclinux@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-security-module@vger.kernel.org, linux-api@vger.kernel.org, linux-arch@vger.kernel.org, selinux@vger.kernel.org, ecryptfs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-xfs@vger.kernel.org, Andrey Albershteyn X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=5418; i=aalbersh@kernel.org; h=from:subject:message-id; bh=YQGIdXvgchaWb1V6UiKUwEOK/o3C4y9T6tou+r20L0U=; b=owJ4nJvAy8zAJea2/JXEGuOHHIyn1ZIYMpT5vF3LC9luzDZOZnCaUM3c/WPNxAMdNf8KZT2O5 y9vqDzGfKGjlIVBjItBVkyRZZ201tSkIqn8IwY18jBzWJlAhjBwcQrARMKmM/zhqWy5qqrd8PO1 /vv/OiXxZr/F9nBPzWTMWJI18d+cxMJ8RoZXGf8r1h+awrr7cHvWqX9t5UWFz++c4rvw7aXBssS IVQJsAGi4SHY= 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 Signed-off-by: Andrey Albershteyn Acked-by: Paul Moore --- 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 2910b7047721df893540ff8a7c992558390eaa3a..be62d97cc444a445deac1c8ac83= 31f4a3766126a 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 bf3bbac4e02a59a67de4ace85b93b1a878131f60..9600a4350e791f47006720765c1= 99e35d3abafd4 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 cc9b54d95d22cd11480c38148005ed778b7af1bd..d2da2f654345b36b20fbe68ce11= 468ca4a55d8b3 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, @@ -1053,6 +1057,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 fb57e8fddd911bbb417ed2e7db443979bf611f43..09c891e6027dc1803a3af024b2f= 676e263da8aec 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 Sat Feb 7 19:45:33 2026 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 72A8921B8F7 for ; Tue, 13 May 2025 09:18:23 +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=1747127908; cv=none; b=prJtel6QAd8rX2r/b+N8y4i4Y01bI95GdKIPe4P0ji1rqlRgby0z2mUxRzwN3zbqGgi1tIp8ZG3qDFX+2qMixn1mTuy6gUI+1zEEaWZLOKdHkLMntxZGbGjUQcupLhn29bVi4WXadMxtvAm9SFgjvsmhnWWwrw/Fn5DEKw5Tu+I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747127908; c=relaxed/simple; bh=wSzH0WcqWhiy63ekDcp2P+4tMQ4i2gTZHqE6rCKQ++I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PVk84E4hpPssJ563xTxK13al2HEiO+ep01VxYVbiP8ZLeSbmXBwDPbIAGv01QJ1oYNeblIgndmQ5eiUkzUQ7dUqbtSEsAs5GXHAddf4/iWQ4hqswLWE8824dtBd9l/B3nHrPUbIVC7X6eiV2EanQ4Pc/9M6XMyk71M+RBSaiuqw= 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=Ed0+4OzW; 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="Ed0+4OzW" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1747127901; 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=A7i9r0bj6CyLmaFmxt3qgx2Tj6vgASlaO3PK3g/iy20=; b=Ed0+4OzWfLh32523fJEz31/L5nouK9o+S1bguFQ57Sl5ZXPnRCRs0y2BwRhH1/LxjNlH9D P4MAuRx2z/LbSBwW5PzVPO9tXHmLEUcxlgJfz0A6EE1j3f8/UgCZTWfThcjSZ8OKCwbvob dLEFxUljxywwBAmGLwZNvrcSYp1nDts= 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-426-v-zjcjf4P5arDUxFVXYr9g-1; Tue, 13 May 2025 05:18:20 -0400 X-MC-Unique: v-zjcjf4P5arDUxFVXYr9g-1 X-Mimecast-MFC-AGG-ID: v-zjcjf4P5arDUxFVXYr9g_1747127899 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-43cf5196c25so26203515e9.0 for ; Tue, 13 May 2025 02:18:20 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747127899; x=1747732699; 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=A7i9r0bj6CyLmaFmxt3qgx2Tj6vgASlaO3PK3g/iy20=; b=w0tOC1Oy+kElPxn89Kf9wYZOcp8fN4ExmEV4FheJ8aJyaoailVdkAPGzIm/8jnoAJi pAH/UlRnYrYEXZ659CrMhQhL2hPBeSr0Ik+XgP+wsbm99A+3jpVT1V3Ldlcf0bVpTlDq 9bSodshdepIu+aWaNpZQcqMCihSJ2ZQuuecsPEkE56FW4I1Cd25TXJZN1fM8pn/pOglQ WKipvHV6RDhKHUM69vnMKX6NH9lKKrYqSiDPMRnxhLH25CPKtatc9FWK5alhiyKhzns6 X0ZVLeDhN5IqWi7421t7ItnyaOR4kA2b+nGJO29oXJyXqx1jm9VyLRXV+U2PcY4/4f/6 jfvw== X-Forwarded-Encrypted: i=1; AJvYcCUhNSxCDT4uar3PNh5At7Tv9OwQDPfLsxxr3Pr9RPit+XQsRr/Xgtc1ucwdAMvEG3qH6+D5BHKqlBHmt7s=@vger.kernel.org X-Gm-Message-State: AOJu0YyHXqdx8zQoJELdJ1Fpk9cYUVfQ2mPZz15HX6U6l3YsbXEBMiPe kCiXbd3gY5iLmFBQAn3V5Q2YmRa1sbrdpyt2hjZc7rS1GJ7mVEiRQt25qUYgbLSXJGAi8PliTK/ 5j16sKhVCn7t7I4l+QwMfY0ut4JMfV8xKqkMR08Kv7JzsLB4L0zqc86EMhza+ X-Gm-Gg: ASbGnctcWJOCYN0k0Wu5dKrapmMIiIJNQ1WJS51cPpf+BhHqpWhMKtz8doWxzz6njb+ Xy9Vvtwq9NiVMfyTUP8vsDpXDhLKmUwO1txp/JWuLExapBS9uD0UB+6hBQLQNSuxnzxo7h+ags4 rq6+LsOZScrQzjpdwsqLh3Akb+lfq+lHPKLIb6y2jme+lWlYljMprdT2gRArhGaainLBs3qGXzi aJ/smBVYkr06sipBz2CqkfTf1gVdqd6puh3FjvKFyz3e+zqZKsTQo6aDgYeArassVLx1vZZ8UGH 2RKHJ8TfrrwOPNsWMFtwAqilj1yVyn43+RDOCthguBmTJRs= X-Received: by 2002:a05:600c:b85:b0:43d:fa59:cc8f with SMTP id 5b1f17b1804b1-442d6dde9a5mr123282355e9.33.1747127898833; Tue, 13 May 2025 02:18:18 -0700 (PDT) X-Google-Smtp-Source: AGHT+IH48YApAweQLr9FqjcxLWZAARsvWVI15CFcissyg+mEXGTlUmY2j0SDRus7eO6YNuUdP6jeRg== X-Received: by 2002:a05:600c:b85:b0:43d:fa59:cc8f with SMTP id 5b1f17b1804b1-442d6dde9a5mr123281625e9.33.1747127898279; Tue, 13 May 2025 02:18:18 -0700 (PDT) Received: from [127.0.0.2] (109-92-26-237.static.isp.telekom.rs. [109.92.26.237]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-442ed666dc7sm12345655e9.18.2025.05.13.02.18.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 May 2025 02:18:17 -0700 (PDT) From: Andrey Albershteyn X-Google-Original-From: Andrey Albershteyn Date: Tue, 13 May 2025 11:17:56 +0200 Subject: [PATCH v5 3/7] 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: <20250513-xattrat-syscall-v5-3-22bb9c6c767f@kernel.org> References: <20250513-xattrat-syscall-v5-0-22bb9c6c767f@kernel.org> In-Reply-To: <20250513-xattrat-syscall-v5-0-22bb9c6c767f@kernel.org> To: Richard Henderson , Matt Turner , Russell King , Catalin Marinas , Will Deacon , Geert Uytterhoeven , Michal Simek , Thomas Bogendoerfer , "James E.J. Bottomley" , Helge Deller , Madhavan Srinivasan , Michael Ellerman , Nicholas Piggin , Christophe Leroy , Naveen N Rao , Heiko Carstens , Vasily Gorbik , Alexander Gordeev , Christian Borntraeger , Sven Schnelle , Yoshinori Sato , Rich Felker , John Paul Adrian Glaubitz , "David S. Miller" , Andreas Larsson , Andy Lutomirski , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Chris Zankel , Max Filippov , Alexander Viro , Christian Brauner , Jan Kara , =?utf-8?q?Micka=C3=ABl_Sala=C3=BCn?= , =?utf-8?q?G=C3=BCnther_Noack?= , Arnd Bergmann , =?utf-8?q?Pali_Roh=C3=A1r?= , Paul Moore , James Morris , "Serge E. Hallyn" , Stephen Smalley , Ondrej Mosnacek , Tyler Hicks , Miklos Szeredi , Amir Goldstein Cc: linux-alpha@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-m68k@lists.linux-m68k.org, linux-mips@vger.kernel.org, linux-parisc@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-s390@vger.kernel.org, linux-sh@vger.kernel.org, sparclinux@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-security-module@vger.kernel.org, linux-api@vger.kernel.org, linux-arch@vger.kernel.org, selinux@vger.kernel.org, ecryptfs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-xfs@vger.kernel.org, Andrey Albershteyn X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1670; i=aalbersh@kernel.org; h=from:subject:message-id; bh=wSzH0WcqWhiy63ekDcp2P+4tMQ4i2gTZHqE6rCKQ++I=; b=owJ4nJvAy8zAJea2/JXEGuOHHIyn1ZIYMpT5vOcHL6x//4Yt+9EFwZyLxr/7Tz9ZpP5u3tO4V q6ORSUh1y53lLIwiHExyIopsqyT1pqaVCSVf8SgRh5mDisTyBAGLk4BmEiwPiND+6YnluEhu/Qc Cx5cnc3R+vvvJvuQL0V6fGyyUclCHH6VjAwT/JZona0OZVzwJvX/wlkFTstmX7ezC/yqzlmc01k tfZMVAGD5RU0= 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 Signed-off-by: Andrey Albershteyn Acked-by: Paul Moore --- security/selinux/hooks.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index e7a7dcab81db6a8735877eeb911975e06a9de688..9c6e264b090f9038d6848546760= 860bfe74b7341 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -3366,6 +3366,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) { @@ -7272,6 +7284,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 Sat Feb 7 19:45:33 2026 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 20DD721ABAB for ; Tue, 13 May 2025 09:18:27 +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=1747127912; cv=none; b=aIgICqJlP/TqrB9l+/NMFDz08Ld2+ZLAa8VG1u2cUgoISeBu44vReKWau/mwx8WvNuIbHDJZku0y3LF/qR1ZhdCy3P5XCQCI2po2YF8IWxVi3R8xAeat0twJIbZo1bQknlMVBcsnl+07lzdiAarPxXAq56oBRXmpDdXGN9hAoH4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747127912; c=relaxed/simple; bh=7/qlLocSDGOnq9HanUewnfKPkCH1bdYdAp9tNZm+5GE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=qhma9zRR/MscURhwoeaH1iGquv7Y476HlR/fLrAwr1+uYCTjpEJltqjHJeKeUgCp7wwDpiXfTiDKGO8/bDf3o51uxyqccIWUxi+/5JhCBbSp/OLxB+gistp0fSbXFoZSSWfNtyt7EqfGVOeiWyFIpg74fOdQkt2giQSddzFnQ+E= 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=SeBqU9Ns; 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="SeBqU9Ns" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1747127905; 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=ls6EYzWLpzSyrbfDPukFujnVQKFcbGgB9h/N+wiqpNc=; b=SeBqU9NsN/hMeIlBZSIJpLaqE8/lC/Nqu0DiLCtv7NdhYjP/9GdGpqwJr7UQi2sb/topez 5Cbxo9j97l5Aq8wqUiuIgjCw2xjUB3Vli5ELCGcBtQ6d2ISN9Bj/046BjVogy+WErq+yuX h2hC+5dntTbwwqY3T7YZTo5hbl0wCf8= 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-665-h2gUSV2eOsOCH6hUC2zWBg-1; Tue, 13 May 2025 05:18:23 -0400 X-MC-Unique: h2gUSV2eOsOCH6hUC2zWBg-1 X-Mimecast-MFC-AGG-ID: h2gUSV2eOsOCH6hUC2zWBg_1747127902 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-442d472cf7fso31673225e9.3 for ; Tue, 13 May 2025 02:18:22 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747127902; x=1747732702; 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=ls6EYzWLpzSyrbfDPukFujnVQKFcbGgB9h/N+wiqpNc=; b=G6bQWrUdnKqtVQDrKh6vyoXgZKtKOpLl8tVSDVAeluUSYl/bGekNCpu+bn2KQhQTLm OtLcK2ATfXSPRx5qg6BLNdrzuZLQ4WNj9oPaLld99YckJoDvPqqvOTHZqNl1VGIR3Sc8 sA9QyURkXMC1OBav2r02ATDb+O7sh2pinavtRMgpCT5ZJQU0QQx7URwOn62Otyu416OA Eljz+jFMY/WEateZ3w8iW65hGeOImuKhqSBCbpYMcCm8XruonI0Zdp2zGuvBv2uwwOWK BgnNSo9+b7F8cXYw8VYRfjhTW1Ihouwz3XR4bIu0b9+9QXown454LZ7UL14dW7pZ8GHn v4vg== X-Forwarded-Encrypted: i=1; AJvYcCXmj8npRztYRxF4pyoICpWDkvVbUNovF+1uaK1kisXoyzKcwnXFTqZuUQjh7mwr7b18OyVMUuDcux+PNE0=@vger.kernel.org X-Gm-Message-State: AOJu0Yz9D7CcUVzZzHeUBppyQns6o09beCv3d+0eH7RSCrcJj3WE6lvn 1SJ88Fohi9YS8XOgqgoz1c4raTLu4wKhWxycaUZSG5bI2zng8HVZTg55z213Za4xQHu7iwKsDUe GQU7OfD2G5D+xcqTepUQuyLGSe2MKzEtSv7tlQbwR4akDHWbrp2XL8qxe8qXw X-Gm-Gg: ASbGncspHcYXyIaqDx0bTB/k2RPrHzkedBh9s/SHA6v7mYK7GVFlIKS5r/Ps4dWr/lV 83N+8og8KrkMqLQ251j38h0orY/qeIJb/21U6OO+0YwTTeFCrAXgUSCFWhfFQUZI3Nucxp6ztZV qbCR2QatuRiHFHDrgarMieRZN8XmJ8iWjcFpKeb4ADhftVhSPdiM2wisg0IVaEwmHXw4bBhZYlm EwXfMmIEhEmnToTP4KySK7SkDXoFRUpT98SECQ5uwz0b3Lt3Tsl0TTQAbw35S+ffaw3GI29mFNt G596p1VFj2YoLkPxLFckyd8H5Y5McQiHaYY6C53SJnAX2dQ= X-Received: by 2002:a05:600c:37c7:b0:43c:efed:733e with SMTP id 5b1f17b1804b1-442d6d379b2mr155020145e9.14.1747127901732; Tue, 13 May 2025 02:18:21 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHEEtHWgn5s898vXVMD6AEOwzulPPtHZtUMHxI74NvDZ3sPtiUYejsU22j+vwltmbRtQ8fYMg== X-Received: by 2002:a05:600c:37c7:b0:43c:efed:733e with SMTP id 5b1f17b1804b1-442d6d379b2mr155019705e9.14.1747127901297; Tue, 13 May 2025 02:18:21 -0700 (PDT) Received: from [127.0.0.2] (109-92-26-237.static.isp.telekom.rs. [109.92.26.237]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-442ed666dc7sm12345655e9.18.2025.05.13.02.18.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 May 2025 02:18:20 -0700 (PDT) From: Andrey Albershteyn X-Google-Original-From: Andrey Albershteyn Date: Tue, 13 May 2025 11:17:57 +0200 Subject: [PATCH v5 4/7] fs: split fileattr/fsxattr converters into helpers 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: <20250513-xattrat-syscall-v5-4-22bb9c6c767f@kernel.org> References: <20250513-xattrat-syscall-v5-0-22bb9c6c767f@kernel.org> In-Reply-To: <20250513-xattrat-syscall-v5-0-22bb9c6c767f@kernel.org> To: Richard Henderson , Matt Turner , Russell King , Catalin Marinas , Will Deacon , Geert Uytterhoeven , Michal Simek , Thomas Bogendoerfer , "James E.J. Bottomley" , Helge Deller , Madhavan Srinivasan , Michael Ellerman , Nicholas Piggin , Christophe Leroy , Naveen N Rao , Heiko Carstens , Vasily Gorbik , Alexander Gordeev , Christian Borntraeger , Sven Schnelle , Yoshinori Sato , Rich Felker , John Paul Adrian Glaubitz , "David S. Miller" , Andreas Larsson , Andy Lutomirski , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Chris Zankel , Max Filippov , Alexander Viro , Christian Brauner , Jan Kara , =?utf-8?q?Micka=C3=ABl_Sala=C3=BCn?= , =?utf-8?q?G=C3=BCnther_Noack?= , Arnd Bergmann , =?utf-8?q?Pali_Roh=C3=A1r?= , Paul Moore , James Morris , "Serge E. Hallyn" , Stephen Smalley , Ondrej Mosnacek , Tyler Hicks , Miklos Szeredi , Amir Goldstein Cc: linux-alpha@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-m68k@lists.linux-m68k.org, linux-mips@vger.kernel.org, linux-parisc@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-s390@vger.kernel.org, linux-sh@vger.kernel.org, sparclinux@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-security-module@vger.kernel.org, linux-api@vger.kernel.org, linux-arch@vger.kernel.org, selinux@vger.kernel.org, ecryptfs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-xfs@vger.kernel.org, Andrey Albershteyn X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3154; i=aalbersh@kernel.org; h=from:subject:message-id; bh=7/qlLocSDGOnq9HanUewnfKPkCH1bdYdAp9tNZm+5GE=; b=owJ4nJvAy8zAJea2/JXEGuOHHIyn1ZIYMpT5vBmqeS9Of1kvckyD89yLKSHZd6cITHwR8ON6Q Krbn8kRqyw6SlkYxLgYZMUUWdZJa01NKpLKP2JQIw8zh5UJbAgXpwBMZHojI8Npu1fs2yWveYpu X75O9+PGOXL/F3U+vN7XHFJf5fdw0aozDH/lf/x993b3NibzczpnPr7ddd+5/McRwUl+3zqveq7 g+LeWDwBTZEzV X-Developer-Key: i=aalbersh@kernel.org; a=openpgp; fpr=AE1B2A9562721A6FC4307C1F46A7EA18AC33E108 This will be helpful for file_get/setattr syscalls to convert between fileattr and fsxattr. Signed-off-by: Andrey Albershteyn Reviewed-by: Jan Kara --- fs/file_attr.c | 32 +++++++++++++++++++++----------- include/linux/fileattr.h | 2 ++ 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/fs/file_attr.c b/fs/file_attr.c index be62d97cc444a445deac1c8ac8331f4a3766126a..d9eab553dc250f84075ac74c1c7= d8d6fd6588374 100644 --- a/fs/file_attr.c +++ b/fs/file_attr.c @@ -89,6 +89,16 @@ int vfs_fileattr_get(struct dentry *dentry, struct filea= ttr *fa) } EXPORT_SYMBOL(vfs_fileattr_get); =20 +void fileattr_to_fsxattr(const struct fileattr *fa, struct fsxattr *fsx) +{ + memset(fsx, 0, sizeof(struct fsxattr)); + fsx->fsx_xflags =3D fa->fsx_xflags; + 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 @@ -100,12 +110,7 @@ int copy_fsxattr_to_user(const struct fileattr *fa, st= ruct fsxattr __user *ufa) { struct fsxattr xfa; =20 - 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; + fileattr_to_fsxattr(fa, &xfa); =20 if (copy_to_user(ufa, &xfa, sizeof(xfa))) return -EFAULT; @@ -114,6 +119,15 @@ int copy_fsxattr_to_user(const struct fileattr *fa, st= ruct fsxattr __user *ufa) } EXPORT_SYMBOL(copy_fsxattr_to_user); =20 +void fsxattr_to_fileattr(const struct fsxattr *fsx, struct fileattr *fa) +{ + fileattr_fill_xflags(fa, fsx->fsx_xflags); + fa->fsx_extsize =3D fsx->fsx_extsize; + fa->fsx_nextents =3D fsx->fsx_nextents; + fa->fsx_projid =3D fsx->fsx_projid; + fa->fsx_cowextsize =3D fsx->fsx_cowextsize; +} + static int copy_fsxattr_from_user(struct fileattr *fa, struct fsxattr __user *ufa) { @@ -122,11 +136,7 @@ static int copy_fsxattr_from_user(struct fileattr *fa, if (copy_from_user(&xfa, ufa, sizeof(xfa))) return -EFAULT; =20 - 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; + fsxattr_to_fileattr(&xfa, fa); =20 return 0; } diff --git a/include/linux/fileattr.h b/include/linux/fileattr.h index 6030d0bf7ad32693a0f48a6f28475d97e768bb3e..433efa0f47844ef063373eb3906= 72812682b6388 100644 --- a/include/linux/fileattr.h +++ b/include/linux/fileattr.h @@ -33,7 +33,9 @@ struct fileattr { bool fsx_valid:1; }; =20 +void fileattr_to_fsxattr(const struct fileattr *fa, struct fsxattr *fsx); int copy_fsxattr_to_user(const struct fileattr *fa, struct fsxattr __user = *ufa); +void fsxattr_to_fileattr(const struct fsxattr *fsx, struct fileattr *fa); =20 void fileattr_fill_xflags(struct fileattr *fa, u32 xflags); void fileattr_fill_flags(struct fileattr *fa, u32 flags); --=20 2.47.2 From nobody Sat Feb 7 19:45:33 2026 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 B978E21D3E4 for ; Tue, 13 May 2025 09:18:30 +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=1747127915; cv=none; b=rLuN89pZGa2XXfcW8vkx9d5NxRrgvunI9pDrnwl1MjpvavrTKgdYLn+8mPprQTFOwSoN/Cg7p3WrIwvaOJ31iCAqXQI+xTJRnHvvXNMDPMyfkeLiwhhl8FCvYXZblL8uqFMHjF8nj/mWDuB/zs5aMs5fpTN8KXetHxKhrjVRWUQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747127915; c=relaxed/simple; bh=6GRgC9l31t4YtW1WpN15HEtI//c4dan1yl5qtYWAaXk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jHK+iCEoC5Pr9jpqNA6ji7spgtTKyMWSo7vJ130ERaLJR8ciOdYkKFeOXNsac+i+rz8HDewFhDzPzf+p1iNXcouHCQpIiclcFhKctVGmzquXT3AMwf8GiQ66VuEVmaOTibJ6Up+hDVS+Q2gfKsqaVD51buCGeyAOSEuda9NgOj0= 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=JWUtKsiy; 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="JWUtKsiy" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1747127907; 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=NOc7n03QtvhEu44iPpxkG92PTjRYJg6Nm8X16D2kY0E=; b=JWUtKsiyOCSkp9b7jELLmcblSS9joc79PNpGDMYcXiJspk8K6DlRHwzemymbyyhUouMEBl PR9iTTj4h3XwyWSxkzc/67IXu1/IyPv0K3+cUypYnES0BlmtGmwO3nkdQzDcSvlNj2JmDb wbVXSLymH5ZdBYX3TLU9OMmqCj4kT+Q= 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-596-8COjkvBfNHy1ZIuGA9dptw-1; Tue, 13 May 2025 05:18:26 -0400 X-MC-Unique: 8COjkvBfNHy1ZIuGA9dptw-1 X-Mimecast-MFC-AGG-ID: 8COjkvBfNHy1ZIuGA9dptw_1747127905 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-441c96c1977so35387155e9.0 for ; Tue, 13 May 2025 02:18:26 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747127905; x=1747732705; 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=NOc7n03QtvhEu44iPpxkG92PTjRYJg6Nm8X16D2kY0E=; b=qt2R4wZ+HdPYMJpVmr1n026iEQv5F0Xs2JQjK9X3EnNj346tVr4cYTWy5rtekZbwbj xhakzWuDmciqB47BRIL6MLT6Jf8kf0+HdtIIVNoh0iV2uMfqAQQaWcJMQN6CwA8kfgPE xbAw6ZlqEOBqLZqJmc7F8uN1xdJWsVDna05F/ExOlfBF6VEvlvzIEXU7H0X0aaA6iLoa /znCiITB40cxyBGR/sCYYuckJj+gDg5NTUXZmKN9ywH6AxVHbkV2y8dyxyoB4BVYzt2w +bfXhGquLyIeg6TKQdc4MyZAPxQ+XHJWwlAO6LHmyAChDSW6QI+0VHZ6HQeFbd7EEcCQ R9vw== X-Forwarded-Encrypted: i=1; AJvYcCU+ceLZMidrBxwYg0Xo3P6HoGUDxO2+F5Np1Tljijp8XpO73ZMB2LsRSU94WXcs3QUhAOivk4Myw/lv95o=@vger.kernel.org X-Gm-Message-State: AOJu0YxT+TmDZc0SeHh9NL8llUzfZ19PHYi4RJuUYHHPoMFhkb8TFmiY v3C/dTiLCQ3oNuA5OUUDhueLSjgBlg3UZOlbANT27EZODiaBFgfBwgKj8bXtJ6RQzKj3FpM0YKJ tl2P1IuBdxwh+LgI9troPfOy+OG117SHMx5DCccdeLv3ArkomOuygQKovaxYA X-Gm-Gg: ASbGncuOSRIjjWNWVAdaOV9l6LBq8LWrh+wCPdBuwBe/OaCrZ6rnNgzcto4sV0t4ZJH xoiQ05S0ZZ1JAOeWiX1J03ARggnCvA1Nnc62P6xIg3/mTDtt8ckIv0okqTRtSYWasha0QkS5pld Rj7p2eF1Gbzodq9UGVTLuRhkusj1f8arbduio7hX3SFZ0V1m/+9nz9QD2NSkbjeb4UakiMTwEKy bRIFxkqZzK9gfXcychj2cINSf6CdeobEVzLbf7DfbpiWx3cIErlsgLEsiZlihDdcSIyIEdWBhDS CAMlTitWoeTuBRlr6deaznMq/liMvLV95jFWxho5uDaBNg8= X-Received: by 2002:a05:600c:4454:b0:440:6a5f:c308 with SMTP id 5b1f17b1804b1-442d6d44bd0mr165938875e9.13.1747127904747; Tue, 13 May 2025 02:18:24 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHqiuvTxW0gPiYb5Yeg/YAPZpfvdIILgd83canCiQJJ8hwGNTheApWOvMPsjwENNn935UE4Tg== X-Received: by 2002:a05:600c:4454:b0:440:6a5f:c308 with SMTP id 5b1f17b1804b1-442d6d44bd0mr165938225e9.13.1747127904260; Tue, 13 May 2025 02:18:24 -0700 (PDT) Received: from [127.0.0.2] (109-92-26-237.static.isp.telekom.rs. [109.92.26.237]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-442ed666dc7sm12345655e9.18.2025.05.13.02.18.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 May 2025 02:18:23 -0700 (PDT) From: Andrey Albershteyn X-Google-Original-From: Andrey Albershteyn Date: Tue, 13 May 2025 11:17:58 +0200 Subject: [PATCH v5 5/7] 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: <20250513-xattrat-syscall-v5-5-22bb9c6c767f@kernel.org> References: <20250513-xattrat-syscall-v5-0-22bb9c6c767f@kernel.org> In-Reply-To: <20250513-xattrat-syscall-v5-0-22bb9c6c767f@kernel.org> To: Richard Henderson , Matt Turner , Russell King , Catalin Marinas , Will Deacon , Geert Uytterhoeven , Michal Simek , Thomas Bogendoerfer , "James E.J. Bottomley" , Helge Deller , Madhavan Srinivasan , Michael Ellerman , Nicholas Piggin , Christophe Leroy , Naveen N Rao , Heiko Carstens , Vasily Gorbik , Alexander Gordeev , Christian Borntraeger , Sven Schnelle , Yoshinori Sato , Rich Felker , John Paul Adrian Glaubitz , "David S. Miller" , Andreas Larsson , Andy Lutomirski , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Chris Zankel , Max Filippov , Alexander Viro , Christian Brauner , Jan Kara , =?utf-8?q?Micka=C3=ABl_Sala=C3=BCn?= , =?utf-8?q?G=C3=BCnther_Noack?= , Arnd Bergmann , =?utf-8?q?Pali_Roh=C3=A1r?= , Paul Moore , James Morris , "Serge E. Hallyn" , Stephen Smalley , Ondrej Mosnacek , Tyler Hicks , Miklos Szeredi , Amir Goldstein Cc: linux-alpha@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-m68k@lists.linux-m68k.org, linux-mips@vger.kernel.org, linux-parisc@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-s390@vger.kernel.org, linux-sh@vger.kernel.org, sparclinux@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-security-module@vger.kernel.org, linux-api@vger.kernel.org, linux-arch@vger.kernel.org, selinux@vger.kernel.org, ecryptfs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-xfs@vger.kernel.org, Andrey Albershteyn X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3525; i=aalbersh@kernel.org; h=from:subject:message-id; bh=6GRgC9l31t4YtW1WpN15HEtI//c4dan1yl5qtYWAaXk=; b=owJ4nJvAy8zAJea2/JXEGuOHHIyn1ZIYMpT5vHeeSvx1XJ17VoznhbT1nNa68Vxah3ftytP4y xmmWH2hyqOjlIVBjItBVkyRZZ201tSkIqn8IwY18jBzWJlAhjBwcQrARCziGBkWnup90+qj/jDX J/7rpgO7jA7djNJlqpoYIWnU9Pi2iqsMwz9DVwXDCxlLHq56tKRp98R9l+e5LHztcHHptMMCT7x vsnLxAQC/ekWI 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 coverts 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 --- 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 51a5c54eb74026d8b2deec6e0608f3d2b3e9c092..6bf08ff4d7f71c5223b90f4cde5= 7e380b68260fd 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c @@ -1124,7 +1124,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 d9eab553dc250f84075ac74c1c7d8d6fd6588374..d696f440fa4ffcba8985cc4bfe2= 2a1c0e612ac7c 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) @@ -239,7 +239,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; @@ -281,6 +281,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; @@ -302,6 +304,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; @@ -314,6 +318,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 @@ -334,6 +340,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 6f0e15f86c21fc576fe1679e977597bd9f817e36..096d44712bb1130fd3e9673a617= 47b0fbf877d25 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 Sat Feb 7 19:45:33 2026 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 18D69213E61 for ; Tue, 13 May 2025 09:18:32 +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=1747127917; cv=none; b=EMZ3RWgALHhXpidLgkdoTWVjIXr2fRGoTQ6Vk03wGeLILAbi8/vtmUv5anlxAH/YZwp8aI1m2M13VyTmkNQhi+CRehbg/sFHzycgbnAZvDsVj62UHbzZOlo/M+mpG/q75Si4Hk8h8rdzYxXCmUHTlnMiUgkD8uCAyLHryCDz038= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747127917; c=relaxed/simple; bh=YJHrfLnlg7eZFp+zMmd8Wb9VJWvyb8UUtIhLAWunkgQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=SBE4zHsYz1pdD1HqJ9K4yvEKhBbuCGc2Lzte+TGgNqj8EpNXtk/SSCASfNRZ+Z5YIWo+QJ4PSyTr1bx+3D2HI7DCizshgRS0ZRe1hStUglJbAuIUve4fXN7PXx2vo948CuDWvAzRnQoMwRA3hhLzH3/sYGBQDLG6ty41EcCwkxg= 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=IBNmZTYP; 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="IBNmZTYP" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1747127910; 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=DTNboLswrf9jYl7R2fhkHc5Mf/EfkCXeYw0mqBAK6/s=; b=IBNmZTYPvhGTURipNTiBuSgT5xvo+/OCz0c5wIztc6G6KJU21BGbbntEkd9TwssAXhGABA CQ1MY8TPrmym+5tVplbHgUpjR23PvJ3EZPcKBFjzlElgZlQr+FnbdXpMiUZBZhG+GudqSp 7/7HQZdnEzb+bD9GRxIpaAEG+euK5mg= 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-189-v-3SW__bMxeiQTw33pSNFA-1; Tue, 13 May 2025 05:18:29 -0400 X-MC-Unique: v-3SW__bMxeiQTw33pSNFA-1 X-Mimecast-MFC-AGG-ID: v-3SW__bMxeiQTw33pSNFA_1747127908 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-441c122fa56so21317155e9.2 for ; Tue, 13 May 2025 02:18:28 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747127908; x=1747732708; 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=DTNboLswrf9jYl7R2fhkHc5Mf/EfkCXeYw0mqBAK6/s=; b=cNk4dOZUZly0YfwT0orQWUGEVmyah6DO6VDn3Gn8qWVm4pwOeEqcL4VjMHnEGn6f0b GRV0Hc1Ua3KSOuuPXRF99gbGSxqXAjSkib61OiOooaEjMOxwQszaukcW2uL9R1ier2X/ 9rcpVr6xhk29hyd4mK8t74e/jI+cDSu4EBNfP5nHkItydFLUJk8WHgnLewUWy0xSY7Lc Vnmat4FQmDpZZ3xdxf/DRVX5D4gc6Hn+Zu64egxz2/VuetfgRrd0n9tSA9qQnV0DrxgA gcbm7jNEx5O26PwwFQDXxPn/OX2byn+3FTkywdo5WQnkJGazlF/fY0T8sOl6x2ZC/jxz B/bQ== X-Forwarded-Encrypted: i=1; AJvYcCXhB9JuvPmMm0aGlvD4YvHbAGFIxEDUI0E3TFrV0fzJfBx6t3gcrKCUsB/7vES5BvH6vwoUnnL8eRTMe9w=@vger.kernel.org X-Gm-Message-State: AOJu0YzUP+MwIsQGF7yd58EEWu3+d7bU5FS3xqEtacVC79us46uspCc2 ikkF/IRPhF4+EUZFYnC7rMjRqA+EuwkMRoZFd8agYrRdB6qfWiAaviBqqLo/aDGzCjK1LaiW86J r34X3pPr+EijlCF2vro+87kwV57bWqGNKYorye5H/8xykQFbhiOeVqlAEfdXN X-Gm-Gg: ASbGncv/l6ropnK9gyozJFvqSCLF9yhcIkf5KzyFTUThY2SiCAW0/ZrAzw5f9T3cQZA Te2Q5DspXt9jT1X1zOrg4VYoNYOfvoEg685L7N2WQ4WOnVWuvDh2FaoP50AMYZZOFROWX8ER1Rn aq9AhFDNNvqXW1xUmLkNNbdIvsBseuz/mBzZrnMWIs0rVIYNEzRVTHhoaeRwW7m7CRE5uMbuf/L /S9VCjKIP1r8PVIMA0nMjAqQLWNyDvUEMFgG9ibcLJCXNKtanwpppV/giDja9fPOU2H/z6/wnsR rFoGhxiig5iSEFr1HJSv/ahtQtsE7CcgHxe5Do/ZBg28Unw= X-Received: by 2002:a05:600c:a44:b0:43c:ec4c:25b1 with SMTP id 5b1f17b1804b1-442d6dc5328mr122856945e9.23.1747127907857; Tue, 13 May 2025 02:18:27 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFSD3cBiAoSeE7mQdYxANptZgCWG/QkVumgW8cBneSabqw55k5N+mANgM6mplP1ZmV2IXy+GQ== X-Received: by 2002:a05:600c:a44:b0:43c:ec4c:25b1 with SMTP id 5b1f17b1804b1-442d6dc5328mr122856725e9.23.1747127907396; Tue, 13 May 2025 02:18:27 -0700 (PDT) Received: from [127.0.0.2] (109-92-26-237.static.isp.telekom.rs. [109.92.26.237]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-442ed666dc7sm12345655e9.18.2025.05.13.02.18.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 May 2025 02:18:26 -0700 (PDT) From: Andrey Albershteyn X-Google-Original-From: Andrey Albershteyn Date: Tue, 13 May 2025 11:17:59 +0200 Subject: [PATCH v5 6/7] 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: <20250513-xattrat-syscall-v5-6-22bb9c6c767f@kernel.org> References: <20250513-xattrat-syscall-v5-0-22bb9c6c767f@kernel.org> In-Reply-To: <20250513-xattrat-syscall-v5-0-22bb9c6c767f@kernel.org> To: Richard Henderson , Matt Turner , Russell King , Catalin Marinas , Will Deacon , Geert Uytterhoeven , Michal Simek , Thomas Bogendoerfer , "James E.J. Bottomley" , Helge Deller , Madhavan Srinivasan , Michael Ellerman , Nicholas Piggin , Christophe Leroy , Naveen N Rao , Heiko Carstens , Vasily Gorbik , Alexander Gordeev , Christian Borntraeger , Sven Schnelle , Yoshinori Sato , Rich Felker , John Paul Adrian Glaubitz , "David S. Miller" , Andreas Larsson , Andy Lutomirski , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Chris Zankel , Max Filippov , Alexander Viro , Christian Brauner , Jan Kara , =?utf-8?q?Micka=C3=ABl_Sala=C3=BCn?= , =?utf-8?q?G=C3=BCnther_Noack?= , Arnd Bergmann , =?utf-8?q?Pali_Roh=C3=A1r?= , Paul Moore , James Morris , "Serge E. Hallyn" , Stephen Smalley , Ondrej Mosnacek , Tyler Hicks , Miklos Szeredi , Amir Goldstein Cc: linux-alpha@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-m68k@lists.linux-m68k.org, linux-mips@vger.kernel.org, linux-parisc@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-s390@vger.kernel.org, linux-sh@vger.kernel.org, sparclinux@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-security-module@vger.kernel.org, linux-api@vger.kernel.org, linux-arch@vger.kernel.org, selinux@vger.kernel.org, ecryptfs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-xfs@vger.kernel.org, Andrey Albershteyn X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4058; i=aalbersh@kernel.org; h=from:subject:message-id; bh=9XBaUh9nVlDr1zwSfKo8V8Sk8eQqpQogexfwmlm0gVw=; b=owJ4nJvAy8zAJea2/JXEGuOHHIyn1ZIYMpT5vPOZks/wtDRVZEmxBIYe5ev8+dRYqU9jmV3pq 7kMIixTrTpKWRjEuBhkxRRZ1klrTU0qkso/YlAjDzOHlQlkCAMXpwBMpFiC4X9p7J15fxbat9he mdT3SbJAs8nY5O8mm3bJBqPW/P+fSrMZGRa/jE7lPNT/+IYD18HcdxonZRZ9fZhVKzp94enez8E cOSwA2gRECg== 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 --- fs/file_attr.c | 19 +++++++++++++------ include/linux/fileattr.h | 22 +++++++++++++++++++++- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/fs/file_attr.c b/fs/file_attr.c index d696f440fa4ffcba8985cc4bfe22a1c0e612ac7c..6cd1e820f7b108c12c06654df84= 3104f460b94cf 100644 --- a/fs/file_attr.c +++ b/fs/file_attr.c @@ -91,8 +91,10 @@ EXPORT_SYMBOL(vfs_fileattr_get); =20 void fileattr_to_fsxattr(const struct fileattr *fa, struct fsxattr *fsx) { + __u32 mask =3D FS_XFLAGS_MASK; + memset(fsx, 0, sizeof(struct fsxattr)); - fsx->fsx_xflags =3D fa->fsx_xflags; + 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; @@ -119,13 +121,20 @@ int copy_fsxattr_to_user(const struct fileattr *fa, s= truct fsxattr __user *ufa) } EXPORT_SYMBOL(copy_fsxattr_to_user); =20 -void fsxattr_to_fileattr(const struct fsxattr *fsx, struct fileattr *fa) +int fsxattr_to_fileattr(const struct fsxattr *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_nextents =3D fsx->fsx_nextents; fa->fsx_projid =3D fsx->fsx_projid; fa->fsx_cowextsize =3D fsx->fsx_cowextsize; + + return 0; } =20 static int copy_fsxattr_from_user(struct fileattr *fa, @@ -136,9 +145,7 @@ static int copy_fsxattr_from_user(struct fileattr *fa, if (copy_from_user(&xfa, ufa, sizeof(xfa))) return -EFAULT; =20 - fsxattr_to_fileattr(&xfa, fa); - - return 0; + return fsxattr_to_fileattr(&xfa, fa); } =20 /* diff --git a/include/linux/fileattr.h b/include/linux/fileattr.h index 433efa0f47844ef063373eb390672812682b6388..f62a5143eb2dccd5ceedfe72439= cc4cab823cb1d 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 @@ -35,7 +55,7 @@ struct fileattr { =20 void fileattr_to_fsxattr(const struct fileattr *fa, struct fsxattr *fsx); int copy_fsxattr_to_user(const struct fileattr *fa, struct fsxattr __user = *ufa); -void fsxattr_to_fileattr(const struct fsxattr *fsx, struct fileattr *fa); +int fsxattr_to_fileattr(const struct fsxattr *fsx, struct fileattr *fa); =20 void fileattr_fill_xflags(struct fileattr *fa, u32 xflags); void fileattr_fill_flags(struct fileattr *fa, u32 flags); --=20 2.47.2 From nobody Sat Feb 7 19:45:33 2026 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 5A94D221296 for ; Tue, 13 May 2025 09:18: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=1747127922; cv=none; b=nWiaHkVXip+N/IBdcIHmqH/Ey998pMxJOSpCKsv7TMw8raLFs+f79TExWHOeShYSO4lvmZQSyeZAsjsDrDXLTBYZ4W/s6ja0zpmkoogqG9knrzbrfTJb15yMXuJ0VcHNROQhGZ61qryduD22qKH5GWHtbbjbVA/40D91aB8f+gY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747127922; c=relaxed/simple; bh=Mia1bN9eufb3RXyVeuoVbbxF0ymp/knX5VaozIUqEjY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=p2mKU32i6XYB8lLwBrPcLaOnVRf9rgVVUQcTWBW65i2RFHef3hoBpt+Tyr/4MIO2QCcdigncOvxmN0jcKhkktWW43J/4uYwTmsA2RwZDq6SjMtvaORuk5Gpn6GPzKh7QA1ht+YGgB7dJF281pwAZRN10Xp4i6PVXanGEMsrjpJg= 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=E/cnXmda; 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="E/cnXmda" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1747127913; 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=Bcl+kZS6mFiE1wsAKkd2DJwYRwWXFkHCZUkRMeOzSpo=; b=E/cnXmdaYmXYORSDrU70JErzLk0inFQiI+W4CIw2xtLYVvkVE4pE/VTVBt7c+nEjKemHzJ vr8QahlBreserKx+EAwqNVzzgXYsOg73wiXd7fhexsery0sOmnZ3of0MYs8neAyMp8szJo cxNrFlyQ9SDQoW/FKukZpFkdU0ALzXc= Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-249-r5VlvcouOKSKM9mOmLUn4w-1; Tue, 13 May 2025 05:18:32 -0400 X-MC-Unique: r5VlvcouOKSKM9mOmLUn4w-1 X-Mimecast-MFC-AGG-ID: r5VlvcouOKSKM9mOmLUn4w_1747127911 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-43f251dc364so33201555e9.2 for ; Tue, 13 May 2025 02:18:32 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747127911; x=1747732711; 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=Bcl+kZS6mFiE1wsAKkd2DJwYRwWXFkHCZUkRMeOzSpo=; b=e5z7ct8i9uq1Z1dFJtsTSuSWnZTeOUKFD8R2Bm2T+3w5mMYP3XwJ/p6aFn5s9R3wkW b4ij+BK06fU+b3MVZDw5c28nOzojR3SwcDn2xhRsuptSAsKxu3840dZhlDQFNJo9SViL JFmcnKfYdks/3QZZKgTXaljEci2lyMtSNBakYJexD6+Xh9MO05vRCIMTfZe3k8+/3G1i 9eKYMSV1vHtgiP4Yt+MDTlurHVPWTE8OE06nqauREOBOJw4BlDOiYmUVwoFyFRCLhQrw 354+3+ULjJpkN1BtWgB13ub3sDqtqTHPLag2LKhL6K/b/EkKPoagxRyZ7DaVvTzF6LTl sw0Q== X-Forwarded-Encrypted: i=1; AJvYcCVBpcmhrswGuKSlMjL0/kLPKKSWA08INyDwBrqTbpL9z7gC6sI1O6XoBClBO0KoIkD0pOLL1DxUqAnv72w=@vger.kernel.org X-Gm-Message-State: AOJu0Yzx1b5iljnc0c92Joom9IncLCJujrwGXmeYxrZfsPNE9M9YcaoE y2bSqz7+RLeoAjaV/DaJYEncFLv7HiQYvT/UEVyTuMw2+8V69V4x9DSm1uFeTJ7xM42Co9weOo0 PAwQqvDfcKl5s18djTJLeFdp8l2SxJjciMRW1wmOxb79mIX6NWGv/2U93Fd4a X-Gm-Gg: ASbGncsPQrZFXJzHLz77/FDupJQ7foupJ/6bHkw/AisU5sUsdOH1I4I3AER8ADbdNY7 0z23X0fqkeBKJXxqSyjFsdSpw0mH1w5H3kziJY19PnaG1e5D+eVYO5jkle9ARkhnUIMq9UDjf8P s0IfUkPRsFXGRfOQaEOv3YoL5wSElD8irLR6iNa7isXUF1HCJ/V/tnk79437mqx86VzGJ6o5ouh sbffUHA6Bb5GS0Ch4jP06lurSusrC/2Wd0C88BGbY8bScn2+1b0c5S7o7R3+hgXcXy/pTUuZkpa UzQ9sQUq8CFQh6zk318mfHRFaiHfsf3pY2CbIKzlA+TTnsk= X-Received: by 2002:a05:600c:6487:b0:43c:e70d:44f0 with SMTP id 5b1f17b1804b1-442d6d516efmr151085915e9.19.1747127910853; Tue, 13 May 2025 02:18:30 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFnyzrm9Ien0HpYmMjVN4TJc2CwxGJx7XTbAEX+5KbU06PX2NgfS3fPS2A63BWK6Dk9wq8Y/w== X-Received: by 2002:a05:600c:6487:b0:43c:e70d:44f0 with SMTP id 5b1f17b1804b1-442d6d516efmr151084915e9.19.1747127910301; Tue, 13 May 2025 02:18:30 -0700 (PDT) Received: from [127.0.0.2] (109-92-26-237.static.isp.telekom.rs. [109.92.26.237]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-442ed666dc7sm12345655e9.18.2025.05.13.02.18.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 May 2025 02:18:29 -0700 (PDT) From: Andrey Albershteyn X-Google-Original-From: Andrey Albershteyn Date: Tue, 13 May 2025 11:18:00 +0200 Subject: [PATCH v5 7/7] 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: <20250513-xattrat-syscall-v5-7-22bb9c6c767f@kernel.org> References: <20250513-xattrat-syscall-v5-0-22bb9c6c767f@kernel.org> In-Reply-To: <20250513-xattrat-syscall-v5-0-22bb9c6c767f@kernel.org> To: Richard Henderson , Matt Turner , Russell King , Catalin Marinas , Will Deacon , Geert Uytterhoeven , Michal Simek , Thomas Bogendoerfer , "James E.J. Bottomley" , Helge Deller , Madhavan Srinivasan , Michael Ellerman , Nicholas Piggin , Christophe Leroy , Naveen N Rao , Heiko Carstens , Vasily Gorbik , Alexander Gordeev , Christian Borntraeger , Sven Schnelle , Yoshinori Sato , Rich Felker , John Paul Adrian Glaubitz , "David S. Miller" , Andreas Larsson , Andy Lutomirski , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Chris Zankel , Max Filippov , Alexander Viro , Christian Brauner , Jan Kara , =?utf-8?q?Micka=C3=ABl_Sala=C3=BCn?= , =?utf-8?q?G=C3=BCnther_Noack?= , Arnd Bergmann , =?utf-8?q?Pali_Roh=C3=A1r?= , Paul Moore , James Morris , "Serge E. Hallyn" , Stephen Smalley , Ondrej Mosnacek , Tyler Hicks , Miklos Szeredi , Amir Goldstein Cc: linux-alpha@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-m68k@lists.linux-m68k.org, linux-mips@vger.kernel.org, linux-parisc@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-s390@vger.kernel.org, linux-sh@vger.kernel.org, sparclinux@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-security-module@vger.kernel.org, linux-api@vger.kernel.org, linux-arch@vger.kernel.org, selinux@vger.kernel.org, ecryptfs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-xfs@vger.kernel.org, Andrey Albershteyn , Andrey Albershteyn X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=16327; i=aalbersh@kernel.org; h=from:subject:message-id; bh=awxLkgMEWWl9qWLy5HjROs2HQUw87mCuZEl/Dhy79+Y=; b=owJ4nJvAy8zAJea2/JXEGuOHHIyn1ZIYMpT5vLnjuIO1/mxvbtsnHrp2xV93xs7Hnw4+SJhxw SsmcnMRH1tHKQuDGBeDrJgiyzppralJRVL5Rwxq5GHmsDKBDGHg4hSAifByM/wPSBR5nGL49ov4 0/Ler/NcmcJsb5z6pbE+X5rPMmnDhW+TGf77p9fsy2/L8RVbeaLyyCeRnrdsSqWrvGaEbaw8s1b g+HdmAD4SRq0= 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/flags. The syscalls take parent directory fd and path to the child together with struct fsxattr. 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 --- 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 | 119 ++++++++++++++++++++++++= ++++ include/linux/syscalls.h | 6 ++ include/uapi/asm-generic/unistd.h | 8 +- include/uapi/linux/fs.h | 3 + 20 files changed, 167 insertions(+), 1 deletion(-) diff --git a/arch/alpha/kernel/syscalls/syscall.tbl b/arch/alpha/kernel/sys= calls/syscall.tbl index 2dd6340de6b4efddc406f0c235701c15cf02f650..16dca28ebf17e5df2230f640f36= 86835dc5a1f76 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 27c1d5ebcd91c8c296dc6676307f66bfdf4ab78d..b07e699aaa3c2840452109c0004= 529fc68e153ac 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 0765b3a8d6d600d7b9f83182d401d9f80c03476c..8d9088bc577df0c6dba6d5d0c22= 7585283789a3f 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 9fe47112c586f152662af38a9a7f90957cb96cf8..f41d38dfbf1382339316f4e3e6e= 79c75dc2804ec 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 7b6e97828e552d4da90046ddfcd4a55723e522bb..580af574fe733af29ea69f40ae6= e902ad2166ab2 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 aa70e371bb54ab5d9c8dd8923b6ecf9693ee914d..d824ffe9a01496a13194710d527= 8dcc443e40894 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 1e8c44c7b61492eabf00c777831e457a7a6e579c..7a7049c2c307885fe8be33aedb5= 03cfe8afbfb24 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 114a5a1a62302e32dd74d1679ff423a2d57c3c6b..d330274f06010c9f9bf80d55898= d0bd38994ef58 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 94df3cb957e9d547d192e8732c0cf23ef2b5ce5d..88a788a7b18d17967019098b33d= 2be48a430aed3 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 9a084bdb892694bc562f514b55212d167cbac12f..b453e80dfc003796a08f022f6bd= 44cf76a5f82ab 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 a4569b96ef06c54ce7aa795d039541c90a38284f..8a6744d658db3986f0ac0fd3c90= 592cdbd27249c 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 52a7652fcff6394b96ace1f3b0ed72250ee5e669..5e9c9eff5539e24113bb757f1e5= b51bd7c32864e 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 83e45eb6c095a36baaf749927628e6052fe900e6..ebb7d06d1044fa9b113b0a3fe03= 16c77f48fc3d0 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 ac007ea00979dc28b0ef7c002a0615ce86dd3101..4877e16da69a50f2225088e5566= 61051dbe3c7a3 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 cfb5ca41e30de1a4e073750096f5b51a2ec137d2..92cf0fe2291eb99b536e4de4201= aec16b3472094 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 f657a77314f8667fa019a01e10c84ea270024adc..374e4cb788d8a6d4e1f3358b949= ea8b600013e1c 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 6cd1e820f7b108c12c06654df843104f460b94cf..791a97bb2b612b2a0f2c06b7cfb= 41bac469ea5d1 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 @@ -354,3 +358,118 @@ 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 fsxattr __user *, ufsx, size_t, usize, + unsigned int, at_flags) +{ + struct fileattr fa =3D {}; + struct path filepath __free(path_put) =3D {}; + int error; + unsigned int lookup_flags =3D 0; + struct filename *name; + struct fsxattr fsx =3D {}; + + BUILD_BUG_ON(sizeof(struct fsxattr) < FSXATTR_SIZE_VER0); + BUILD_BUG_ON(sizeof(struct fsxattr) !=3D FSXATTR_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 < FSXATTR_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); + putname(name); + if (error) + return error; + } + + error =3D vfs_fileattr_get(filepath.dentry, &fa); + if (error) + return error; + + fileattr_to_fsxattr(&fa, &fsx); + error =3D copy_struct_to_user(ufsx, usize, &fsx, sizeof(struct fsxattr), + NULL); + + return error; +} + +SYSCALL_DEFINE5(file_setattr, int, dfd, const char __user *, filename, + struct fsxattr __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; + struct fsxattr fsx =3D {}; + + BUILD_BUG_ON(sizeof(struct fsxattr) < FSXATTR_SIZE_VER0); + BUILD_BUG_ON(sizeof(struct fsxattr) !=3D FSXATTR_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 < FSXATTR_SIZE_VER0) + return -EINVAL; + + error =3D copy_struct_from_user(&fsx, sizeof(struct fsxattr), ufsx, usize= ); + if (error) + return error; + + error =3D fsxattr_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); + putname(name); + 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 e5603cc91963dabb79324d6e9e2274f327311245..f2a747479718f9c93f6a448cdab= 2e60f7ee87709 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 fsxattr __user *ufsx, size_t usize, + unsigned int at_flags); +asmlinkage long sys_file_setattr(int dfd, const char __user *filename, + struct fsxattr __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 2892a45023af6d3eb941623d4fed04841ab07e02..04e0077fb4c97a4d565da86d3d0= d1d243f32336e 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 e762e1af650c4bf08766ba7a8ab7a2288e987039..bc1467b44b80e1db3527dd1b70f= 1a3a3ca7e4484 100644 --- a/include/uapi/linux/fs.h +++ b/include/uapi/linux/fs.h @@ -148,6 +148,9 @@ struct fsxattr { unsigned char fsx_pad[8]; }; =20 +#define FSXATTR_SIZE_VER0 28 +#define FSXATTR_SIZE_LATEST FSXATTR_SIZE_VER0 + /* * Flags for the fsx_xflags field */ --=20 2.47.2