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
This commit is contained in:
@@ -1468,7 +1468,7 @@ static int proc_dostring_coredump(const struct ctl_table *table, int write,
|
||||
ssize_t retval;
|
||||
char old_core_pattern[CORENAME_MAX_SIZE];
|
||||
|
||||
if (write)
|
||||
if (!write)
|
||||
return proc_dostring(table, write, buffer, lenp, ppos);
|
||||
|
||||
retval = strscpy(old_core_pattern, core_pattern, CORENAME_MAX_SIZE);
|
||||
|
||||
2
fs/dax.c
2
fs/dax.c
@@ -1725,7 +1725,7 @@ dax_iomap_rw(struct kiocb *iocb, struct iov_iter *iter,
|
||||
if (iov_iter_rw(iter) == WRITE) {
|
||||
lockdep_assert_held_write(&iomi.inode->i_rwsem);
|
||||
iomi.flags |= IOMAP_WRITE;
|
||||
} else {
|
||||
} else if (!sb_rdonly(iomi.inode->i_sb)) {
|
||||
lockdep_assert_held(&iomi.inode->i_rwsem);
|
||||
}
|
||||
|
||||
|
||||
@@ -2557,6 +2557,8 @@ struct dentry *d_alloc_parallel(struct dentry *parent,
|
||||
spin_lock(&parent->d_lock);
|
||||
new->d_parent = dget_dlock(parent);
|
||||
hlist_add_head(&new->d_sib, &parent->d_children);
|
||||
if (parent->d_flags & DCACHE_DISCONNECTED)
|
||||
new->d_flags |= DCACHE_DISCONNECTED;
|
||||
spin_unlock(&parent->d_lock);
|
||||
|
||||
retry:
|
||||
|
||||
@@ -2048,7 +2048,7 @@ static int proc_dointvec_minmax_coredump(const struct ctl_table *table, int writ
|
||||
{
|
||||
int error = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
|
||||
|
||||
if (!error && !write)
|
||||
if (!error && write)
|
||||
validate_coredump_safety();
|
||||
return error;
|
||||
}
|
||||
|
||||
@@ -84,7 +84,7 @@ int vfs_fileattr_get(struct dentry *dentry, struct file_kattr *fa)
|
||||
int error;
|
||||
|
||||
if (!inode->i_op->fileattr_get)
|
||||
return -EOPNOTSUPP;
|
||||
return -ENOIOCTLCMD;
|
||||
|
||||
error = security_inode_file_getattr(dentry, fa);
|
||||
if (error)
|
||||
@@ -270,7 +270,7 @@ int vfs_fileattr_set(struct mnt_idmap *idmap, struct dentry *dentry,
|
||||
int err;
|
||||
|
||||
if (!inode->i_op->fileattr_set)
|
||||
return -EOPNOTSUPP;
|
||||
return -ENOIOCTLCMD;
|
||||
|
||||
if (!inode_owner_or_capable(idmap, inode))
|
||||
return -EPERM;
|
||||
@@ -312,8 +312,6 @@ int ioctl_getflags(struct file *file, unsigned int __user *argp)
|
||||
int err;
|
||||
|
||||
err = vfs_fileattr_get(file->f_path.dentry, &fa);
|
||||
if (err == -EOPNOTSUPP)
|
||||
err = -ENOIOCTLCMD;
|
||||
if (!err)
|
||||
err = put_user(fa.flags, argp);
|
||||
return err;
|
||||
@@ -335,8 +333,6 @@ int ioctl_setflags(struct file *file, unsigned int __user *argp)
|
||||
fileattr_fill_flags(&fa, flags);
|
||||
err = vfs_fileattr_set(idmap, dentry, &fa);
|
||||
mnt_drop_write_file(file);
|
||||
if (err == -EOPNOTSUPP)
|
||||
err = -ENOIOCTLCMD;
|
||||
}
|
||||
}
|
||||
return err;
|
||||
@@ -349,8 +345,6 @@ int ioctl_fsgetxattr(struct file *file, void __user *argp)
|
||||
int err;
|
||||
|
||||
err = vfs_fileattr_get(file->f_path.dentry, &fa);
|
||||
if (err == -EOPNOTSUPP)
|
||||
err = -ENOIOCTLCMD;
|
||||
if (!err)
|
||||
err = copy_fsxattr_to_user(&fa, argp);
|
||||
|
||||
@@ -371,8 +365,6 @@ int ioctl_fssetxattr(struct file *file, void __user *argp)
|
||||
if (!err) {
|
||||
err = vfs_fileattr_set(idmap, dentry, &fa);
|
||||
mnt_drop_write_file(file);
|
||||
if (err == -EOPNOTSUPP)
|
||||
err = -ENOIOCTLCMD;
|
||||
}
|
||||
}
|
||||
return err;
|
||||
@@ -424,6 +416,8 @@ SYSCALL_DEFINE5(file_getattr, int, dfd, const char __user *, filename,
|
||||
}
|
||||
|
||||
error = vfs_fileattr_get(filepath.dentry, &fa);
|
||||
if (error == -ENOIOCTLCMD || error == -ENOTTY)
|
||||
error = -EOPNOTSUPP;
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
@@ -491,6 +485,8 @@ SYSCALL_DEFINE5(file_setattr, int, dfd, const char __user *, filename,
|
||||
if (!error) {
|
||||
error = vfs_fileattr_set(mnt_idmap(filepath.mnt),
|
||||
filepath.dentry, &fa);
|
||||
if (error == -ENOIOCTLCMD || error == -ENOTTY)
|
||||
error = -EOPNOTSUPP;
|
||||
mnt_drop_write(filepath.mnt);
|
||||
}
|
||||
|
||||
|
||||
@@ -192,7 +192,7 @@ static int init_file(struct file *f, int flags, const struct cred *cred)
|
||||
f->f_sb_err = 0;
|
||||
|
||||
/*
|
||||
* We're SLAB_TYPESAFE_BY_RCU so initialize f_count last. While
|
||||
* We're SLAB_TYPESAFE_BY_RCU so initialize f_ref last. While
|
||||
* fget-rcu pattern users need to be able to handle spurious
|
||||
* refcount bumps we should reinitialize the reused file first.
|
||||
*/
|
||||
|
||||
@@ -536,8 +536,6 @@ int fuse_fileattr_get(struct dentry *dentry, struct file_kattr *fa)
|
||||
cleanup:
|
||||
fuse_priv_ioctl_cleanup(inode, ff);
|
||||
|
||||
if (err == -ENOTTY)
|
||||
err = -EOPNOTSUPP;
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -574,7 +572,5 @@ int fuse_fileattr_set(struct mnt_idmap *idmap,
|
||||
cleanup:
|
||||
fuse_priv_ioctl_cleanup(inode, ff);
|
||||
|
||||
if (err == -ENOTTY)
|
||||
err = -EOPNOTSUPP;
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -490,7 +490,9 @@ static struct dentry *nsfs_fh_to_dentry(struct super_block *sb, struct fid *fh,
|
||||
|
||||
VFS_WARN_ON_ONCE(ns->ns_id != fid->ns_id);
|
||||
VFS_WARN_ON_ONCE(ns->ns_type != fid->ns_type);
|
||||
VFS_WARN_ON_ONCE(ns->inum != fid->ns_inum);
|
||||
|
||||
if (ns->inum != fid->ns_inum)
|
||||
return NULL;
|
||||
|
||||
if (!__ns_ref_get(ns))
|
||||
return NULL;
|
||||
|
||||
@@ -178,7 +178,7 @@ static int ovl_copy_fileattr(struct inode *inode, const struct path *old,
|
||||
err = ovl_real_fileattr_get(old, &oldfa);
|
||||
if (err) {
|
||||
/* Ntfs-3g returns -EINVAL for "no fileattr support" */
|
||||
if (err == -EOPNOTSUPP || err == -EINVAL)
|
||||
if (err == -ENOTTY || err == -EINVAL)
|
||||
return 0;
|
||||
pr_warn("failed to retrieve lower fileattr (%pd2, err=%i)\n",
|
||||
old->dentry, err);
|
||||
|
||||
@@ -369,11 +369,6 @@ static ssize_t ovl_write_iter(struct kiocb *iocb, struct iov_iter *iter)
|
||||
if (!ovl_should_sync(OVL_FS(inode->i_sb)))
|
||||
ifl &= ~(IOCB_DSYNC | IOCB_SYNC);
|
||||
|
||||
/*
|
||||
* Overlayfs doesn't support deferred completions, don't copy
|
||||
* this property in case it is set by the issuer.
|
||||
*/
|
||||
ifl &= ~IOCB_DIO_CALLER_COMP;
|
||||
ret = backing_file_write_iter(realfile, iter, iocb, ifl, &ctx);
|
||||
|
||||
out_unlock:
|
||||
|
||||
@@ -720,7 +720,10 @@ int ovl_real_fileattr_get(const struct path *realpath, struct file_kattr *fa)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return vfs_fileattr_get(realpath->dentry, fa);
|
||||
err = vfs_fileattr_get(realpath->dentry, fa);
|
||||
if (err == -ENOIOCTLCMD)
|
||||
err = -ENOTTY;
|
||||
return err;
|
||||
}
|
||||
|
||||
int ovl_fileattr_get(struct dentry *dentry, struct file_kattr *fa)
|
||||
|
||||
@@ -448,9 +448,9 @@ impl Drop for FileDescriptorReservation {
|
||||
}
|
||||
}
|
||||
|
||||
/// Represents the `EBADF` error code.
|
||||
/// Represents the [`EBADF`] error code.
|
||||
///
|
||||
/// Used for methods that can only fail with `EBADF`.
|
||||
/// Used for methods that can only fail with [`EBADF`].
|
||||
#[derive(Copy, Clone, Eq, PartialEq)]
|
||||
pub struct BadFdError;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user