Skip to content

Commit 7ea3095

Browse files
committed
Merge tag 'vfs-6.18-rc2.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
Pull vfs fixes from Christian Brauner: - Handle inode number mismatches in nsfs file handles - Update the comment to init_file() - Add documentation link for EBADF in the rust file code - Skip read lock assertion for read-only filesystems when using dax - Don't leak disconnected dentries during umount - Fix new coredump input pattern validation - Handle ENOIOCTLCMD conversion in vfs_fileattr_{g,s}et() correctly - Remove redundant IOCB_DIO_CALLER_COMP clearing in overlayfs * tag 'vfs-6.18-rc2.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs: ovl: remove redundant IOCB_DIO_CALLER_COMP clearing fs: return EOPNOTSUPP from file_setattr/file_getattr syscalls Revert "fs: make vfs_fileattr_[get|set] return -EOPNOTSUPP" coredump: fix core_pattern input validation vfs: Don't leak disconnected dentries on umount dax: skip read lock assertion for read-only filesystems rust: file: add intra-doc link for 'EBADF' fs: update comment in init_file() nsfs: handle inode number mismatches gracefully in file handles
2 parents 5a6f65d + 7933a58 commit 7ea3095

File tree

12 files changed

+22
-28
lines changed

12 files changed

+22
-28
lines changed

