From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: stable@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
patches@lists.linux.dev, Namjae Jeon <linkinjeon@kernel.org>,
Steve French <stfrench@microsoft.com>,
Sasha Levin <sashal@kernel.org>
Subject: [PATCH 6.3 093/199] ksmbd: fix racy issue from using ->d_parent and ->d_name
Date: Mon, 26 Jun 2023 20:09:59 +0200 [thread overview]
Message-ID: <20230626180809.694570348@linuxfoundation.org> (raw)
In-Reply-To: <20230626180805.643662628@linuxfoundation.org>
From: Namjae Jeon <linkinjeon@kernel.org>
[ Upstream commit 74d7970febf7e9005375aeda0df821d2edffc9f7 ]
Al pointed out that ksmbd has racy issue from using ->d_parent and ->d_name
in ksmbd_vfs_unlink and smb2_vfs_rename(). and use new lock_rename_child()
to lock stable parent while underlying rename racy.
Introduce vfs_path_parent_lookup helper to avoid out of share access and
export vfs functions like the following ones to use
vfs_path_parent_lookup().
- rename __lookup_hash() to lookup_one_qstr_excl().
- export lookup_one_qstr_excl().
- export getname_kernel() and putname().
vfs_path_parent_lookup() is used for parent lookup of destination file
using absolute pathname given from FILE_RENAME_INFORMATION request.
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
Stable-dep-of: 40b268d384a2 ("ksmbd: add mnt_want_write to ksmbd vfs functions")
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
fs/ksmbd/smb2pdu.c | 147 ++++----------
fs/ksmbd/vfs.c | 435 ++++++++++++++++++------------------------
fs/ksmbd/vfs.h | 19 +-
fs/ksmbd/vfs_cache.c | 5 +-
fs/namei.c | 57 ++++--
include/linux/namei.h | 6 +
6 files changed, 283 insertions(+), 386 deletions(-)
diff --git a/fs/ksmbd/smb2pdu.c b/fs/ksmbd/smb2pdu.c
index 36843bef05c5f..06a335356e373 100644
--- a/fs/ksmbd/smb2pdu.c
+++ b/fs/ksmbd/smb2pdu.c
@@ -2515,7 +2515,7 @@ static int smb2_creat(struct ksmbd_work *work, struct path *path, char *name,
return rc;
}
- rc = ksmbd_vfs_kern_path(work, name, 0, path, 0);
+ rc = ksmbd_vfs_kern_path_locked(work, name, 0, path, 0);
if (rc) {
pr_err("cannot get linux path (%s), err = %d\n",
name, rc);
@@ -2806,8 +2806,10 @@ int smb2_open(struct ksmbd_work *work)
goto err_out1;
}
- rc = ksmbd_vfs_kern_path(work, name, LOOKUP_NO_SYMLINKS, &path, 1);
+ rc = ksmbd_vfs_kern_path_locked(work, name, LOOKUP_NO_SYMLINKS, &path, 1);
if (!rc) {
+ file_present = true;
+
if (req->CreateOptions & FILE_DELETE_ON_CLOSE_LE) {
/*
* If file exists with under flags, return access
@@ -2816,7 +2818,6 @@ int smb2_open(struct ksmbd_work *work)
if (req->CreateDisposition == FILE_OVERWRITE_IF_LE ||
req->CreateDisposition == FILE_OPEN_IF_LE) {
rc = -EACCES;
- path_put(&path);
goto err_out;
}
@@ -2824,26 +2825,23 @@ int smb2_open(struct ksmbd_work *work)
ksmbd_debug(SMB,
"User does not have write permission\n");
rc = -EACCES;
- path_put(&path);
goto err_out;
}
} else if (d_is_symlink(path.dentry)) {
rc = -EACCES;
- path_put(&path);
goto err_out;
}
- }
- if (rc) {
+ file_present = true;
+ idmap = mnt_idmap(path.mnt);
+ } else {
if (rc != -ENOENT)
goto err_out;
ksmbd_debug(SMB, "can not get linux path for %s, rc = %d\n",
name, rc);
rc = 0;
- } else {
- file_present = true;
- idmap = mnt_idmap(path.mnt);
}
+
if (stream_name) {
if (req->CreateOptions & FILE_DIRECTORY_FILE_LE) {
if (s_type == DATA_STREAM) {
@@ -2971,8 +2969,9 @@ int smb2_open(struct ksmbd_work *work)
if ((daccess & FILE_DELETE_LE) ||
(req->CreateOptions & FILE_DELETE_ON_CLOSE_LE)) {
- rc = ksmbd_vfs_may_delete(idmap,
- path.dentry);
+ rc = inode_permission(idmap,
+ d_inode(path.dentry->d_parent),
+ MAY_EXEC | MAY_WRITE);
if (rc)
goto err_out;
}
@@ -3343,10 +3342,13 @@ int smb2_open(struct ksmbd_work *work)
}
err_out:
- if (file_present || created)
- path_put(&path);
+ if (file_present || created) {
+ inode_unlock(d_inode(path.dentry->d_parent));
+ dput(path.dentry);
+ }
ksmbd_revert_fsids(work);
err_out1:
+
if (rc) {
if (rc == -EINVAL)
rsp->hdr.Status = STATUS_INVALID_PARAMETER;
@@ -5485,44 +5487,19 @@ int smb2_echo(struct ksmbd_work *work)
static int smb2_rename(struct ksmbd_work *work,
struct ksmbd_file *fp,
- struct mnt_idmap *idmap,
struct smb2_file_rename_info *file_info,
struct nls_table *local_nls)
{
struct ksmbd_share_config *share = fp->tcon->share_conf;
- char *new_name = NULL, *abs_oldname = NULL, *old_name = NULL;
- char *pathname = NULL;
- struct path path;
- bool file_present = true;
- int rc;
+ char *new_name = NULL;
+ int rc, flags = 0;
ksmbd_debug(SMB, "setting FILE_RENAME_INFO\n");
- pathname = kmalloc(PATH_MAX, GFP_KERNEL);
- if (!pathname)
- return -ENOMEM;
-
- abs_oldname = file_path(fp->filp, pathname, PATH_MAX);
- if (IS_ERR(abs_oldname)) {
- rc = -EINVAL;
- goto out;
- }
- old_name = strrchr(abs_oldname, '/');
- if (old_name && old_name[1] != '\0') {
- old_name++;
- } else {
- ksmbd_debug(SMB, "can't get last component in path %s\n",
- abs_oldname);
- rc = -ENOENT;
- goto out;
- }
-
new_name = smb2_get_name(file_info->FileName,
le32_to_cpu(file_info->FileNameLength),
local_nls);
- if (IS_ERR(new_name)) {
- rc = PTR_ERR(new_name);
- goto out;
- }
+ if (IS_ERR(new_name))
+ return PTR_ERR(new_name);
if (strchr(new_name, ':')) {
int s_type;
@@ -5548,7 +5525,7 @@ static int smb2_rename(struct ksmbd_work *work,
if (rc)
goto out;
- rc = ksmbd_vfs_setxattr(idmap,
+ rc = ksmbd_vfs_setxattr(file_mnt_idmap(fp->filp),
fp->filp->f_path.dentry,
xattr_stream_name,
NULL, 0, 0);
@@ -5563,47 +5540,18 @@ static int smb2_rename(struct ksmbd_work *work,
}
ksmbd_debug(SMB, "new name %s\n", new_name);
- rc = ksmbd_vfs_kern_path(work, new_name, LOOKUP_NO_SYMLINKS, &path, 1);
- if (rc) {
- if (rc != -ENOENT)
- goto out;
- file_present = false;
- } else {
- path_put(&path);
- }
-
if (ksmbd_share_veto_filename(share, new_name)) {
rc = -ENOENT;
ksmbd_debug(SMB, "Can't rename vetoed file: %s\n", new_name);
goto out;
}
- if (file_info->ReplaceIfExists) {
- if (file_present) {
- rc = ksmbd_vfs_remove_file(work, new_name);
- if (rc) {
- if (rc != -ENOTEMPTY)
- rc = -EINVAL;
- ksmbd_debug(SMB, "cannot delete %s, rc %d\n",
- new_name, rc);
- goto out;
- }
- }
- } else {
- if (file_present &&
- strncmp(old_name, path.dentry->d_name.name, strlen(old_name))) {
- rc = -EEXIST;
- ksmbd_debug(SMB,
- "cannot rename already existing file\n");
- goto out;
- }
- }
+ if (!file_info->ReplaceIfExists)
+ flags = RENAME_NOREPLACE;
- rc = ksmbd_vfs_fp_rename(work, fp, new_name);
+ rc = ksmbd_vfs_rename(work, &fp->filp->f_path, new_name, flags);
out:
- kfree(pathname);
- if (!IS_ERR(new_name))
- kfree(new_name);
+ kfree(new_name);
return rc;
}
@@ -5643,18 +5591,17 @@ static int smb2_create_link(struct ksmbd_work *work,
}
ksmbd_debug(SMB, "target name is %s\n", target_name);
- rc = ksmbd_vfs_kern_path(work, link_name, LOOKUP_NO_SYMLINKS, &path, 0);
+ rc = ksmbd_vfs_kern_path_locked(work, link_name, LOOKUP_NO_SYMLINKS,
+ &path, 0);
if (rc) {
if (rc != -ENOENT)
goto out;
file_present = false;
- } else {
- path_put(&path);
}
if (file_info->ReplaceIfExists) {
if (file_present) {
- rc = ksmbd_vfs_remove_file(work, link_name);
+ rc = ksmbd_vfs_remove_file(work, &path);
if (rc) {
rc = -EINVAL;
ksmbd_debug(SMB, "cannot delete %s\n",
@@ -5674,6 +5621,10 @@ static int smb2_create_link(struct ksmbd_work *work,
if (rc)
rc = -EINVAL;
out:
+ if (file_present) {
+ inode_unlock(d_inode(path.dentry->d_parent));
+ path_put(&path);
+ }
if (!IS_ERR(link_name))
kfree(link_name);
kfree(pathname);
@@ -5851,12 +5802,6 @@ static int set_rename_info(struct ksmbd_work *work, struct ksmbd_file *fp,
struct smb2_file_rename_info *rename_info,
unsigned int buf_len)
{
- struct mnt_idmap *idmap;
- struct ksmbd_file *parent_fp;
- struct dentry *parent;
- struct dentry *dentry = fp->filp->f_path.dentry;
- int ret;
-
if (!(fp->daccess & FILE_DELETE_LE)) {
pr_err("no right to delete : 0x%x\n", fp->daccess);
return -EACCES;
@@ -5866,32 +5811,10 @@ static int set_rename_info(struct ksmbd_work *work, struct ksmbd_file *fp,
le32_to_cpu(rename_info->FileNameLength))
return -EINVAL;
- idmap = file_mnt_idmap(fp->filp);
- if (ksmbd_stream_fd(fp))
- goto next;
-
- parent = dget_parent(dentry);
- ret = ksmbd_vfs_lock_parent(idmap, parent, dentry);
- if (ret) {
- dput(parent);
- return ret;
- }
-
- parent_fp = ksmbd_lookup_fd_inode(d_inode(parent));
- inode_unlock(d_inode(parent));
- dput(parent);
+ if (!le32_to_cpu(rename_info->FileNameLength))
+ return -EINVAL;
- if (parent_fp) {
- if (parent_fp->daccess & FILE_DELETE_LE) {
- pr_err("parent dir is opened with delete access\n");
- ksmbd_fd_put(work, parent_fp);
- return -ESHARE;
- }
- ksmbd_fd_put(work, parent_fp);
- }
-next:
- return smb2_rename(work, fp, idmap, rename_info,
- work->conn->local_nls);
+ return smb2_rename(work, fp, rename_info, work->conn->local_nls);
}
static int set_file_disposition_info(struct ksmbd_file *fp,
diff --git a/fs/ksmbd/vfs.c b/fs/ksmbd/vfs.c
index 1ad97df1dfb6f..448c442ad3f49 100644
--- a/fs/ksmbd/vfs.c
+++ b/fs/ksmbd/vfs.c
@@ -18,6 +18,7 @@
#include <linux/vmalloc.h>
#include <linux/sched/xacct.h>
#include <linux/crc32c.h>
+#include <linux/namei.h>
#include "glob.h"
#include "oplock.h"
@@ -35,19 +36,6 @@
#include "mgmt/user_session.h"
#include "mgmt/user_config.h"
-static char *extract_last_component(char *path)
-{
- char *p = strrchr(path, '/');
-
- if (p && p[1] != '\0') {
- *p = '\0';
- p++;
- } else {
- p = NULL;
- }
- return p;
-}
-
static void ksmbd_vfs_inherit_owner(struct ksmbd_work *work,
struct inode *parent_inode,
struct inode *inode)
@@ -61,65 +49,77 @@ static void ksmbd_vfs_inherit_owner(struct ksmbd_work *work,
/**
* ksmbd_vfs_lock_parent() - lock parent dentry if it is stable
- *
- * the parent dentry got by dget_parent or @parent could be
- * unstable, we try to lock a parent inode and lookup the
- * child dentry again.
- *
- * the reference count of @parent isn't incremented.
*/
-int ksmbd_vfs_lock_parent(struct mnt_idmap *idmap, struct dentry *parent,
- struct dentry *child)
+int ksmbd_vfs_lock_parent(struct dentry *parent, struct dentry *child)
{
- struct dentry *dentry;
- int ret = 0;
-
inode_lock_nested(d_inode(parent), I_MUTEX_PARENT);
- dentry = lookup_one(idmap, child->d_name.name, parent,
- child->d_name.len);
- if (IS_ERR(dentry)) {
- ret = PTR_ERR(dentry);
- goto out_err;
- }
-
- if (dentry != child) {
- ret = -ESTALE;
- dput(dentry);
- goto out_err;
+ if (child->d_parent != parent) {
+ inode_unlock(d_inode(parent));
+ return -ENOENT;
}
- dput(dentry);
return 0;
-out_err:
- inode_unlock(d_inode(parent));
- return ret;
}
-int ksmbd_vfs_may_delete(struct mnt_idmap *idmap,
- struct dentry *dentry)
+static int ksmbd_vfs_path_lookup_locked(struct ksmbd_share_config *share_conf,
+ char *pathname, unsigned int flags,
+ struct path *path)
{
- struct dentry *parent;
- int ret;
+ struct qstr last;
+ struct filename *filename;
+ struct path *root_share_path = &share_conf->vfs_path;
+ int err, type;
+ struct path parent_path;
+ struct dentry *d;
+
+ if (pathname[0] == '\0') {
+ pathname = share_conf->path;
+ root_share_path = NULL;
+ } else {
+ flags |= LOOKUP_BENEATH;
+ }
- parent = dget_parent(dentry);
- ret = ksmbd_vfs_lock_parent(idmap, parent, dentry);
- if (ret) {
- dput(parent);
- return ret;
+ filename = getname_kernel(pathname);
+ if (IS_ERR(filename))
+ return PTR_ERR(filename);
+
+ err = vfs_path_parent_lookup(filename, flags,
+ &parent_path, &last, &type,
+ root_share_path);
+ putname(filename);
+ if (err)
+ return err;
+
+ if (unlikely(type != LAST_NORM)) {
+ path_put(&parent_path);
+ return -ENOENT;
}
- ret = inode_permission(idmap, d_inode(parent),
- MAY_EXEC | MAY_WRITE);
+ inode_lock_nested(parent_path.dentry->d_inode, I_MUTEX_PARENT);
+ d = lookup_one_qstr_excl(&last, parent_path.dentry, 0);
+ if (IS_ERR(d))
+ goto err_out;
- inode_unlock(d_inode(parent));
- dput(parent);
- return ret;
+ if (d_is_negative(d)) {
+ dput(d);
+ goto err_out;
+ }
+
+ path->dentry = d;
+ path->mnt = share_conf->vfs_path.mnt;
+ path_put(&parent_path);
+
+ return 0;
+
+err_out:
+ inode_unlock(parent_path.dentry->d_inode);
+ path_put(&parent_path);
+ return -ENOENT;
}
int ksmbd_vfs_query_maximal_access(struct mnt_idmap *idmap,
struct dentry *dentry, __le32 *daccess)
{
- struct dentry *parent;
int ret = 0;
*daccess = cpu_to_le32(FILE_READ_ATTRIBUTES | READ_CONTROL);
@@ -136,18 +136,9 @@ int ksmbd_vfs_query_maximal_access(struct mnt_idmap *idmap,
if (!inode_permission(idmap, d_inode(dentry), MAY_OPEN | MAY_EXEC))
*daccess |= FILE_EXECUTE_LE;
- parent = dget_parent(dentry);
- ret = ksmbd_vfs_lock_parent(idmap, parent, dentry);
- if (ret) {
- dput(parent);
- return ret;
- }
-
- if (!inode_permission(idmap, d_inode(parent), MAY_EXEC | MAY_WRITE))
+ if (!inode_permission(idmap, d_inode(dentry->d_parent), MAY_EXEC | MAY_WRITE))
*daccess |= FILE_DELETE_LE;
- inode_unlock(d_inode(parent));
- dput(parent);
return ret;
}
@@ -580,54 +571,32 @@ int ksmbd_vfs_fsync(struct ksmbd_work *work, u64 fid, u64 p_id)
*
* Return: 0 on success, otherwise error
*/
-int ksmbd_vfs_remove_file(struct ksmbd_work *work, char *name)
+int ksmbd_vfs_remove_file(struct ksmbd_work *work, const struct path *path)
{
struct mnt_idmap *idmap;
- struct path path;
- struct dentry *parent;
+ struct dentry *parent = path->dentry->d_parent;
int err;
if (ksmbd_override_fsids(work))
return -ENOMEM;
- err = ksmbd_vfs_kern_path(work, name, LOOKUP_NO_SYMLINKS, &path, false);
- if (err) {
- ksmbd_debug(VFS, "can't get %s, err %d\n", name, err);
- ksmbd_revert_fsids(work);
- return err;
- }
-
- idmap = mnt_idmap(path.mnt);
- parent = dget_parent(path.dentry);
- err = ksmbd_vfs_lock_parent(idmap, parent, path.dentry);
- if (err) {
- dput(parent);
- path_put(&path);
- ksmbd_revert_fsids(work);
- return err;
- }
-
- if (!d_inode(path.dentry)->i_nlink) {
+ if (!d_inode(path->dentry)->i_nlink) {
err = -ENOENT;
goto out_err;
}
- if (S_ISDIR(d_inode(path.dentry)->i_mode)) {
- err = vfs_rmdir(idmap, d_inode(parent), path.dentry);
+ idmap = mnt_idmap(path->mnt);
+ if (S_ISDIR(d_inode(path->dentry)->i_mode)) {
+ err = vfs_rmdir(idmap, d_inode(parent), path->dentry);
if (err && err != -ENOTEMPTY)
- ksmbd_debug(VFS, "%s: rmdir failed, err %d\n", name,
- err);
+ ksmbd_debug(VFS, "rmdir failed, err %d\n", err);
} else {
- err = vfs_unlink(idmap, d_inode(parent), path.dentry, NULL);
+ err = vfs_unlink(idmap, d_inode(parent), path->dentry, NULL);
if (err)
- ksmbd_debug(VFS, "%s: unlink failed, err %d\n", name,
- err);
+ ksmbd_debug(VFS, "unlink failed, err %d\n", err);
}
out_err:
- inode_unlock(d_inode(parent));
- dput(parent);
- path_put(&path);
ksmbd_revert_fsids(work);
return err;
}
@@ -686,149 +655,114 @@ int ksmbd_vfs_link(struct ksmbd_work *work, const char *oldname,
return err;
}
-static int ksmbd_validate_entry_in_use(struct dentry *src_dent)
+int ksmbd_vfs_rename(struct ksmbd_work *work, const struct path *old_path,
+ char *newname, int flags)
{
- struct dentry *dst_dent;
-
- spin_lock(&src_dent->d_lock);
- list_for_each_entry(dst_dent, &src_dent->d_subdirs, d_child) {
- struct ksmbd_file *child_fp;
+ struct dentry *old_parent, *new_dentry, *trap;
+ struct dentry *old_child = old_path->dentry;
+ struct path new_path;
+ struct qstr new_last;
+ struct renamedata rd;
+ struct filename *to;
+ struct ksmbd_share_config *share_conf = work->tcon->share_conf;
+ struct ksmbd_file *parent_fp;
+ int new_type;
+ int err, lookup_flags = LOOKUP_NO_SYMLINKS;
- if (d_really_is_negative(dst_dent))
- continue;
+ if (ksmbd_override_fsids(work))
+ return -ENOMEM;
- child_fp = ksmbd_lookup_fd_inode(d_inode(dst_dent));
- if (child_fp) {
- spin_unlock(&src_dent->d_lock);
- ksmbd_debug(VFS, "Forbid rename, sub file/dir is in use\n");
- return -EACCES;
- }
+ to = getname_kernel(newname);
+ if (IS_ERR(to)) {
+ err = PTR_ERR(to);
+ goto revert_fsids;
}
- spin_unlock(&src_dent->d_lock);
- return 0;
-}
+retry:
+ err = vfs_path_parent_lookup(to, lookup_flags | LOOKUP_BENEATH,
+ &new_path, &new_last, &new_type,
+ &share_conf->vfs_path);
+ if (err)
+ goto out1;
-static int __ksmbd_vfs_rename(struct ksmbd_work *work,
- struct mnt_idmap *src_idmap,
- struct dentry *src_dent_parent,
- struct dentry *src_dent,
- struct mnt_idmap *dst_idmap,
- struct dentry *dst_dent_parent,
- struct dentry *trap_dent,
- char *dst_name)
-{
- struct dentry *dst_dent;
- int err;
+ if (old_path->mnt != new_path.mnt) {
+ err = -EXDEV;
+ goto out2;
+ }
- if (!work->tcon->posix_extensions) {
- err = ksmbd_validate_entry_in_use(src_dent);
- if (err)
- return err;
+ trap = lock_rename_child(old_child, new_path.dentry);
+
+ old_parent = dget(old_child->d_parent);
+ if (d_unhashed(old_child)) {
+ err = -EINVAL;
+ goto out3;
}
- if (d_really_is_negative(src_dent_parent))
- return -ENOENT;
- if (d_really_is_negative(dst_dent_parent))
- return -ENOENT;
- if (d_really_is_negative(src_dent))
- return -ENOENT;
- if (src_dent == trap_dent)
- return -EINVAL;
+ parent_fp = ksmbd_lookup_fd_inode(d_inode(old_child->d_parent));
+ if (parent_fp) {
+ if (parent_fp->daccess & FILE_DELETE_LE) {
+ pr_err("parent dir is opened with delete access\n");
+ err = -ESHARE;
+ ksmbd_fd_put(work, parent_fp);
+ goto out3;
+ }
+ ksmbd_fd_put(work, parent_fp);
+ }
- if (ksmbd_override_fsids(work))
- return -ENOMEM;
+ new_dentry = lookup_one_qstr_excl(&new_last, new_path.dentry,
+ lookup_flags | LOOKUP_RENAME_TARGET);
+ if (IS_ERR(new_dentry)) {
+ err = PTR_ERR(new_dentry);
+ goto out3;
+ }
- dst_dent = lookup_one(dst_idmap, dst_name,
- dst_dent_parent, strlen(dst_name));
- err = PTR_ERR(dst_dent);
- if (IS_ERR(dst_dent)) {
- pr_err("lookup failed %s [%d]\n", dst_name, err);
- goto out;
+ if (d_is_symlink(new_dentry)) {
+ err = -EACCES;
+ goto out4;
}
- err = -ENOTEMPTY;
- if (dst_dent != trap_dent && !d_really_is_positive(dst_dent)) {
- struct renamedata rd = {
- .old_mnt_idmap = src_idmap,
- .old_dir = d_inode(src_dent_parent),
- .old_dentry = src_dent,
- .new_mnt_idmap = dst_idmap,
- .new_dir = d_inode(dst_dent_parent),
- .new_dentry = dst_dent,
- };
- err = vfs_rename(&rd);
+ if ((flags & RENAME_NOREPLACE) && d_is_positive(new_dentry)) {
+ err = -EEXIST;
+ goto out4;
}
- if (err)
- pr_err("vfs_rename failed err %d\n", err);
- if (dst_dent)
- dput(dst_dent);
-out:
- ksmbd_revert_fsids(work);
- return err;
-}
-int ksmbd_vfs_fp_rename(struct ksmbd_work *work, struct ksmbd_file *fp,
- char *newname)
-{
- struct mnt_idmap *idmap;
- struct path dst_path;
- struct dentry *src_dent_parent, *dst_dent_parent;
- struct dentry *src_dent, *trap_dent, *src_child;
- char *dst_name;
- int err;
+ if (old_child == trap) {
+ err = -EINVAL;
+ goto out4;
+ }
- dst_name = extract_last_component(newname);
- if (!dst_name) {
- dst_name = newname;
- newname = "";
+ if (new_dentry == trap) {
+ err = -ENOTEMPTY;
+ goto out4;
}
- src_dent_parent = dget_parent(fp->filp->f_path.dentry);
- src_dent = fp->filp->f_path.dentry;
+ rd.old_mnt_idmap = mnt_idmap(old_path->mnt),
+ rd.old_dir = d_inode(old_parent),
+ rd.old_dentry = old_child,
+ rd.new_mnt_idmap = mnt_idmap(new_path.mnt),
+ rd.new_dir = new_path.dentry->d_inode,
+ rd.new_dentry = new_dentry,
+ rd.flags = flags,
+ err = vfs_rename(&rd);
+ if (err)
+ ksmbd_debug(VFS, "vfs_rename failed err %d\n", err);
- err = ksmbd_vfs_kern_path(work, newname,
- LOOKUP_NO_SYMLINKS | LOOKUP_DIRECTORY,
- &dst_path, false);
- if (err) {
- ksmbd_debug(VFS, "Cannot get path for %s [%d]\n", newname, err);
- goto out;
+out4:
+ dput(new_dentry);
+out3:
+ dput(old_parent);
+ unlock_rename(old_parent, new_path.dentry);
+out2:
+ path_put(&new_path);
+
+ if (retry_estale(err, lookup_flags)) {
+ lookup_flags |= LOOKUP_REVAL;
+ goto retry;
}
- dst_dent_parent = dst_path.dentry;
-
- trap_dent = lock_rename(src_dent_parent, dst_dent_parent);
- dget(src_dent);
- dget(dst_dent_parent);
- idmap = file_mnt_idmap(fp->filp);
- src_child = lookup_one(idmap, src_dent->d_name.name, src_dent_parent,
- src_dent->d_name.len);
- if (IS_ERR(src_child)) {
- err = PTR_ERR(src_child);
- goto out_lock;
- }
-
- if (src_child != src_dent) {
- err = -ESTALE;
- dput(src_child);
- goto out_lock;
- }
- dput(src_child);
-
- err = __ksmbd_vfs_rename(work,
- idmap,
- src_dent_parent,
- src_dent,
- mnt_idmap(dst_path.mnt),
- dst_dent_parent,
- trap_dent,
- dst_name);
-out_lock:
- dput(src_dent);
- dput(dst_dent_parent);
- unlock_rename(src_dent_parent, dst_dent_parent);
- path_put(&dst_path);
-out:
- dput(src_dent_parent);
+out1:
+ putname(to);
+revert_fsids:
+ ksmbd_revert_fsids(work);
return err;
}
@@ -1079,14 +1013,16 @@ int ksmbd_vfs_remove_xattr(struct mnt_idmap *idmap,
return vfs_removexattr(idmap, dentry, attr_name);
}
-int ksmbd_vfs_unlink(struct mnt_idmap *idmap,
- struct dentry *dir, struct dentry *dentry)
+int ksmbd_vfs_unlink(struct file *filp)
{
int err = 0;
+ struct dentry *dir, *dentry = filp->f_path.dentry;
+ struct mnt_idmap *idmap = file_mnt_idmap(filp);
- err = ksmbd_vfs_lock_parent(idmap, dir, dentry);
+ dir = dget_parent(dentry);
+ err = ksmbd_vfs_lock_parent(dir, dentry);
if (err)
- return err;
+ goto out;
dget(dentry);
if (S_ISDIR(d_inode(dentry)->i_mode))
@@ -1098,6 +1034,8 @@ int ksmbd_vfs_unlink(struct mnt_idmap *idmap,
inode_unlock(d_inode(dir));
if (err)
ksmbd_debug(VFS, "failed to delete, err %d\n", err);
+out:
+ dput(dir);
return err;
}
@@ -1200,7 +1138,7 @@ static int ksmbd_vfs_lookup_in_dir(const struct path *dir, char *name,
}
/**
- * ksmbd_vfs_kern_path() - lookup a file and get path info
+ * ksmbd_vfs_kern_path_locked() - lookup a file and get path info
* @name: file path that is relative to share
* @flags: lookup flags
* @path: if lookup succeed, return path info
@@ -1208,24 +1146,20 @@ static int ksmbd_vfs_lookup_in_dir(const struct path *dir, char *name,
*
* Return: 0 on success, otherwise error
*/
-int ksmbd_vfs_kern_path(struct ksmbd_work *work, char *name,
- unsigned int flags, struct path *path, bool caseless)
+int ksmbd_vfs_kern_path_locked(struct ksmbd_work *work, char *name,
+ unsigned int flags, struct path *path,
+ bool caseless)
{
struct ksmbd_share_config *share_conf = work->tcon->share_conf;
int err;
+ struct path parent_path;
- flags |= LOOKUP_BENEATH;
- err = vfs_path_lookup(share_conf->vfs_path.dentry,
- share_conf->vfs_path.mnt,
- name,
- flags,
- path);
+ err = ksmbd_vfs_path_lookup_locked(share_conf, name, flags, path);
if (!err)
- return 0;
+ return err;
if (caseless) {
char *filepath;
- struct path parent;
size_t path_len, remain_len;
filepath = kstrdup(name, GFP_KERNEL);
@@ -1235,10 +1169,10 @@ int ksmbd_vfs_kern_path(struct ksmbd_work *work, char *name,
path_len = strlen(filepath);
remain_len = path_len;
- parent = share_conf->vfs_path;
- path_get(&parent);
+ parent_path = share_conf->vfs_path;
+ path_get(&parent_path);
- while (d_can_lookup(parent.dentry)) {
+ while (d_can_lookup(parent_path.dentry)) {
char *filename = filepath + path_len - remain_len;
char *next = strchrnul(filename, '/');
size_t filename_len = next - filename;
@@ -1247,12 +1181,11 @@ int ksmbd_vfs_kern_path(struct ksmbd_work *work, char *name,
if (filename_len == 0)
break;
- err = ksmbd_vfs_lookup_in_dir(&parent, filename,
+ err = ksmbd_vfs_lookup_in_dir(&parent_path, filename,
filename_len,
work->conn->um);
- path_put(&parent);
if (err)
- goto out;
+ goto out2;
next[0] = '\0';
@@ -1260,23 +1193,31 @@ int ksmbd_vfs_kern_path(struct ksmbd_work *work, char *name,
share_conf->vfs_path.mnt,
filepath,
flags,
- &parent);
+ path);
if (err)
- goto out;
- else if (is_last) {
- *path = parent;
- goto out;
- }
+ goto out2;
+ else if (is_last)
+ goto out1;
+ path_put(&parent_path);
+ parent_path = *path;
next[0] = '/';
remain_len -= filename_len + 1;
}
- path_put(&parent);
err = -EINVAL;
-out:
+out2:
+ path_put(&parent_path);
+out1:
kfree(filepath);
}
+
+ if (!err) {
+ err = ksmbd_vfs_lock_parent(parent_path.dentry, path->dentry);
+ if (err)
+ dput(path->dentry);
+ path_put(&parent_path);
+ }
return err;
}
diff --git a/fs/ksmbd/vfs.h b/fs/ksmbd/vfs.h
index 9d676ab0cd25b..a4ae89f3230de 100644
--- a/fs/ksmbd/vfs.h
+++ b/fs/ksmbd/vfs.h
@@ -71,9 +71,7 @@ struct ksmbd_kstat {
__le32 file_attributes;
};
-int ksmbd_vfs_lock_parent(struct mnt_idmap *idmap, struct dentry *parent,
- struct dentry *child);
-int ksmbd_vfs_may_delete(struct mnt_idmap *idmap, struct dentry *dentry);
+int ksmbd_vfs_lock_parent(struct dentry *parent, struct dentry *child);
int ksmbd_vfs_query_maximal_access(struct mnt_idmap *idmap,
struct dentry *dentry, __le32 *daccess);
int ksmbd_vfs_create(struct ksmbd_work *work, const char *name, umode_t mode);
@@ -84,12 +82,12 @@ int ksmbd_vfs_write(struct ksmbd_work *work, struct ksmbd_file *fp,
char *buf, size_t count, loff_t *pos, bool sync,
ssize_t *written);
int ksmbd_vfs_fsync(struct ksmbd_work *work, u64 fid, u64 p_id);
-int ksmbd_vfs_remove_file(struct ksmbd_work *work, char *name);
+int ksmbd_vfs_remove_file(struct ksmbd_work *work, const struct path *path);
int ksmbd_vfs_link(struct ksmbd_work *work,
const char *oldname, const char *newname);
int ksmbd_vfs_getattr(const struct path *path, struct kstat *stat);
-int ksmbd_vfs_fp_rename(struct ksmbd_work *work, struct ksmbd_file *fp,
- char *newname);
+int ksmbd_vfs_rename(struct ksmbd_work *work, const struct path *old_path,
+ char *newname, int flags);
int ksmbd_vfs_truncate(struct ksmbd_work *work,
struct ksmbd_file *fp, loff_t size);
struct srv_copychunk;
@@ -116,9 +114,9 @@ int ksmbd_vfs_xattr_stream_name(char *stream_name, char **xattr_stream_name,
size_t *xattr_stream_name_size, int s_type);
int ksmbd_vfs_remove_xattr(struct mnt_idmap *idmap,
struct dentry *dentry, char *attr_name);
-int ksmbd_vfs_kern_path(struct ksmbd_work *work,
- char *name, unsigned int flags, struct path *path,
- bool caseless);
+int ksmbd_vfs_kern_path_locked(struct ksmbd_work *work, char *name,
+ unsigned int flags, struct path *path,
+ bool caseless);
struct dentry *ksmbd_vfs_kern_path_create(struct ksmbd_work *work,
const char *name,
unsigned int flags,
@@ -131,8 +129,7 @@ struct file_allocated_range_buffer;
int ksmbd_vfs_fqar_lseek(struct ksmbd_file *fp, loff_t start, loff_t length,
struct file_allocated_range_buffer *ranges,
unsigned int in_count, unsigned int *out_count);
-int ksmbd_vfs_unlink(struct mnt_idmap *idmap, struct dentry *dir,
- struct dentry *dentry);
+int ksmbd_vfs_unlink(struct file *filp);
void *ksmbd_vfs_init_kstat(char **p, struct ksmbd_kstat *ksmbd_kstat);
int ksmbd_vfs_fill_dentry_attrs(struct ksmbd_work *work,
struct mnt_idmap *idmap,
diff --git a/fs/ksmbd/vfs_cache.c b/fs/ksmbd/vfs_cache.c
index 054a7d2e0f489..2d0138e72d783 100644
--- a/fs/ksmbd/vfs_cache.c
+++ b/fs/ksmbd/vfs_cache.c
@@ -244,7 +244,6 @@ void ksmbd_release_inode_hash(void)
static void __ksmbd_inode_close(struct ksmbd_file *fp)
{
- struct dentry *dir, *dentry;
struct ksmbd_inode *ci = fp->f_ci;
int err;
struct file *filp;
@@ -263,11 +262,9 @@ static void __ksmbd_inode_close(struct ksmbd_file *fp)
if (atomic_dec_and_test(&ci->m_count)) {
write_lock(&ci->m_lock);
if (ci->m_flags & (S_DEL_ON_CLS | S_DEL_PENDING)) {
- dentry = filp->f_path.dentry;
- dir = dentry->d_parent;
ci->m_flags &= ~(S_DEL_ON_CLS | S_DEL_PENDING);
write_unlock(&ci->m_lock);
- ksmbd_vfs_unlink(file_mnt_idmap(filp), dir, dentry);
+ ksmbd_vfs_unlink(filp);
write_lock(&ci->m_lock);
}
write_unlock(&ci->m_lock);
diff --git a/fs/namei.c b/fs/namei.c
index 6bc1964e2214e..c1d59ae5af83e 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -254,6 +254,7 @@ getname_kernel(const char * filename)
return result;
}
+EXPORT_SYMBOL(getname_kernel);
void putname(struct filename *name)
{
@@ -271,6 +272,7 @@ void putname(struct filename *name)
} else
__putname(name);
}
+EXPORT_SYMBOL(putname);
/**
* check_acl - perform ACL permission checking
@@ -1581,8 +1583,9 @@ static struct dentry *lookup_dcache(const struct qstr *name,
* when directory is guaranteed to have no in-lookup children
* at all.
*/
-static struct dentry *__lookup_hash(const struct qstr *name,
- struct dentry *base, unsigned int flags)
+struct dentry *lookup_one_qstr_excl(const struct qstr *name,
+ struct dentry *base,
+ unsigned int flags)
{
struct dentry *dentry = lookup_dcache(name, base, flags);
struct dentry *old;
@@ -1606,6 +1609,7 @@ static struct dentry *__lookup_hash(const struct qstr *name,
}
return dentry;
}
+EXPORT_SYMBOL(lookup_one_qstr_excl);
static struct dentry *lookup_fast(struct nameidata *nd)
{
@@ -2532,16 +2536,17 @@ static int path_parentat(struct nameidata *nd, unsigned flags,
}
/* Note: this does not consume "name" */
-static int filename_parentat(int dfd, struct filename *name,
- unsigned int flags, struct path *parent,
- struct qstr *last, int *type)
+static int __filename_parentat(int dfd, struct filename *name,
+ unsigned int flags, struct path *parent,
+ struct qstr *last, int *type,
+ const struct path *root)
{
int retval;
struct nameidata nd;
if (IS_ERR(name))
return PTR_ERR(name);
- set_nameidata(&nd, dfd, name, NULL);
+ set_nameidata(&nd, dfd, name, root);
retval = path_parentat(&nd, flags | LOOKUP_RCU, parent);
if (unlikely(retval == -ECHILD))
retval = path_parentat(&nd, flags, parent);
@@ -2556,6 +2561,13 @@ static int filename_parentat(int dfd, struct filename *name,
return retval;
}
+static int filename_parentat(int dfd, struct filename *name,
+ unsigned int flags, struct path *parent,
+ struct qstr *last, int *type)
+{
+ return __filename_parentat(dfd, name, flags, parent, last, type, NULL);
+}
+
/* does lookup, returns the object with parent locked */
static struct dentry *__kern_path_locked(struct filename *name, struct path *path)
{
@@ -2571,7 +2583,7 @@ static struct dentry *__kern_path_locked(struct filename *name, struct path *pat
return ERR_PTR(-EINVAL);
}
inode_lock_nested(path->dentry->d_inode, I_MUTEX_PARENT);
- d = __lookup_hash(&last, path->dentry, 0);
+ d = lookup_one_qstr_excl(&last, path->dentry, 0);
if (IS_ERR(d)) {
inode_unlock(path->dentry->d_inode);
path_put(path);
@@ -2599,6 +2611,24 @@ int kern_path(const char *name, unsigned int flags, struct path *path)
}
EXPORT_SYMBOL(kern_path);
+/**
+ * vfs_path_parent_lookup - lookup a parent path relative to a dentry-vfsmount pair
+ * @filename: filename structure
+ * @flags: lookup flags
+ * @parent: pointer to struct path to fill
+ * @last: last component
+ * @type: type of the last component
+ * @root: pointer to struct path of the base directory
+ */
+int vfs_path_parent_lookup(struct filename *filename, unsigned int flags,
+ struct path *parent, struct qstr *last, int *type,
+ const struct path *root)
+{
+ return __filename_parentat(AT_FDCWD, filename, flags, parent, last,
+ type, root);
+}
+EXPORT_SYMBOL(vfs_path_parent_lookup);
+
/**
* vfs_path_lookup - lookup a file path relative to a dentry-vfsmount pair
* @dentry: pointer to dentry of the base directory
@@ -3852,7 +3882,8 @@ static struct dentry *filename_create(int dfd, struct filename *name,
if (last.name[last.len] && !want_dir)
create_flags = 0;
inode_lock_nested(path->dentry->d_inode, I_MUTEX_PARENT);
- dentry = __lookup_hash(&last, path->dentry, reval_flag | create_flags);
+ dentry = lookup_one_qstr_excl(&last, path->dentry,
+ reval_flag | create_flags);
if (IS_ERR(dentry))
goto unlock;
@@ -4212,7 +4243,7 @@ int do_rmdir(int dfd, struct filename *name)
goto exit2;
inode_lock_nested(path.dentry->d_inode, I_MUTEX_PARENT);
- dentry = __lookup_hash(&last, path.dentry, lookup_flags);
+ dentry = lookup_one_qstr_excl(&last, path.dentry, lookup_flags);
error = PTR_ERR(dentry);
if (IS_ERR(dentry))
goto exit3;
@@ -4345,7 +4376,7 @@ int do_unlinkat(int dfd, struct filename *name)
goto exit2;
retry_deleg:
inode_lock_nested(path.dentry->d_inode, I_MUTEX_PARENT);
- dentry = __lookup_hash(&last, path.dentry, lookup_flags);
+ dentry = lookup_one_qstr_excl(&last, path.dentry, lookup_flags);
error = PTR_ERR(dentry);
if (!IS_ERR(dentry)) {
@@ -4909,7 +4940,8 @@ int do_renameat2(int olddfd, struct filename *from, int newdfd,
retry_deleg:
trap = lock_rename(new_path.dentry, old_path.dentry);
- old_dentry = __lookup_hash(&old_last, old_path.dentry, lookup_flags);
+ old_dentry = lookup_one_qstr_excl(&old_last, old_path.dentry,
+ lookup_flags);
error = PTR_ERR(old_dentry);
if (IS_ERR(old_dentry))
goto exit3;
@@ -4917,7 +4949,8 @@ int do_renameat2(int olddfd, struct filename *from, int newdfd,
error = -ENOENT;
if (d_is_negative(old_dentry))
goto exit4;
- new_dentry = __lookup_hash(&new_last, new_path.dentry, lookup_flags | target_flags);
+ new_dentry = lookup_one_qstr_excl(&new_last, new_path.dentry,
+ lookup_flags | target_flags);
error = PTR_ERR(new_dentry);
if (IS_ERR(new_dentry))
goto exit4;
diff --git a/include/linux/namei.h b/include/linux/namei.h
index 5864e4d82e567..1463cbda48886 100644
--- a/include/linux/namei.h
+++ b/include/linux/namei.h
@@ -57,12 +57,18 @@ static inline int user_path_at(int dfd, const char __user *name, unsigned flags,
return user_path_at_empty(dfd, name, flags, path, NULL);
}
+struct dentry *lookup_one_qstr_excl(const struct qstr *name,
+ struct dentry *base,
+ unsigned int flags);
extern int kern_path(const char *, unsigned, struct path *);
extern struct dentry *kern_path_create(int, const char *, struct path *, unsigned int);
extern struct dentry *user_path_create(int, const char __user *, struct path *, unsigned int);
extern void done_path_create(struct path *, struct dentry *);
extern struct dentry *kern_path_locked(const char *, struct path *);
+int vfs_path_parent_lookup(struct filename *filename, unsigned int flags,
+ struct path *parent, struct qstr *last, int *type,
+ const struct path *root);
int vfs_path_lookup(struct dentry *, struct vfsmount *, const char *,
unsigned int, struct path *);
--
2.39.2
next prev parent reply other threads:[~2023-06-26 18:20 UTC|newest]
Thread overview: 209+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-26 18:08 [PATCH 6.3 000/199] 6.3.10-rc1 review Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 001/199] cifs: fix status checks in cifs_tree_connect Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 002/199] drm/amd/display: Use dc_update_planes_and_stream Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 003/199] drm/amd/display: Add wrapper to call planes and stream update Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 004/199] drm/amd/display: fix the system hang while disable PSR Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 005/199] ata: libata-scsi: Avoid deadlock on rescan after device resume Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 006/199] mm: Fix copy_from_user_nofault() Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 007/199] tpm, tpm_tis: Claim locality in interrupt handler Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 008/199] ksmbd: validate command payload size Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 009/199] ksmbd: fix out-of-bound read in smb2_write Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 010/199] ksmbd: validate session id and tree id in the compound request Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 011/199] udmabuf: revert Add support for mapping hugepages (v4) Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 012/199] Revert "efi: random: refresh non-volatile random seed when RNG is initialized" Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 013/199] afs: Fix dangling folio ref counts in writeback Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 014/199] afs: Fix waiting for writeback then skipping folio Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 015/199] tick/common: Align tick period during sched_timer setup Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 016/199] Revert "virtio-blk: support completion batching for the IRQ path" Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 017/199] riscv: Link with -z norelro Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 018/199] selftests: mptcp: remove duplicated entries in usage Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 019/199] selftests: mptcp: join: fix ShellCheck warnings Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 020/199] selftests: mptcp: lib: skip if missing symbol Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 021/199] selftests: mptcp: connect: skip transp tests if not supported Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 022/199] selftests: mptcp: connect: skip disconnect " Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 023/199] selftests: mptcp: connect: skip TFO " Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 024/199] selftests: mptcp: diag: skip listen " Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 025/199] selftests: mptcp: diag: skip inuse " Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 026/199] selftests: mptcp: pm nl: remove hardcoded default limits Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 027/199] selftests: mptcp: pm nl: skip fullmesh flag checks if not supported Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 028/199] selftests: mptcp: sockopt: relax expected returned size Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 029/199] selftests: mptcp: sockopt: skip getsockopt checks if not supported Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 030/199] selftests: mptcp: sockopt: skip TCP_INQ " Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 031/199] selftests: mptcp: userspace pm: skip if ip tool is unavailable Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 032/199] selftests: mptcp: userspace pm: skip if not supported Greg Kroah-Hartman
2023-06-26 18:08 ` [PATCH 6.3 033/199] selftests: mptcp: userspace pm: skip PM listener events tests if unavailable Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 034/199] selftests: mptcp: lib: skip if not below kernel version Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 035/199] selftests: mptcp: join: use iptables-legacy if available Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 036/199] selftests: mptcp: join: helpers to skip tests Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 037/199] selftests: mptcp: join: skip check if MIB counter not supported Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 038/199] selftests: mptcp: join: skip test if iptables/tc cmds fail Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 039/199] selftests: mptcp: join: support local endpoint being tracked or not Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 040/199] selftests: mptcp: join: skip Fastclose tests if not supported Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 041/199] selftests: mptcp: join: support RM_ADDR for used endpoints or not Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 042/199] selftests: mptcp: join: skip implicit tests if not supported Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 043/199] selftests: mptcp: join: skip backup if set flag on ID " Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 044/199] selftests: mptcp: join: skip fullmesh flag tests if " Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 045/199] selftests: mptcp: join: skip userspace PM " Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 046/199] selftests: mptcp: join: skip fail " Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 047/199] selftests: mptcp: join: skip MPC backups " Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 048/199] selftests: mptcp: join: skip PM listener " Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 049/199] selftests: mptcp: join: uniform listener tests Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 050/199] selftests: mptcp: join: skip mixed tests if not supported Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 051/199] memfd: check for non-NULL file_seals in memfd_create() syscall Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 052/199] writeback: fix dereferencing NULL mapping->host on writeback_page_template Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 053/199] scripts: fix the gfp flags header path in gfp-translate Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 054/199] nilfs2: fix buffer corruption due to concurrent device reads Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 055/199] nilfs2: prevent general protection fault in nilfs_clear_dirty_page() Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 056/199] ACPI: sleep: Avoid breaking S3 wakeup due to might_sleep() Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 057/199] thermal/intel/intel_soc_dts_iosf: Fix reporting wrong temperatures Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 058/199] KVM: Avoid illegal stage2 mapping on invalid memory slot Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 059/199] mm/vmalloc: do not output a spurious warning when huge vmalloc() fails Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 060/199] mm/mprotect: fix do_mprotect_pkey() limit check Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 061/199] Drivers: hv: vmbus: Call hv_synic_free() if hv_synic_alloc() fails Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 062/199] Drivers: hv: vmbus: Fix vmbus_wait_for_unload() to scan present CPUs Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 063/199] PCI: hv: Fix a race condition bug in hv_pci_query_relations() Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 064/199] Revert "PCI: hv: Fix a timing issue which causes kdump to fail occasionally" Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 065/199] PCI: hv: Remove the useless hv_pcichild_state from struct hv_pci_dev Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 066/199] PCI: hv: Fix a race condition in hv_irq_unmask() that can cause panic Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 067/199] PCI: hv: Add a per-bus mutex state_lock Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 068/199] io_uring/net: clear msg_controllen on partial sendmsg retry Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 069/199] io_uring/net: disable partial retries for recvmsg with cmsg Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 070/199] mptcp: handle correctly disconnect() failures Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 071/199] mptcp: fix possible divide by zero in recvmsg() Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 072/199] mptcp: fix possible list corruption on passive MPJ Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 073/199] mptcp: consolidate fallback and non fallback state machine Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 074/199] mptcp: ensure listener is unhashed before updating the sk status Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 075/199] cgroup: Do not corrupt task iteration when rebinding subsystem Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 076/199] cgroup,freezer: hold cpu_hotplug_lock before freezer_mutex in freezer_css_{online,offline}() Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 077/199] net: mdio: fix the wrong parameters Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 078/199] mmc: litex_mmc: set PROBE_PREFER_ASYNCHRONOUS Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 079/199] mmc: sdhci-msm: Disable broken 64-bit DMA on MSM8916 Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 080/199] mmc: meson-gx: remove redundant mmc_request_done() call from irq context Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 081/199] mmc: mmci: stm32: fix max busy timeout calculation Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 082/199] mmc: sdhci-spear: fix deferred probing Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 083/199] mmc: bcm2835: " Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 084/199] mmc: sunxi: " Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 085/199] mmc: meson-gx: " Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 086/199] bpf: ensure main program has an extable Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 087/199] wifi: iwlwifi: pcie: Handle SO-F device for PCI id 0x7AF0 Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 088/199] spi: spi-geni-qcom: correctly handle -EPROBE_DEFER from dma_request_chan() Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 089/199] regulator: pca9450: Fix LDO3OUT and LDO4OUT MASK Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 090/199] regmap: spi-avmm: Fix regmap_bus max_raw_write Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 091/199] ksmbd: remove internal.h include Greg Kroah-Hartman
2023-06-26 18:09 ` [PATCH 6.3 092/199] fs: introduce lock_rename_child() helper Greg Kroah-Hartman
2023-06-26 18:09 ` Greg Kroah-Hartman [this message]
2023-06-26 18:10 ` [PATCH 6.3 094/199] ksmbd: add mnt_want_write to ksmbd vfs functions Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 095/199] arm64: dts: rockchip: Fix rk356x PCIe register and range mappings Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 096/199] block: make sure local irq is disabled when calling __blkcg_rstat_flush Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 097/199] io_uring/poll: serialize poll linked timer start with poll removal Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 098/199] x86/mm: Avoid using set_pgd() outside of real PGD pages Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 099/199] ieee802154: hwsim: Fix possible memory leaks Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 100/199] xfrm: Treat already-verified secpath entries as optional Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 101/199] xfrm: Ensure policies always checked on XFRM-I input path Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 102/199] KVM: arm64: PMU: Restore the hosts PMUSERENR_EL0 Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 103/199] xfrm: add missed call to delete offloaded policies Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 104/199] bpf: Fix verifier id tracking of scalars on spill Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 105/199] xfrm: fix inbound ipv4/udp/esp packets to UDPv6 dualstack sockets Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 106/199] bpf: Fix a bpf_jit_dump issue for x86_64 with sysctl bpf_jit_enable Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 107/199] selftests: net: tls: check if FIPS mode is enabled Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 108/199] selftests: net: vrf-xfrm-tests: change authentication and encryption algos Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 109/199] selftests: net: fcnal-test: check if FIPS mode is enabled Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 110/199] xfrm: Linearize the skb after offloading if needed Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 111/199] net/mlx5: DR, Fix wrong action data allocation in decap action Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 112/199] sfc: use budget for TX completions Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 113/199] net: qca_spi: Avoid high load if QCA7000 is not available Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 114/199] mmc: mtk-sd: fix deferred probing Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 115/199] mmc: mvsdio: " Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 116/199] mmc: omap: " Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 117/199] mmc: omap_hsmmc: " Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 118/199] mmc: owl: " Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 119/199] mmc: sdhci-acpi: " Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 120/199] mmc: sh_mmcif: " Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 121/199] mmc: usdhi60rol0: " Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 122/199] ipvs: align inner_mac_header for encapsulation Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 123/199] net: dsa: mt7530: fix trapping frames on non-MT7621 SoC MT7530 switch Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 124/199] net: dsa: mt7530: fix handling of BPDUs on " Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 125/199] net: dsa: mt7530: fix handling of LLDP frames Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 126/199] net: dsa: introduce preferred_default_local_cpu_port and use on MT7530 Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 127/199] be2net: Extend xmit workaround to BE3 chip Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 128/199] netfilter: nf_tables: fix chain binding transaction logic Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 129/199] netfilter: nf_tables: add NFT_TRANS_PREPARE_ERROR to deal with bound set/chain Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 130/199] netfilter: nf_tables: drop map element references from preparation phase Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 131/199] netfilter: nft_set_pipapo: .walk does not deal with generations Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 132/199] netfilter: nf_tables: disallow element updates of bound anonymous sets Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 133/199] netfilter: nf_tables: reject unbound anonymous set before commit phase Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 134/199] netfilter: nf_tables: reject unbound chain " Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 135/199] netfilter: nf_tables: disallow updates of anonymous sets Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 136/199] netfilter: nfnetlink_osf: fix module autoload Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 137/199] Revert "net: phy: dp83867: perform soft reset and retain established link" Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 138/199] bpf/btf: Accept function names that contain dots Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 139/199] bpf: Force kprobe multi expected_attach_type for kprobe_multi link Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 140/199] io_uring/net: use the correct msghdr union member in io_sendmsg_copy_hdr Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 141/199] selftests: forwarding: Fix race condition in mirror installation Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 142/199] platform/x86/amd/pmf: Register notify handler only if SPS is enabled Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 143/199] sch_netem: acquire qdisc lock in netem_change() Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 144/199] revert "net: align SO_RCVMARK required privileges with SO_MARK" Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 145/199] arm64: dts: rockchip: fix nEXTRST on SOQuartz Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 146/199] gpiolib: Fix GPIO chip IRQ initialization restriction Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 147/199] gpio: sifive: add missing check for platform_get_irq Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 148/199] iommu/amd: Fix possible memory leak of domain Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 149/199] gpiolib: Fix irq_domain resource tracking for gpiochip_irqchip_add_domain() Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 150/199] scsi: target: iscsi: Fix hang in the iSCSI login code Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 151/199] scsi: target: iscsi: Remove unused transport_timer Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 152/199] scsi: target: iscsi: Prevent login threads from racing between each other Greg Kroah-Hartman
2023-06-26 18:10 ` [PATCH 6.3 153/199] HID: wacom: Add error check to wacom_parse_and_register() Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 154/199] arm64: Add missing Set/Way CMO encodings Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 155/199] smb3: missing null check in SMB2_change_notify Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 156/199] media: cec: core: disable adapter in cec_devnode_unregister Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 157/199] media: cec: core: dont set last_initiator if tx in progress Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 158/199] nfcsim.c: Fix error checking for debugfs_create_dir Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 159/199] btrfs: fix an uninitialized variable warning in btrfs_log_inode Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 160/199] usb: gadget: udc: fix NULL dereference in remove() Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 161/199] nvme: fix miss command type check Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 162/199] nvme: double KA polling frequency to avoid KATO with TBKAS on Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 163/199] nvme: check IO start time when deciding to defer KA Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 164/199] nvme: improve handling of long keep alives Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 165/199] Input: soc_button_array - add invalid acpi_index DMI quirk handling Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 166/199] arm64: dts: qcom: sc7280-idp: drop incorrect dai-cells from WCD938x SDW Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 167/199] arm64: dts: qcom: sc7280-qcard: " Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 168/199] s390/cio: unregister device when the only path is gone Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 169/199] spi: lpspi: disable lpspi module irq in DMA mode Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 170/199] ASoC: codecs: wcd938x-sdw: do not set can_multi_write flag Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 171/199] ASoC: simple-card: Add missing of_node_put() in case of error Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 172/199] soundwire: dmi-quirks: add new mapping for HP Spectre x360 Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 173/199] soundwire: qcom: add proper error paths in qcom_swrm_startup() Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 174/199] platform/x86: int3472: Avoid crash in unregistering regulator gpio Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 175/199] ASoC: nau8824: Add quirk to active-high jack-detect Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 176/199] ASoC: amd: yc: Add Thinkpad Neo14 to quirks list for acp6x Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 177/199] gfs2: Dont get stuck writing page onto itself under direct I/O Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 178/199] s390/purgatory: disable branch profiling Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 179/199] ASoC: fsl_sai: Enable BCI bit if SAI works on synchronous mode with BYP asserted Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 180/199] net: sched: wrap tc_skip_wrapper with CONFIG_RETPOLINE Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 181/199] ALSA: hda/realtek: Add "Intel Reference board" and "NUC 13" SSID in the ALC256 Greg Kroah-Hartman
2023-06-26 18:11 ` Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 182/199] i2c: mchp-pci1xxxx: Avoid cast to incompatible function type Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 183/199] i2c: designware: fix idx_write_cnt in read loop Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 184/199] ARM: dts: Fix erroneous ADS touchscreen polarities Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 185/199] null_blk: Fix: memory release when memory_backed=1 Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 186/199] drm/exynos: vidi: fix a wrong error return Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 187/199] drm/exynos: fix race condition UAF in exynos_g2d_exec_ioctl Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 188/199] drm/radeon: fix race condition UAF in radeon_gem_set_domain_ioctl Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 189/199] tools/virtio: Fix arm64 ringtest compilation error Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 190/199] vhost_vdpa: tell vqs about the negotiated Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 191/199] vhost_net: revert upend_idx only on retriable error Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 192/199] x86/unwind/orc: Add ELF section with ORC version identifier Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 193/199] x86/apic: Fix kernel panic when booting with intremap=off and x2apic_phys Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 194/199] i2c: imx-lpi2c: fix type char overflow issue when calculating the clock cycle Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 195/199] netfilter: nf_tables: drop module reference after updating chain Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 196/199] KVM: arm64: Restore GICv2-on-GICv3 functionality Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 197/199] ksmbd: fix uninitialized pointer read in ksmbd_vfs_rename() Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 198/199] ksmbd: fix uninitialized pointer read in smb2_create_link() Greg Kroah-Hartman
2023-06-26 18:11 ` [PATCH 6.3 199/199] ksmbd: call putname after using the last component Greg Kroah-Hartman
2023-06-27 9:04 ` [PATCH 6.3 000/199] 6.3.10-rc1 review Jon Hunter
2023-06-27 9:10 ` Ron Economos
2023-06-27 14:51 ` Markus Reichelt
2023-06-27 20:11 ` Chris Paterson
2023-06-27 21:33 ` Guenter Roeck
2023-06-28 6:37 ` Naresh Kamboju
2023-06-28 7:05 ` Conor Dooley
2023-06-28 17:38 ` Allen Pais
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230626180809.694570348@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=linkinjeon@kernel.org \
--cc=patches@lists.linux.dev \
--cc=sashal@kernel.org \
--cc=stable@vger.kernel.org \
--cc=stfrench@microsoft.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.