release 6.15.6
This commit is contained in:
@@ -1,81 +0,0 @@
|
||||
From 1e0bf201a90df1058f012f12adcc454d4d7c9a69 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Brauner <brauner@kernel.org>
|
||||
Date: Wed, 2 Jul 2025 11:23:55 +0200
|
||||
Subject: anon_inode: rework assertions
|
||||
|
||||
Making anonymous inodes regular files comes with a lot of risk and
|
||||
regression potential as evidenced by a recent hickup in io_uring. We're
|
||||
better of continuing to not have them be regular files. Since we have
|
||||
S_ANON_INODE we can port all of our assertions easily.
|
||||
|
||||
Link: https://lore.kernel.org/20250702-work-fixes-v1-1-ff76ea589e33@kernel.org
|
||||
Fixes: cfd86ef7e8e7 ("anon_inode: use a proper mode internally")
|
||||
Acked-by: Jens Axboe <axboe@kernel.dk>
|
||||
Cc: stable@kernel.org
|
||||
Reported-by: Jens Axboe <axboe@kernel.dk>
|
||||
Signed-off-by: Christian Brauner <brauner@kernel.org>
|
||||
---
|
||||
fs/exec.c | 9 +++++++--
|
||||
fs/libfs.c | 8 +++-----
|
||||
fs/namei.c | 2 +-
|
||||
3 files changed, 11 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/fs/exec.c
|
||||
+++ b/fs/exec.c
|
||||
@@ -111,6 +111,9 @@ static inline void put_binfmt(struct lin
|
||||
|
||||
bool path_noexec(const struct path *path)
|
||||
{
|
||||
+ /* If it's an anonymous inode make sure that we catch any shenanigans. */
|
||||
+ VFS_WARN_ON_ONCE(IS_ANON_FILE(d_inode(path->dentry)) &&
|
||||
+ !(path->mnt->mnt_sb->s_iflags & SB_I_NOEXEC));
|
||||
return (path->mnt->mnt_flags & MNT_NOEXEC) ||
|
||||
(path->mnt->mnt_sb->s_iflags & SB_I_NOEXEC);
|
||||
}
|
||||
@@ -894,13 +897,15 @@ static struct file *do_open_execat(int f
|
||||
if (IS_ERR(file))
|
||||
return file;
|
||||
|
||||
+ if (path_noexec(&file->f_path))
|
||||
+ return ERR_PTR(-EACCES);
|
||||
+
|
||||
/*
|
||||
* In the past the regular type check was here. It moved to may_open() in
|
||||
* 633fb6ac3980 ("exec: move S_ISREG() check earlier"). Since then it is
|
||||
* an invariant that all non-regular files error out before we get here.
|
||||
*/
|
||||
- if (WARN_ON_ONCE(!S_ISREG(file_inode(file)->i_mode)) ||
|
||||
- path_noexec(&file->f_path))
|
||||
+ if (WARN_ON_ONCE(!S_ISREG(file_inode(file)->i_mode)))
|
||||
return ERR_PTR(-EACCES);
|
||||
|
||||
err = exe_file_deny_write_access(file);
|
||||
--- a/fs/libfs.c
|
||||
+++ b/fs/libfs.c
|
||||
@@ -1648,12 +1648,10 @@ struct inode *alloc_anon_inode(struct su
|
||||
*/
|
||||
inode->i_state = I_DIRTY;
|
||||
/*
|
||||
- * Historically anonymous inodes didn't have a type at all and
|
||||
- * userspace has come to rely on this. Internally they're just
|
||||
- * regular files but S_IFREG is masked off when reporting
|
||||
- * information to userspace.
|
||||
+ * Historically anonymous inodes don't have a type at all and
|
||||
+ * userspace has come to rely on this.
|
||||
*/
|
||||
- inode->i_mode = S_IFREG | S_IRUSR | S_IWUSR;
|
||||
+ inode->i_mode = S_IRUSR | S_IWUSR;
|
||||
inode->i_uid = current_fsuid();
|
||||
inode->i_gid = current_fsgid();
|
||||
inode->i_flags |= S_PRIVATE | S_ANON_INODE;
|
||||
--- a/fs/namei.c
|
||||
+++ b/fs/namei.c
|
||||
@@ -3464,7 +3464,7 @@ static int may_open(struct mnt_idmap *id
|
||||
return -EACCES;
|
||||
break;
|
||||
default:
|
||||
- VFS_BUG_ON_INODE(1, inode);
|
||||
+ VFS_BUG_ON_INODE(!IS_ANON_FILE(inode), inode);
|
||||
}
|
||||
|
||||
error = inode_permission(idmap, inode, MAY_OPEN | acc_mode);
|
136
debian/patches/patchset-pf/fixes/0009-netfs-Provide-helpers-to-perform-NETFS_RREQ_IN_PROGR.patch
vendored
Normal file
136
debian/patches/patchset-pf/fixes/0009-netfs-Provide-helpers-to-perform-NETFS_RREQ_IN_PROGR.patch
vendored
Normal file
@@ -0,0 +1,136 @@
|
||||
From b885aa903c313644f7ba8d46d4c09ead1b52f1f1 Mon Sep 17 00:00:00 2001
|
||||
From: David Howells <dhowells@redhat.com>
|
||||
Date: Tue, 1 Jul 2025 17:38:38 +0100
|
||||
Subject: netfs: Provide helpers to perform NETFS_RREQ_IN_PROGRESS flag
|
||||
wangling
|
||||
|
||||
Provide helpers to clear and test the NETFS_RREQ_IN_PROGRESS and to insert
|
||||
the appropriate barrierage.
|
||||
|
||||
Signed-off-by: David Howells <dhowells@redhat.com>
|
||||
Link: https://lore.kernel.org/20250701163852.2171681-4-dhowells@redhat.com
|
||||
Tested-by: Steve French <sfrench@samba.org>
|
||||
Reviewed-by: Paulo Alcantara <pc@manguebit.org>
|
||||
cc: netfs@lists.linux.dev
|
||||
cc: linux-fsdevel@vger.kernel.org
|
||||
Signed-off-by: Christian Brauner <brauner@kernel.org>
|
||||
---
|
||||
fs/netfs/internal.h | 18 ++++++++++++++++++
|
||||
fs/netfs/misc.c | 10 +++++-----
|
||||
fs/netfs/read_collect.c | 4 ++--
|
||||
fs/netfs/write_collect.c | 4 ++--
|
||||
4 files changed, 27 insertions(+), 9 deletions(-)
|
||||
|
||||
--- a/fs/netfs/internal.h
|
||||
+++ b/fs/netfs/internal.h
|
||||
@@ -275,6 +275,24 @@ static inline void netfs_wake_rreq_flag(
|
||||
}
|
||||
|
||||
/*
|
||||
+ * Test the NETFS_RREQ_IN_PROGRESS flag, inserting an appropriate barrier.
|
||||
+ */
|
||||
+static inline bool netfs_check_rreq_in_progress(const struct netfs_io_request *rreq)
|
||||
+{
|
||||
+ /* Order read of flags before read of anything else, such as error. */
|
||||
+ return test_bit_acquire(NETFS_RREQ_IN_PROGRESS, &rreq->flags);
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Test the NETFS_SREQ_IN_PROGRESS flag, inserting an appropriate barrier.
|
||||
+ */
|
||||
+static inline bool netfs_check_subreq_in_progress(const struct netfs_io_subrequest *subreq)
|
||||
+{
|
||||
+ /* Order read of flags before read of anything else, such as error. */
|
||||
+ return test_bit_acquire(NETFS_SREQ_IN_PROGRESS, &subreq->flags);
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
* fscache-cache.c
|
||||
*/
|
||||
#ifdef CONFIG_PROC_FS
|
||||
--- a/fs/netfs/misc.c
|
||||
+++ b/fs/netfs/misc.c
|
||||
@@ -356,14 +356,14 @@ void netfs_wait_for_in_progress_stream(s
|
||||
DEFINE_WAIT(myself);
|
||||
|
||||
list_for_each_entry(subreq, &stream->subrequests, rreq_link) {
|
||||
- if (!test_bit(NETFS_SREQ_IN_PROGRESS, &subreq->flags))
|
||||
+ if (!netfs_check_subreq_in_progress(subreq))
|
||||
continue;
|
||||
|
||||
trace_netfs_rreq(rreq, netfs_rreq_trace_wait_queue);
|
||||
for (;;) {
|
||||
prepare_to_wait(&rreq->waitq, &myself, TASK_UNINTERRUPTIBLE);
|
||||
|
||||
- if (!test_bit(NETFS_SREQ_IN_PROGRESS, &subreq->flags))
|
||||
+ if (!netfs_check_subreq_in_progress(subreq))
|
||||
break;
|
||||
|
||||
trace_netfs_sreq(subreq, netfs_sreq_trace_wait_for);
|
||||
@@ -400,7 +400,7 @@ static int netfs_collect_in_app(struct n
|
||||
struct netfs_io_subrequest,
|
||||
rreq_link);
|
||||
if (subreq &&
|
||||
- (!test_bit(NETFS_SREQ_IN_PROGRESS, &subreq->flags) ||
|
||||
+ (!netfs_check_subreq_in_progress(subreq) ||
|
||||
test_bit(NETFS_SREQ_MADE_PROGRESS, &subreq->flags))) {
|
||||
need_collect = true;
|
||||
break;
|
||||
@@ -454,7 +454,7 @@ static ssize_t netfs_wait_for_in_progres
|
||||
}
|
||||
}
|
||||
|
||||
- if (!test_bit(NETFS_RREQ_IN_PROGRESS, &rreq->flags))
|
||||
+ if (!netfs_check_rreq_in_progress(rreq))
|
||||
break;
|
||||
|
||||
schedule();
|
||||
@@ -525,7 +525,7 @@ static void netfs_wait_for_pause(struct
|
||||
}
|
||||
}
|
||||
|
||||
- if (!test_bit(NETFS_RREQ_IN_PROGRESS, &rreq->flags) ||
|
||||
+ if (!netfs_check_rreq_in_progress(rreq) ||
|
||||
!test_bit(NETFS_RREQ_PAUSE, &rreq->flags))
|
||||
break;
|
||||
|
||||
--- a/fs/netfs/read_collect.c
|
||||
+++ b/fs/netfs/read_collect.c
|
||||
@@ -220,7 +220,7 @@ reassess:
|
||||
stream->collected_to = front->start;
|
||||
}
|
||||
|
||||
- if (test_bit(NETFS_SREQ_IN_PROGRESS, &front->flags))
|
||||
+ if (netfs_check_subreq_in_progress(front))
|
||||
notes |= HIT_PENDING;
|
||||
smp_rmb(); /* Read counters after IN_PROGRESS flag. */
|
||||
transferred = READ_ONCE(front->transferred);
|
||||
@@ -447,7 +447,7 @@ void netfs_read_collection_worker(struct
|
||||
struct netfs_io_request *rreq = container_of(work, struct netfs_io_request, work);
|
||||
|
||||
netfs_see_request(rreq, netfs_rreq_trace_see_work);
|
||||
- if (test_bit(NETFS_RREQ_IN_PROGRESS, &rreq->flags)) {
|
||||
+ if (netfs_check_rreq_in_progress(rreq)) {
|
||||
if (netfs_read_collection(rreq))
|
||||
/* Drop the ref from the IN_PROGRESS flag. */
|
||||
netfs_put_request(rreq, netfs_rreq_trace_put_work_ip);
|
||||
--- a/fs/netfs/write_collect.c
|
||||
+++ b/fs/netfs/write_collect.c
|
||||
@@ -240,7 +240,7 @@ reassess_streams:
|
||||
}
|
||||
|
||||
/* Stall if the front is still undergoing I/O. */
|
||||
- if (test_bit(NETFS_SREQ_IN_PROGRESS, &front->flags)) {
|
||||
+ if (netfs_check_subreq_in_progress(front)) {
|
||||
notes |= HIT_PENDING;
|
||||
break;
|
||||
}
|
||||
@@ -434,7 +434,7 @@ void netfs_write_collection_worker(struc
|
||||
struct netfs_io_request *rreq = container_of(work, struct netfs_io_request, work);
|
||||
|
||||
netfs_see_request(rreq, netfs_rreq_trace_see_work);
|
||||
- if (test_bit(NETFS_RREQ_IN_PROGRESS, &rreq->flags)) {
|
||||
+ if (netfs_check_rreq_in_progress(rreq)) {
|
||||
if (netfs_write_collection(rreq))
|
||||
/* Drop the ref from the IN_PROGRESS flag. */
|
||||
netfs_put_request(rreq, netfs_rreq_trace_put_work_ip);
|
@@ -1,77 +0,0 @@
|
||||
From 57fd039971b09ce2e6a442f822146099f72888c3 Mon Sep 17 00:00:00 2001
|
||||
From: Shyam Prasad N <sprasad@microsoft.com>
|
||||
Date: Mon, 30 Jun 2025 23:09:34 +0530
|
||||
Subject: cifs: all initializations for tcon should happen in tcon_info_alloc
|
||||
|
||||
Today, a few work structs inside tcon are initialized inside
|
||||
cifs_get_tcon and not in tcon_info_alloc. As a result, if a tcon
|
||||
is obtained from tcon_info_alloc, but not called as a part of
|
||||
cifs_get_tcon, we may trip over.
|
||||
|
||||
Cc: <stable@vger.kernel.org>
|
||||
Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
|
||||
Reviewed-by: Paulo Alcantara (Red Hat) <pc@manguebit.org>
|
||||
Signed-off-by: Steve French <stfrench@microsoft.com>
|
||||
---
|
||||
fs/smb/client/cifsproto.h | 1 +
|
||||
fs/smb/client/connect.c | 8 +-------
|
||||
fs/smb/client/misc.c | 6 ++++++
|
||||
3 files changed, 8 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/fs/smb/client/cifsproto.h
|
||||
+++ b/fs/smb/client/cifsproto.h
|
||||
@@ -136,6 +136,7 @@ extern int SendReceiveBlockingLock(const
|
||||
struct smb_hdr *out_buf,
|
||||
int *bytes_returned);
|
||||
|
||||
+void smb2_query_server_interfaces(struct work_struct *work);
|
||||
void
|
||||
cifs_signal_cifsd_for_reconnect(struct TCP_Server_Info *server,
|
||||
bool all_channels);
|
||||
--- a/fs/smb/client/connect.c
|
||||
+++ b/fs/smb/client/connect.c
|
||||
@@ -97,7 +97,7 @@ static int reconn_set_ipaddr_from_hostna
|
||||
return rc;
|
||||
}
|
||||
|
||||
-static void smb2_query_server_interfaces(struct work_struct *work)
|
||||
+void smb2_query_server_interfaces(struct work_struct *work)
|
||||
{
|
||||
int rc;
|
||||
int xid;
|
||||
@@ -2880,20 +2880,14 @@ cifs_get_tcon(struct cifs_ses *ses, stru
|
||||
tcon->max_cached_dirs = ctx->max_cached_dirs;
|
||||
tcon->nodelete = ctx->nodelete;
|
||||
tcon->local_lease = ctx->local_lease;
|
||||
- INIT_LIST_HEAD(&tcon->pending_opens);
|
||||
tcon->status = TID_GOOD;
|
||||
|
||||
- INIT_DELAYED_WORK(&tcon->query_interfaces,
|
||||
- smb2_query_server_interfaces);
|
||||
if (ses->server->dialect >= SMB30_PROT_ID &&
|
||||
(ses->server->capabilities & SMB2_GLOBAL_CAP_MULTI_CHANNEL)) {
|
||||
/* schedule query interfaces poll */
|
||||
queue_delayed_work(cifsiod_wq, &tcon->query_interfaces,
|
||||
(SMB_INTERFACE_POLL_INTERVAL * HZ));
|
||||
}
|
||||
-#ifdef CONFIG_CIFS_DFS_UPCALL
|
||||
- INIT_DELAYED_WORK(&tcon->dfs_cache_work, dfs_cache_refresh);
|
||||
-#endif
|
||||
spin_lock(&cifs_tcp_ses_lock);
|
||||
list_add(&tcon->tcon_list, &ses->tcon_list);
|
||||
spin_unlock(&cifs_tcp_ses_lock);
|
||||
--- a/fs/smb/client/misc.c
|
||||
+++ b/fs/smb/client/misc.c
|
||||
@@ -151,6 +151,12 @@ tcon_info_alloc(bool dir_leases_enabled,
|
||||
#ifdef CONFIG_CIFS_DFS_UPCALL
|
||||
INIT_LIST_HEAD(&ret_buf->dfs_ses_list);
|
||||
#endif
|
||||
+ INIT_LIST_HEAD(&ret_buf->pending_opens);
|
||||
+ INIT_DELAYED_WORK(&ret_buf->query_interfaces,
|
||||
+ smb2_query_server_interfaces);
|
||||
+#ifdef CONFIG_CIFS_DFS_UPCALL
|
||||
+ INIT_DELAYED_WORK(&ret_buf->dfs_cache_work, dfs_cache_refresh);
|
||||
+#endif
|
||||
|
||||
return ret_buf;
|
||||
}
|
Reference in New Issue
Block a user