fs/coredump.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1468,7 +1468,7 @@ static int proc_dostring_coredump(const struct ctl_table *table, int write,
14681468
ssize_t retval;
14691469
char old_core_pattern[CORENAME_MAX_SIZE];
14701470

1471-
if (write)
1471+
if (!write)
14721472
return proc_dostring(table, write, buffer, lenp, ppos);
14731473

14741474
retval = strscpy(old_core_pattern, core_pattern, CORENAME_MAX_SIZE);

fs/dax.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1725,7 +1725,7 @@ dax_iomap_rw(struct kiocb *iocb, struct iov_iter *iter,
17251725
if (iov_iter_rw(iter) == WRITE) {
17261726
lockdep_assert_held_write(&iomi.inode->i_rwsem);
17271727
iomi.flags |= IOMAP_WRITE;
1728-
} else {
1728+
} else if (!sb_rdonly(iomi.inode->i_sb)) {
17291729
lockdep_assert_held(&iomi.inode->i_rwsem);
17301730
}
17311731

fs/dcache.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2557,6 +2557,8 @@ struct dentry *d_alloc_parallel(struct dentry *parent,
25572557
spin_lock(&parent->d_lock);
25582558
new->d_parent = dget_dlock(parent);
25592559
hlist_add_head(&new->d_sib, &parent->d_children);
2560+
if (parent->d_flags & DCACHE_DISCONNECTED)
2561+
new->d_flags |= DCACHE_DISCONNECTED;
25602562
spin_unlock(&parent->d_lock);
25612563

25622564
retry:

fs/exec.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2048,7 +2048,7 @@ static int proc_dointvec_minmax_coredump(const struct ctl_table *table, int writ
20482048
{
20492049
int error = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
20502050

2051-
if (!error && !write)
2051+
if (!error && write)
20522052
validate_coredump_safety();
20532053
return error;
20542054
}

fs/file_attr.c

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ int vfs_fileattr_get(struct dentry *dentry, struct file_kattr *fa)
8484
int error;
8585

8686
if (!inode->i_op->fileattr_get)
87-
return -EOPNOTSUPP;
87+
return -ENOIOCTLCMD;
8888

8989
error = security_inode_file_getattr(dentry, fa);
9090
if (error)
@@ -270,7 +270,7 @@ int vfs_fileattr_set(struct mnt_idmap *idmap, struct dentry *dentry,
270270
int err;
271271

272272
if (!inode->i_op->fileattr_set)
273-
return -EOPNOTSUPP;
273+
return -ENOIOCTLCMD;
274274

275275
if (!inode_owner_or_capable(idmap, inode))
276276
return -EPERM;
@@ -312,8 +312,6 @@ int ioctl_getflags(struct file *file, unsigned int __user *argp)
312312
int err;
313313

314314
err = vfs_fileattr_get(file->f_path.dentry, &fa);
315-
if (err == -EOPNOTSUPP)
316-
err = -ENOIOCTLCMD;
317315
if (!err)
318316
err = put_user(fa.flags, argp);
319317
return err;
@@ -335,8 +333,6 @@ int ioctl_setflags(struct file *file, unsigned int __user *argp)
335333
fileattr_fill_flags(&fa, flags);
336334
err = vfs_fileattr_set(idmap, dentry, &fa);
337335
mnt_drop_write_file(file);
338-
if (err == -EOPNOTSUPP)
339-
err = -ENOIOCTLCMD;
340336
}
341337
}
342338
return err;
@@ -349,8 +345,6 @@ int ioctl_fsgetxattr(struct file *file, void __user *argp)
349345
int err;
350346

351347
err = vfs_fileattr_get(file->f_path.dentry, &fa);
352-
if (err == -EOPNOTSUPP)
353-
err = -ENOIOCTLCMD;
354348
if (!err)
355349
err = copy_fsxattr_to_user(&fa, argp);
356350

@@ -371,8 +365,6 @@ int ioctl_fssetxattr(struct file *file, void __user *argp)
371365
if (!err) {
372366
err = vfs_fileattr_set(idmap, dentry, &fa);
373367
mnt_drop_write_file(file);
374-
if (err == -EOPNOTSUPP)
375-
err = -ENOIOCTLCMD;
376368
}
377369
}
378370
return err;
@@ -424,6 +416,8 @@ SYSCALL_DEFINE5(file_getattr, int, dfd, const char __user *, filename,
424416
}
425417

426418
error = vfs_fileattr_get(filepath.dentry, &fa);
419+
if (error == -ENOIOCTLCMD || error == -ENOTTY)
420+
error = -EOPNOTSUPP;
427421
if (error)
428422
return error;
429423

@@ -491,6 +485,8 @@ SYSCALL_DEFINE5(file_setattr, int, dfd, const char __user *, filename,
491485
if (!error) {
492486
error = vfs_fileattr_set(mnt_idmap(filepath.mnt),
493487
filepath.dentry, &fa);
488+
if (error == -ENOIOCTLCMD || error == -ENOTTY)
489+
error = -EOPNOTSUPP;
494490
mnt_drop_write(filepath.mnt);
495491
}
496492

fs/file_table.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ static int init_file(struct file *f, int flags, const struct cred *cred)
192192
f->f_sb_err = 0;
193193

194194
/*
195-
* We're SLAB_TYPESAFE_BY_RCU so initialize f_count last. While
195+
* We're SLAB_TYPESAFE_BY_RCU so initialize f_ref last. While
196196
* fget-rcu pattern users need to be able to handle spurious
197197
* refcount bumps we should reinitialize the reused file first.
198198
*/

fs/fuse/ioctl.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -536,8 +536,6 @@ int fuse_fileattr_get(struct dentry *dentry, struct file_kattr *fa)
536536
cleanup:
537537
fuse_priv_ioctl_cleanup(inode, ff);
538538

539-
if (err == -ENOTTY)
540-
err = -EOPNOTSUPP;
541539
return err;
542540
}
543541

@@ -574,7 +572,5 @@ int fuse_fileattr_set(struct mnt_idmap *idmap,
574572
cleanup:
575573
fuse_priv_ioctl_cleanup(inode, ff);
576574

577-
if (err == -ENOTTY)
578-
err = -EOPNOTSUPP;
579575
return err;
580576
}

fs/nsfs.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,9 @@ static struct dentry *nsfs_fh_to_dentry(struct super_block *sb, struct fid *fh,
490490

491491
VFS_WARN_ON_ONCE(ns->ns_id != fid->ns_id);
492492
VFS_WARN_ON_ONCE(ns->ns_type != fid->ns_type);
493-
VFS_WARN_ON_ONCE(ns->inum != fid->ns_inum);
493+
494+
if (ns->inum != fid->ns_inum)
495+
return NULL;
494496

495497
if (!__ns_ref_get(ns))
496498
return NULL;

fs/overlayfs/copy_up.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ static int ovl_copy_fileattr(struct inode *inode, const struct path *old,
178178
err = ovl_real_fileattr_get(old, &oldfa);
179179
if (err) {
180180
/* Ntfs-3g returns -EINVAL for "no fileattr support" */
181-
if (err == -EOPNOTSUPP || err == -EINVAL)
181+
if (err == -ENOTTY || err == -EINVAL)
182182
return 0;
183183
pr_warn("failed to retrieve lower fileattr (%pd2, err=%i)\n",
184184
old->dentry, err);

fs/overlayfs/file.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -369,11 +369,6 @@ static ssize_t ovl_write_iter(struct kiocb *iocb, struct iov_iter *iter)
369369
if (!ovl_should_sync(OVL_FS(inode->i_sb)))
370370
ifl &= ~(IOCB_DSYNC | IOCB_SYNC);
371371

372-
/*
373-
* Overlayfs doesn't support deferred completions, don't copy
374-
* this property in case it is set by the issuer.
375-
*/
376-
ifl &= ~IOCB_DIO_CALLER_COMP;
377372
ret = backing_file_write_iter(realfile, iter, iocb, ifl, &ctx);
378373

379374
out_unlock:

0 commit comments

Comments
 (0)