mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-10-22 15:03:53 +02:00
vfs-6.16-rc7.fixes
-----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQRAhzRXHqcMeLMyaSiRxhvAZXjcogUCaHt3nAAKCRCRxhvAZXjc ojOmAP9nBSXSP2YvyUWPuKJc/wra27gRSEOQjXQS4j0ay6xLbAD/bO3AKMOWAUya EnUzZDe29z7TbnGW1PlE93cX9oXWjQc= =Gt4r -----END PGP SIGNATURE----- Merge tag 'vfs-6.16-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs Pull vfs fixes from Christian Brauner: - Fix a memory leak in fcntl_dirnotify() - Raise SB_I_NOEXEC on secrement superblock instead of messing with flags on the mount - Add fsdevel and block mailing lists to uio entry. We had a few instances were very questionable stuff was added without either block or the VFS being aware of it - Fix netfs copy-to-cache so that it performs collection with ceph+fscache - Fix netfs race between cache write completion and ALL_QUEUED being set - Verify the inode mode when loading entries from disk in isofs - Avoid state_lock in iomap_set_range_uptodate() - Fix PIDFD_INFO_COREDUMP check in PIDFD_GET_INFO ioctl - Fix the incorrect return value in __cachefiles_write() * tag 'vfs-6.16-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs: MAINTAINERS: add block and fsdevel lists to iov_iter netfs: Fix race between cache write completion and ALL_QUEUED being set netfs: Fix copy-to-cache so that it performs collection with ceph+fscache fix a leak in fcntl_dirnotify() iomap: avoid unnecessary ifs_set_range_uptodate() with locks isofs: Verify inode mode when loading from disk cachefiles: Fix the incorrect return value in __cachefiles_write() secretmem: use SB_I_NOEXEC coredump: fix PIDFD_INFO_COREDUMP ioctl check
This commit is contained in:
commit
1c6aa1121e
|
@ -25902,6 +25902,8 @@ F: fs/hostfs/
|
|||
|
||||
USERSPACE COPYIN/COPYOUT (UIOVEC)
|
||||
M: Alexander Viro <viro@zeniv.linux.org.uk>
|
||||
L: linux-block@vger.kernel.org
|
||||
L: linux-fsdevel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: include/linux/uio.h
|
||||
F: lib/iov_iter.c
|
||||
|
|
|
@ -347,8 +347,6 @@ int __cachefiles_write(struct cachefiles_object *object,
|
|||
default:
|
||||
ki->was_async = false;
|
||||
cachefiles_write_complete(&ki->iocb, ret);
|
||||
if (ret > 0)
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -83,10 +83,8 @@ static ssize_t cachefiles_ondemand_fd_write_iter(struct kiocb *kiocb,
|
|||
|
||||
trace_cachefiles_ondemand_fd_write(object, file_inode(file), pos, len);
|
||||
ret = __cachefiles_write(object, file, pos, iter, NULL, NULL);
|
||||
if (!ret) {
|
||||
ret = len;
|
||||
if (ret > 0)
|
||||
kiocb->ki_pos += ret;
|
||||
}
|
||||
|
||||
out:
|
||||
fput(file);
|
||||
|
|
|
@ -71,6 +71,9 @@ static void iomap_set_range_uptodate(struct folio *folio, size_t off,
|
|||
unsigned long flags;
|
||||
bool uptodate = true;
|
||||
|
||||
if (folio_test_uptodate(folio))
|
||||
return;
|
||||
|
||||
if (ifs) {
|
||||
spin_lock_irqsave(&ifs->state_lock, flags);
|
||||
uptodate = ifs_set_range_uptodate(folio, ifs, off, len);
|
||||
|
|
|
@ -1440,9 +1440,16 @@ static int isofs_read_inode(struct inode *inode, int relocated)
|
|||
inode->i_op = &page_symlink_inode_operations;
|
||||
inode_nohighmem(inode);
|
||||
inode->i_data.a_ops = &isofs_symlink_aops;
|
||||
} else
|
||||
} else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) ||
|
||||
S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) {
|
||||
/* XXX - parse_rock_ridge_inode() had already set i_rdev. */
|
||||
init_special_inode(inode, inode->i_mode, inode->i_rdev);
|
||||
} else {
|
||||
printk(KERN_DEBUG "ISOFS: Invalid file type 0%04o for inode %lu.\n",
|
||||
inode->i_mode, inode->i_ino);
|
||||
ret = -EIO;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
out:
|
||||
|
|
|
@ -110,6 +110,8 @@ static struct netfs_io_request *netfs_pgpriv2_begin_copy_to_cache(
|
|||
if (!creq->io_streams[1].avail)
|
||||
goto cancel_put;
|
||||
|
||||
__set_bit(NETFS_RREQ_OFFLOAD_COLLECTION, &creq->flags);
|
||||
trace_netfs_copy2cache(rreq, creq);
|
||||
trace_netfs_write(creq, netfs_write_trace_copy_to_cache);
|
||||
netfs_stat(&netfs_n_wh_copy_to_cache);
|
||||
rreq->copy_to_cache = creq;
|
||||
|
@ -154,6 +156,9 @@ void netfs_pgpriv2_end_copy_to_cache(struct netfs_io_request *rreq)
|
|||
netfs_issue_write(creq, &creq->io_streams[1]);
|
||||
smp_wmb(); /* Write lists before ALL_QUEUED. */
|
||||
set_bit(NETFS_RREQ_ALL_QUEUED, &creq->flags);
|
||||
trace_netfs_rreq(rreq, netfs_rreq_trace_end_copy_to_cache);
|
||||
if (list_empty_careful(&creq->io_streams[1].subrequests))
|
||||
netfs_wake_collector(creq);
|
||||
|
||||
netfs_put_request(creq, netfs_rreq_trace_put_return);
|
||||
creq->copy_to_cache = NULL;
|
||||
|
|
|
@ -308,6 +308,10 @@ int fcntl_dirnotify(int fd, struct file *filp, unsigned int arg)
|
|||
goto out_err;
|
||||
}
|
||||
|
||||
error = file_f_owner_allocate(filp);
|
||||
if (error)
|
||||
goto out_err;
|
||||
|
||||
/* new fsnotify mark, we expect most fcntl calls to add a new mark */
|
||||
new_dn_mark = kmem_cache_alloc(dnotify_mark_cache, GFP_KERNEL);
|
||||
if (!new_dn_mark) {
|
||||
|
@ -315,10 +319,6 @@ int fcntl_dirnotify(int fd, struct file *filp, unsigned int arg)
|
|||
goto out_err;
|
||||
}
|
||||
|
||||
error = file_f_owner_allocate(filp);
|
||||
if (error)
|
||||
goto out_err;
|
||||
|
||||
/* set up the new_fsn_mark and new_dn_mark */
|
||||
new_fsn_mark = &new_dn_mark->fsn_mark;
|
||||
fsnotify_init_mark(new_fsn_mark, dnotify_group);
|
||||
|
|
|
@ -319,7 +319,7 @@ static long pidfd_info(struct file *file, unsigned int cmd, unsigned long arg)
|
|||
if (!c)
|
||||
return -ESRCH;
|
||||
|
||||
if (!(kinfo.mask & PIDFD_INFO_COREDUMP)) {
|
||||
if ((kinfo.mask & PIDFD_INFO_COREDUMP) && !(kinfo.coredump_mask)) {
|
||||
task_lock(task);
|
||||
if (task->mm)
|
||||
kinfo.coredump_mask = pidfs_coredump_mask(task->mm->flags);
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
EM(netfs_rreq_trace_copy, "COPY ") \
|
||||
EM(netfs_rreq_trace_dirty, "DIRTY ") \
|
||||
EM(netfs_rreq_trace_done, "DONE ") \
|
||||
EM(netfs_rreq_trace_end_copy_to_cache, "END-C2C") \
|
||||
EM(netfs_rreq_trace_free, "FREE ") \
|
||||
EM(netfs_rreq_trace_ki_complete, "KI-CMPL") \
|
||||
EM(netfs_rreq_trace_recollect, "RECLLCT") \
|
||||
|
@ -559,6 +560,35 @@ TRACE_EVENT(netfs_write,
|
|||
__entry->start, __entry->start + __entry->len - 1)
|
||||
);
|
||||
|
||||
TRACE_EVENT(netfs_copy2cache,
|
||||
TP_PROTO(const struct netfs_io_request *rreq,
|
||||
const struct netfs_io_request *creq),
|
||||
|
||||
TP_ARGS(rreq, creq),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned int, rreq)
|
||||
__field(unsigned int, creq)
|
||||
__field(unsigned int, cookie)
|
||||
__field(unsigned int, ino)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
struct netfs_inode *__ctx = netfs_inode(rreq->inode);
|
||||
struct fscache_cookie *__cookie = netfs_i_cookie(__ctx);
|
||||
__entry->rreq = rreq->debug_id;
|
||||
__entry->creq = creq->debug_id;
|
||||
__entry->cookie = __cookie ? __cookie->debug_id : 0;
|
||||
__entry->ino = rreq->inode->i_ino;
|
||||
),
|
||||
|
||||
TP_printk("R=%08x CR=%08x c=%08x i=%x ",
|
||||
__entry->rreq,
|
||||
__entry->creq,
|
||||
__entry->cookie,
|
||||
__entry->ino)
|
||||
);
|
||||
|
||||
TRACE_EVENT(netfs_collect,
|
||||
TP_PROTO(const struct netfs_io_request *wreq),
|
||||
|
||||
|
|
|
@ -261,7 +261,15 @@ err_put_fd:
|
|||
|
||||
static int secretmem_init_fs_context(struct fs_context *fc)
|
||||
{
|
||||
return init_pseudo(fc, SECRETMEM_MAGIC) ? 0 : -ENOMEM;
|
||||
struct pseudo_fs_context *ctx;
|
||||
|
||||
ctx = init_pseudo(fc, SECRETMEM_MAGIC);
|
||||
if (!ctx)
|
||||
return -ENOMEM;
|
||||
|
||||
fc->s_iflags |= SB_I_NOEXEC;
|
||||
fc->s_iflags |= SB_I_NODEV;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct file_system_type secretmem_fs = {
|
||||
|
@ -279,9 +287,6 @@ static int __init secretmem_init(void)
|
|||
if (IS_ERR(secretmem_mnt))
|
||||
return PTR_ERR(secretmem_mnt);
|
||||
|
||||
/* prevent secretmem mappings from ever getting PROT_EXEC */
|
||||
secretmem_mnt->mnt_flags |= MNT_NOEXEC;
|
||||
|
||||
return 0;
|
||||
}
|
||||
fs_initcall(secretmem_init);
|
||||
|
|
Loading…
Reference in New Issue
Block a user