From d1312979f155597cad51ad61f845e59114bba0f8 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Wed, 25 Mar 2026 07:36:48 +0100 Subject: [PATCH 1/5] hfs: update comments on hfs_inode_setattr The top of function comment about hfs_inode_setattr is severely out of date and reference a previous name for this function. Remove it, and update the comments in the file to record the still relevant bits directly. Signed-off-by: Christoph Hellwig Link: https://patch.msgid.link/20260325063711.3298685-2-hch@lst.de Reviewed-by: Viacheslav Dubeyko Reviewed-by: Jan Kara Signed-off-by: Christian Brauner --- fs/hfs/inode.c | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/fs/hfs/inode.c b/fs/hfs/inode.c index 878535db64d6..72948eb2fadc 100644 --- a/fs/hfs/inode.c +++ b/fs/hfs/inode.c @@ -622,23 +622,6 @@ static int hfs_file_release(struct inode *inode, struct file *file) return 0; } -/* - * hfs_notify_change() - * - * Based very closely on fs/msdos/inode.c by Werner Almesberger - * - * This is the notify_change() field in the super_operations structure - * for HFS file systems. The purpose is to take that changes made to - * an inode and apply then in a filesystem-dependent manner. In this - * case the process has a few of tasks to do: - * 1) prevent changes to the i_uid and i_gid fields. - * 2) map file permissions to the closest allowable permissions - * 3) Since multiple Linux files can share the same on-disk inode under - * HFS (for instance the data and resource forks of a file) a change - * to permissions must be applied to all other in-core inodes which - * correspond to the same HFS file. - */ - int hfs_inode_setattr(struct mnt_idmap *idmap, struct dentry *dentry, struct iattr *attr) { @@ -646,8 +629,7 @@ int hfs_inode_setattr(struct mnt_idmap *idmap, struct dentry *dentry, struct hfs_sb_info *hsb = HFS_SB(inode->i_sb); int error; - error = setattr_prepare(&nop_mnt_idmap, dentry, - attr); /* basic permission checks */ + error = setattr_prepare(&nop_mnt_idmap, dentry, attr); if (error) return error; @@ -663,6 +645,7 @@ int hfs_inode_setattr(struct mnt_idmap *idmap, struct dentry *dentry, return hsb->s_quiet ? 0 : error; } + /* map file permissions to the closest allowable permissions in HFS */ if (attr->ia_valid & ATTR_MODE) { /* Only the 'w' bits can ever change and only all together. */ if (attr->ia_mode & S_IWUSR) From 9c71de5f4ddc978782f7ceb60c8cfee4db64f286 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Wed, 25 Mar 2026 07:36:49 +0100 Subject: [PATCH 2/5] adfs: rename adfs_notify_change to adfs_setattr Make the function name match the method that it implements. Signed-off-by: Christoph Hellwig Link: https://patch.msgid.link/20260325063711.3298685-3-hch@lst.de Reviewed-by: Jan Kara Signed-off-by: Christian Brauner --- fs/adfs/adfs.h | 4 ++-- fs/adfs/dir.c | 2 +- fs/adfs/file.c | 2 +- fs/adfs/inode.c | 6 ++---- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/fs/adfs/adfs.h b/fs/adfs/adfs.h index 223f0283d20f..0d32b7cd99b4 100644 --- a/fs/adfs/adfs.h +++ b/fs/adfs/adfs.h @@ -144,8 +144,8 @@ struct adfs_discmap { /* Inode stuff */ struct inode *adfs_iget(struct super_block *sb, struct object_info *obj); int adfs_write_inode(struct inode *inode, struct writeback_control *wbc); -int adfs_notify_change(struct mnt_idmap *idmap, struct dentry *dentry, - struct iattr *attr); +int adfs_setattr(struct mnt_idmap *idmap, struct dentry *dentry, + struct iattr *attr); /* map.c */ int adfs_map_lookup(struct super_block *sb, u32 frag_id, unsigned int offset); diff --git a/fs/adfs/dir.c b/fs/adfs/dir.c index 4f9dc276da6f..e900ec9d0066 100644 --- a/fs/adfs/dir.c +++ b/fs/adfs/dir.c @@ -454,5 +454,5 @@ adfs_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags) */ const struct inode_operations adfs_dir_inode_operations = { .lookup = adfs_lookup, - .setattr = adfs_notify_change, + .setattr = adfs_setattr, }; diff --git a/fs/adfs/file.c b/fs/adfs/file.c index cd13165fd904..73486667d6b4 100644 --- a/fs/adfs/file.c +++ b/fs/adfs/file.c @@ -32,5 +32,5 @@ const struct file_operations adfs_file_operations = { }; const struct inode_operations adfs_file_inode_operations = { - .setattr = adfs_notify_change, + .setattr = adfs_setattr, }; diff --git a/fs/adfs/inode.c b/fs/adfs/inode.c index 6830f8bc8d4e..4ac442d0a8c0 100644 --- a/fs/adfs/inode.c +++ b/fs/adfs/inode.c @@ -299,8 +299,7 @@ out: * later. */ int -adfs_notify_change(struct mnt_idmap *idmap, struct dentry *dentry, - struct iattr *attr) +adfs_setattr(struct mnt_idmap *idmap, struct dentry *dentry, struct iattr *attr) { struct inode *inode = d_inode(dentry); struct super_block *sb = inode->i_sb; @@ -355,8 +354,7 @@ out: /* * write an existing inode back to the directory, and therefore the disk. - * The adfs-specific inode data has already been updated by - * adfs_notify_change() + * The adfs-specific inode data has already been updated by * adfs_setattr(). */ int adfs_write_inode(struct inode *inode, struct writeback_control *wbc) { From d0fdc1c0d0f6bb844fdf1c135d6b0f310e58d794 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Wed, 25 Mar 2026 07:36:50 +0100 Subject: [PATCH 3/5] affs: rename affs_notify_change to affs_setattr Make the function name match the method that it implements. Signed-off-by: Christoph Hellwig Link: https://patch.msgid.link/20260325063711.3298685-4-hch@lst.de Reviewed-by: Jan Kara Signed-off-by: Christian Brauner --- fs/affs/affs.h | 2 +- fs/affs/dir.c | 2 +- fs/affs/file.c | 2 +- fs/affs/inode.c | 5 ++--- fs/affs/symlink.c | 2 +- 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/fs/affs/affs.h b/fs/affs/affs.h index ac4e9a02910b..43e20b02b449 100644 --- a/fs/affs/affs.h +++ b/fs/affs/affs.h @@ -184,7 +184,7 @@ extern int affs_rename2(struct mnt_idmap *idmap, /* inode.c */ extern struct inode *affs_new_inode(struct inode *dir); -extern int affs_notify_change(struct mnt_idmap *idmap, +extern int affs_setattr(struct mnt_idmap *idmap, struct dentry *dentry, struct iattr *attr); extern void affs_evict_inode(struct inode *inode); extern struct inode *affs_iget(struct super_block *sb, diff --git a/fs/affs/dir.c b/fs/affs/dir.c index fe18caaf4d65..5f3d5d54085e 100644 --- a/fs/affs/dir.c +++ b/fs/affs/dir.c @@ -71,7 +71,7 @@ const struct inode_operations affs_dir_inode_operations = { .mkdir = affs_mkdir, .rmdir = affs_rmdir, .rename = affs_rename2, - .setattr = affs_notify_change, + .setattr = affs_setattr, }; static int diff --git a/fs/affs/file.c b/fs/affs/file.c index 6c9258359ddb..cede4bb1134e 100644 --- a/fs/affs/file.c +++ b/fs/affs/file.c @@ -1013,5 +1013,5 @@ const struct file_operations affs_file_operations = { }; const struct inode_operations affs_file_inode_operations = { - .setattr = affs_notify_change, + .setattr = affs_setattr, }; diff --git a/fs/affs/inode.c b/fs/affs/inode.c index 0bfc7d151dcd..f660e76584b3 100644 --- a/fs/affs/inode.c +++ b/fs/affs/inode.c @@ -213,13 +213,12 @@ affs_write_inode(struct inode *inode, struct writeback_control *wbc) } int -affs_notify_change(struct mnt_idmap *idmap, struct dentry *dentry, - struct iattr *attr) +affs_setattr(struct mnt_idmap *idmap, struct dentry *dentry, struct iattr *attr) { struct inode *inode = d_inode(dentry); int error; - pr_debug("notify_change(%lu,0x%x)\n", inode->i_ino, attr->ia_valid); + pr_debug("setattr(%lu,0x%x)\n", inode->i_ino, attr->ia_valid); error = setattr_prepare(&nop_mnt_idmap, dentry, attr); if (error) diff --git a/fs/affs/symlink.c b/fs/affs/symlink.c index 094aec8d17b8..af6147e1d975 100644 --- a/fs/affs/symlink.c +++ b/fs/affs/symlink.c @@ -71,5 +71,5 @@ const struct address_space_operations affs_symlink_aops = { const struct inode_operations affs_symlink_inode_operations = { .get_link = page_get_link, - .setattr = affs_notify_change, + .setattr = affs_setattr, }; From 690005b0b1e6b567c88b7790e6d90d4d6c9e09cc Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Wed, 25 Mar 2026 07:36:51 +0100 Subject: [PATCH 4/5] proc: rename proc_setattr to proc_nochmod_setattr What is currently proc_setattr is a special version added after the more general procfs ->seattr in commit 6d76fa58b050 ("Don't allow chmod() on the /proc// files"). Give it a name that reflects that to free the proc_setattr name and better describe what is doing. Signed-off-by: Christoph Hellwig Link: https://patch.msgid.link/20260325063711.3298685-5-hch@lst.de Reviewed-by: Jan Kara Signed-off-by: Christian Brauner --- fs/proc/base.c | 22 +++++++++++----------- fs/proc/fd.c | 6 +++--- fs/proc/internal.h | 4 ++-- fs/proc/namespaces.c | 4 ++-- fs/proc/proc_net.c | 2 +- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/fs/proc/base.c b/fs/proc/base.c index 4eec684baca9..76660614875c 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -721,7 +721,7 @@ static bool proc_fd_access_allowed(struct inode *inode) return allowed; } -int proc_setattr(struct mnt_idmap *idmap, struct dentry *dentry, +int proc_nochmod_setattr(struct mnt_idmap *idmap, struct dentry *dentry, struct iattr *attr) { int error; @@ -794,7 +794,7 @@ static int proc_pid_permission(struct mnt_idmap *idmap, static const struct inode_operations proc_def_inode_operations = { - .setattr = proc_setattr, + .setattr = proc_nochmod_setattr, }; static int proc_single_show(struct seq_file *m, void *v) @@ -1866,7 +1866,7 @@ out: const struct inode_operations proc_pid_link_inode_operations = { .readlink = proc_pid_readlink, .get_link = proc_pid_get_link, - .setattr = proc_setattr, + .setattr = proc_nochmod_setattr, }; @@ -2316,7 +2316,7 @@ proc_map_files_get_link(struct dentry *dentry, static const struct inode_operations proc_map_files_link_inode_operations = { .readlink = proc_pid_readlink, .get_link = proc_map_files_get_link, - .setattr = proc_setattr, + .setattr = proc_nochmod_setattr, }; static struct dentry * @@ -2395,7 +2395,7 @@ out: static const struct inode_operations proc_map_files_inode_operations = { .lookup = proc_map_files_lookup, .permission = proc_fd_permission, - .setattr = proc_setattr, + .setattr = proc_nochmod_setattr, }; static int @@ -2882,7 +2882,7 @@ static struct dentry *proc_##LSM##_attr_dir_lookup(struct inode *dir, \ static const struct inode_operations proc_##LSM##_attr_dir_inode_ops = { \ .lookup = proc_##LSM##_attr_dir_lookup, \ .getattr = pid_getattr, \ - .setattr = proc_setattr, \ + .setattr = proc_nochmod_setattr, \ } #ifdef CONFIG_SECURITY_SMACK @@ -2941,7 +2941,7 @@ static struct dentry *proc_attr_dir_lookup(struct inode *dir, static const struct inode_operations proc_attr_dir_inode_operations = { .lookup = proc_attr_dir_lookup, .getattr = pid_getattr, - .setattr = proc_setattr, + .setattr = proc_nochmod_setattr, }; #endif @@ -3450,7 +3450,7 @@ static struct dentry *proc_tgid_base_lookup(struct inode *dir, struct dentry *de static const struct inode_operations proc_tgid_base_inode_operations = { .lookup = proc_tgid_base_lookup, .getattr = pid_getattr, - .setattr = proc_setattr, + .setattr = proc_nochmod_setattr, .permission = proc_pid_permission, }; @@ -3647,7 +3647,7 @@ static int proc_tid_comm_permission(struct mnt_idmap *idmap, } static const struct inode_operations proc_tid_comm_inode_operations = { - .setattr = proc_setattr, + .setattr = proc_nochmod_setattr, .permission = proc_tid_comm_permission, }; @@ -3776,7 +3776,7 @@ static const struct file_operations proc_tid_base_operations = { static const struct inode_operations proc_tid_base_inode_operations = { .lookup = proc_tid_base_lookup, .getattr = pid_getattr, - .setattr = proc_setattr, + .setattr = proc_nochmod_setattr, }; static struct dentry *proc_task_instantiate(struct dentry *dentry, @@ -3989,7 +3989,7 @@ static loff_t proc_dir_llseek(struct file *file, loff_t offset, int whence) static const struct inode_operations proc_task_inode_operations = { .lookup = proc_task_lookup, .getattr = proc_task_getattr, - .setattr = proc_setattr, + .setattr = proc_nochmod_setattr, .permission = proc_pid_permission, }; diff --git a/fs/proc/fd.c b/fs/proc/fd.c index 9eeccff49b2a..8a48ff4a19ec 100644 --- a/fs/proc/fd.c +++ b/fs/proc/fd.c @@ -102,7 +102,7 @@ static int proc_fdinfo_permission(struct mnt_idmap *idmap, struct inode *inode, static const struct inode_operations proc_fdinfo_file_inode_operations = { .permission = proc_fdinfo_permission, - .setattr = proc_setattr, + .setattr = proc_nochmod_setattr, }; static const struct file_operations proc_fdinfo_file_operations = { @@ -361,7 +361,7 @@ const struct inode_operations proc_fd_inode_operations = { .lookup = proc_lookupfd, .permission = proc_fd_permission, .getattr = proc_fd_getattr, - .setattr = proc_setattr, + .setattr = proc_nochmod_setattr, }; static struct dentry *proc_fdinfo_instantiate(struct dentry *dentry, @@ -402,7 +402,7 @@ static int proc_fdinfo_iterate(struct file *file, struct dir_context *ctx) const struct inode_operations proc_fdinfo_inode_operations = { .lookup = proc_lookupfdinfo, .permission = proc_fdinfo_permission, - .setattr = proc_setattr, + .setattr = proc_nochmod_setattr, }; const struct file_operations proc_fdinfo_operations = { diff --git a/fs/proc/internal.h b/fs/proc/internal.h index c1e8eb984da8..64dc44832808 100644 --- a/fs/proc/internal.h +++ b/fs/proc/internal.h @@ -257,8 +257,8 @@ extern int proc_pid_statm(struct seq_file *, struct pid_namespace *, extern const struct dentry_operations pid_dentry_operations; extern int pid_getattr(struct mnt_idmap *, const struct path *, struct kstat *, u32, unsigned int); -extern int proc_setattr(struct mnt_idmap *, struct dentry *, - struct iattr *); +int proc_nochmod_setattr(struct mnt_idmap *idmap, struct dentry *dentry, + struct iattr *attr); extern void proc_pid_evict_inode(struct proc_inode *); extern struct inode *proc_pid_make_inode(struct super_block *, struct task_struct *, umode_t); extern void pid_update_inode(struct task_struct *, struct inode *); diff --git a/fs/proc/namespaces.c b/fs/proc/namespaces.c index ea2b597fd92c..39f4169f669f 100644 --- a/fs/proc/namespaces.c +++ b/fs/proc/namespaces.c @@ -92,7 +92,7 @@ static int proc_ns_readlink(struct dentry *dentry, char __user *buffer, int bufl static const struct inode_operations proc_ns_link_inode_operations = { .readlink = proc_ns_readlink, .get_link = proc_ns_get_link, - .setattr = proc_setattr, + .setattr = proc_nochmod_setattr, }; static struct dentry *proc_ns_instantiate(struct dentry *dentry, @@ -178,5 +178,5 @@ out_no_task: const struct inode_operations proc_ns_dir_inode_operations = { .lookup = proc_ns_dir_lookup, .getattr = pid_getattr, - .setattr = proc_setattr, + .setattr = proc_nochmod_setattr, }; diff --git a/fs/proc/proc_net.c b/fs/proc/proc_net.c index 52f0b75cbce2..184cddeb8215 100644 --- a/fs/proc/proc_net.c +++ b/fs/proc/proc_net.c @@ -322,7 +322,7 @@ static int proc_tgid_net_getattr(struct mnt_idmap *idmap, const struct inode_operations proc_net_inode_operations = { .lookup = proc_tgid_net_lookup, .getattr = proc_tgid_net_getattr, - .setattr = proc_setattr, + .setattr = proc_nochmod_setattr, }; static int proc_tgid_net_readdir(struct file *file, struct dir_context *ctx) From 2ecd46d161faf4b038e02950c9d621a1ffcbd321 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Wed, 25 Mar 2026 07:36:52 +0100 Subject: [PATCH 5/5] proc: rename proc_notify_change to proc_setattr Make the function name match the method that it implements. Signed-off-by: Christoph Hellwig Link: https://patch.msgid.link/20260325063711.3298685-6-hch@lst.de Reviewed-by: Jan Kara Signed-off-by: Christian Brauner --- fs/proc/generic.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fs/proc/generic.c b/fs/proc/generic.c index 501889856461..8bb81e58c9d8 100644 --- a/fs/proc/generic.c +++ b/fs/proc/generic.c @@ -115,8 +115,8 @@ static bool pde_subdir_insert(struct proc_dir_entry *dir, return true; } -static int proc_notify_change(struct mnt_idmap *idmap, - struct dentry *dentry, struct iattr *iattr) +static int proc_setattr(struct mnt_idmap *idmap, struct dentry *dentry, + struct iattr *iattr) { struct inode *inode = d_inode(dentry); struct proc_dir_entry *de = PDE(inode); @@ -151,7 +151,7 @@ static int proc_getattr(struct mnt_idmap *idmap, } static const struct inode_operations proc_file_inode_operations = { - .setattr = proc_notify_change, + .setattr = proc_setattr, }; /* @@ -364,7 +364,7 @@ const struct dentry_operations proc_net_dentry_ops = { static const struct inode_operations proc_dir_inode_operations = { .lookup = proc_lookup, .getattr = proc_getattr, - .setattr = proc_notify_change, + .setattr = proc_setattr, }; static void pde_set_flags(struct proc_dir_entry *pde)