Archive-only list for patches
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: stable@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	patches@lists.linux.dev, Alex Markuze <amarkuze@redhat.com>,
	Viacheslav Dubeyko <Slava.Dubeyko@ibm.com>,
	Ilya Dryomov <idryomov@gmail.com>
Subject: [PATCH 6.16 101/189] ceph: fix race condition validating r_parent before applying state
Date: Wed, 17 Sep 2025 14:33:31 +0200	[thread overview]
Message-ID: <20250917123354.331140664@linuxfoundation.org> (raw)
In-Reply-To: <20250917123351.839989757@linuxfoundation.org>

6.16-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Alex Markuze <amarkuze@redhat.com>

commit 15f519e9f883b316d86e2bb6b767a023aafd9d83 upstream.

Add validation to ensure the cached parent directory inode matches the
directory info in MDS replies. This prevents client-side race conditions
where concurrent operations (e.g. rename) cause r_parent to become stale
between request initiation and reply processing, which could lead to
applying state changes to incorrect directory inodes.

[ idryomov: folded a kerneldoc fixup and a follow-up fix from Alex to
  move CEPH_CAP_PIN reference when r_parent is updated:

  When the parent directory lock is not held, req->r_parent can become
  stale and is updated to point to the correct inode.  However, the
  associated CEPH_CAP_PIN reference was not being adjusted.  The
  CEPH_CAP_PIN is a reference on an inode that is tracked for
  accounting purposes.  Moving this pin is important to keep the
  accounting balanced. When the pin was not moved from the old parent
  to the new one, it created two problems: The reference on the old,
  stale parent was never released, causing a reference leak.
  A reference for the new parent was never acquired, creating the risk
  of a reference underflow later in ceph_mdsc_release_request().  This
  patch corrects the logic by releasing the pin from the old parent and
  acquiring it for the new parent when r_parent is switched.  This
  ensures reference accounting stays balanced. ]

Cc: stable@vger.kernel.org
Signed-off-by: Alex Markuze <amarkuze@redhat.com>
Reviewed-by: Viacheslav Dubeyko <Slava.Dubeyko@ibm.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 fs/ceph/debugfs.c    |   14 +---
 fs/ceph/dir.c        |   17 ++---
 fs/ceph/file.c       |   24 ++-----
 fs/ceph/inode.c      |    7 --
 fs/ceph/mds_client.c |  172 +++++++++++++++++++++++++++++++--------------------
 fs/ceph/mds_client.h |   18 ++++-
 6 files changed, 145 insertions(+), 107 deletions(-)

--- a/fs/ceph/debugfs.c
+++ b/fs/ceph/debugfs.c
@@ -55,8 +55,6 @@ static int mdsc_show(struct seq_file *s,
 	struct ceph_mds_client *mdsc = fsc->mdsc;
 	struct ceph_mds_request *req;
 	struct rb_node *rp;
-	int pathlen = 0;
-	u64 pathbase;
 	char *path;
 
 	mutex_lock(&mdsc->mutex);
@@ -81,8 +79,8 @@ static int mdsc_show(struct seq_file *s,
 		if (req->r_inode) {
 			seq_printf(s, " #%llx", ceph_ino(req->r_inode));
 		} else if (req->r_dentry) {
-			path = ceph_mdsc_build_path(mdsc, req->r_dentry, &pathlen,
-						    &pathbase, 0);
+			struct ceph_path_info path_info;
+			path = ceph_mdsc_build_path(mdsc, req->r_dentry, &path_info, 0);
 			if (IS_ERR(path))
 				path = NULL;
 			spin_lock(&req->r_dentry->d_lock);
@@ -91,7 +89,7 @@ static int mdsc_show(struct seq_file *s,
 				   req->r_dentry,
 				   path ? path : "");
 			spin_unlock(&req->r_dentry->d_lock);
-			ceph_mdsc_free_path(path, pathlen);
+			ceph_mdsc_free_path_info(&path_info);
 		} else if (req->r_path1) {
 			seq_printf(s, " #%llx/%s", req->r_ino1.ino,
 				   req->r_path1);
@@ -100,8 +98,8 @@ static int mdsc_show(struct seq_file *s,
 		}
 
 		if (req->r_old_dentry) {
-			path = ceph_mdsc_build_path(mdsc, req->r_old_dentry, &pathlen,
-						    &pathbase, 0);
+			struct ceph_path_info path_info;
+			path = ceph_mdsc_build_path(mdsc, req->r_old_dentry, &path_info, 0);
 			if (IS_ERR(path))
 				path = NULL;
 			spin_lock(&req->r_old_dentry->d_lock);
@@ -111,7 +109,7 @@ static int mdsc_show(struct seq_file *s,
 				   req->r_old_dentry,
 				   path ? path : "");
 			spin_unlock(&req->r_old_dentry->d_lock);
-			ceph_mdsc_free_path(path, pathlen);
+			ceph_mdsc_free_path_info(&path_info);
 		} else if (req->r_path2 && req->r_op != CEPH_MDS_OP_SYMLINK) {
 			if (req->r_ino2.ino)
 				seq_printf(s, " #%llx/%s", req->r_ino2.ino,
--- a/fs/ceph/dir.c
+++ b/fs/ceph/dir.c
@@ -1272,10 +1272,8 @@ static void ceph_async_unlink_cb(struct
 
 	/* If op failed, mark everyone involved for errors */
 	if (result) {
-		int pathlen = 0;
-		u64 base = 0;
-		char *path = ceph_mdsc_build_path(mdsc, dentry, &pathlen,
-						  &base, 0);
+		struct ceph_path_info path_info = {0};
+		char *path = ceph_mdsc_build_path(mdsc, dentry, &path_info, 0);
 
 		/* mark error on parent + clear complete */
 		mapping_set_error(req->r_parent->i_mapping, result);
@@ -1289,8 +1287,8 @@ static void ceph_async_unlink_cb(struct
 		mapping_set_error(req->r_old_inode->i_mapping, result);
 
 		pr_warn_client(cl, "failure path=(%llx)%s result=%d!\n",
-			       base, IS_ERR(path) ? "<<bad>>" : path, result);
-		ceph_mdsc_free_path(path, pathlen);
+			       path_info.vino.ino, IS_ERR(path) ? "<<bad>>" : path, result);
+		ceph_mdsc_free_path_info(&path_info);
 	}
 out:
 	iput(req->r_old_inode);
@@ -1348,8 +1346,6 @@ static int ceph_unlink(struct inode *dir
 	int err = -EROFS;
 	int op;
 	char *path;
-	int pathlen;
-	u64 pathbase;
 
 	if (ceph_snap(dir) == CEPH_SNAPDIR) {
 		/* rmdir .snap/foo is RMSNAP */
@@ -1368,14 +1364,15 @@ static int ceph_unlink(struct inode *dir
 	if (!dn) {
 		try_async = false;
 	} else {
-		path = ceph_mdsc_build_path(mdsc, dn, &pathlen, &pathbase, 0);
+		struct ceph_path_info path_info;
+		path = ceph_mdsc_build_path(mdsc, dn, &path_info, 0);
 		if (IS_ERR(path)) {
 			try_async = false;
 			err = 0;
 		} else {
 			err = ceph_mds_check_access(mdsc, path, MAY_WRITE);
 		}
-		ceph_mdsc_free_path(path, pathlen);
+		ceph_mdsc_free_path_info(&path_info);
 		dput(dn);
 
 		/* For none EACCES cases will let the MDS do the mds auth check */
--- a/fs/ceph/file.c
+++ b/fs/ceph/file.c
@@ -368,8 +368,6 @@ int ceph_open(struct inode *inode, struc
 	int flags, fmode, wanted;
 	struct dentry *dentry;
 	char *path;
-	int pathlen;
-	u64 pathbase;
 	bool do_sync = false;
 	int mask = MAY_READ;
 
@@ -399,14 +397,15 @@ int ceph_open(struct inode *inode, struc
 	if (!dentry) {
 		do_sync = true;
 	} else {
-		path = ceph_mdsc_build_path(mdsc, dentry, &pathlen, &pathbase, 0);
+		struct ceph_path_info path_info;
+		path = ceph_mdsc_build_path(mdsc, dentry, &path_info, 0);
 		if (IS_ERR(path)) {
 			do_sync = true;
 			err = 0;
 		} else {
 			err = ceph_mds_check_access(mdsc, path, mask);
 		}
-		ceph_mdsc_free_path(path, pathlen);
+		ceph_mdsc_free_path_info(&path_info);
 		dput(dentry);
 
 		/* For none EACCES cases will let the MDS do the mds auth check */
@@ -614,15 +613,13 @@ static void ceph_async_create_cb(struct
 	mapping_set_error(req->r_parent->i_mapping, result);
 
 	if (result) {
-		int pathlen = 0;
-		u64 base = 0;
-		char *path = ceph_mdsc_build_path(mdsc, req->r_dentry, &pathlen,
-						  &base, 0);
+		struct ceph_path_info path_info = {0};
+		char *path = ceph_mdsc_build_path(mdsc, req->r_dentry, &path_info, 0);
 
 		pr_warn_client(cl,
 			"async create failure path=(%llx)%s result=%d!\n",
-			base, IS_ERR(path) ? "<<bad>>" : path, result);
-		ceph_mdsc_free_path(path, pathlen);
+			path_info.vino.ino, IS_ERR(path) ? "<<bad>>" : path, result);
+		ceph_mdsc_free_path_info(&path_info);
 
 		ceph_dir_clear_complete(req->r_parent);
 		if (!d_unhashed(dentry))
@@ -791,8 +788,6 @@ int ceph_atomic_open(struct inode *dir,
 	int mask;
 	int err;
 	char *path;
-	int pathlen;
-	u64 pathbase;
 
 	doutc(cl, "%p %llx.%llx dentry %p '%pd' %s flags %d mode 0%o\n",
 	      dir, ceph_vinop(dir), dentry, dentry,
@@ -814,7 +809,8 @@ int ceph_atomic_open(struct inode *dir,
 	if (!dn) {
 		try_async = false;
 	} else {
-		path = ceph_mdsc_build_path(mdsc, dn, &pathlen, &pathbase, 0);
+		struct ceph_path_info path_info;
+		path = ceph_mdsc_build_path(mdsc, dn, &path_info, 0);
 		if (IS_ERR(path)) {
 			try_async = false;
 			err = 0;
@@ -826,7 +822,7 @@ int ceph_atomic_open(struct inode *dir,
 				mask |= MAY_WRITE;
 			err = ceph_mds_check_access(mdsc, path, mask);
 		}
-		ceph_mdsc_free_path(path, pathlen);
+		ceph_mdsc_free_path_info(&path_info);
 		dput(dn);
 
 		/* For none EACCES cases will let the MDS do the mds auth check */
--- a/fs/ceph/inode.c
+++ b/fs/ceph/inode.c
@@ -2488,22 +2488,21 @@ int __ceph_setattr(struct mnt_idmap *idm
 	int truncate_retry = 20; /* The RMW will take around 50ms */
 	struct dentry *dentry;
 	char *path;
-	int pathlen;
-	u64 pathbase;
 	bool do_sync = false;
 
 	dentry = d_find_alias(inode);
 	if (!dentry) {
 		do_sync = true;
 	} else {
-		path = ceph_mdsc_build_path(mdsc, dentry, &pathlen, &pathbase, 0);
+		struct ceph_path_info path_info;
+		path = ceph_mdsc_build_path(mdsc, dentry, &path_info, 0);
 		if (IS_ERR(path)) {
 			do_sync = true;
 			err = 0;
 		} else {
 			err = ceph_mds_check_access(mdsc, path, MAY_WRITE);
 		}
-		ceph_mdsc_free_path(path, pathlen);
+		ceph_mdsc_free_path_info(&path_info);
 		dput(dentry);
 
 		/* For none EACCES cases will let the MDS do the mds auth check */
--- a/fs/ceph/mds_client.c
+++ b/fs/ceph/mds_client.c
@@ -2681,8 +2681,7 @@ static u8 *get_fscrypt_altname(const str
  * ceph_mdsc_build_path - build a path string to a given dentry
  * @mdsc: mds client
  * @dentry: dentry to which path should be built
- * @plen: returned length of string
- * @pbase: returned base inode number
+ * @path_info: output path, length, base ino+snap, and freepath ownership flag
  * @for_wire: is this path going to be sent to the MDS?
  *
  * Build a string that represents the path to the dentry. This is mostly called
@@ -2700,7 +2699,7 @@ static u8 *get_fscrypt_altname(const str
  *   foo/.snap/bar -> foo//bar
  */
 char *ceph_mdsc_build_path(struct ceph_mds_client *mdsc, struct dentry *dentry,
-			   int *plen, u64 *pbase, int for_wire)
+			   struct ceph_path_info *path_info, int for_wire)
 {
 	struct ceph_client *cl = mdsc->fsc->client;
 	struct dentry *cur;
@@ -2810,16 +2809,28 @@ retry:
 		return ERR_PTR(-ENAMETOOLONG);
 	}
 
-	*pbase = base;
-	*plen = PATH_MAX - 1 - pos;
+	/* Initialize the output structure */
+	memset(path_info, 0, sizeof(*path_info));
+
+	path_info->vino.ino = base;
+	path_info->pathlen = PATH_MAX - 1 - pos;
+	path_info->path = path + pos;
+	path_info->freepath = true;
+
+	/* Set snap from dentry if available */
+	if (d_inode(dentry))
+		path_info->vino.snap = ceph_snap(d_inode(dentry));
+	else
+		path_info->vino.snap = CEPH_NOSNAP;
+
 	doutc(cl, "on %p %d built %llx '%.*s'\n", dentry, d_count(dentry),
-	      base, *plen, path + pos);
+	      base, PATH_MAX - 1 - pos, path + pos);
 	return path + pos;
 }
 
 static int build_dentry_path(struct ceph_mds_client *mdsc, struct dentry *dentry,
-			     struct inode *dir, const char **ppath, int *ppathlen,
-			     u64 *pino, bool *pfreepath, bool parent_locked)
+			     struct inode *dir, struct ceph_path_info *path_info,
+			     bool parent_locked)
 {
 	char *path;
 
@@ -2828,41 +2839,47 @@ static int build_dentry_path(struct ceph
 		dir = d_inode_rcu(dentry->d_parent);
 	if (dir && parent_locked && ceph_snap(dir) == CEPH_NOSNAP &&
 	    !IS_ENCRYPTED(dir)) {
-		*pino = ceph_ino(dir);
+		path_info->vino.ino = ceph_ino(dir);
+		path_info->vino.snap = ceph_snap(dir);
 		rcu_read_unlock();
-		*ppath = dentry->d_name.name;
-		*ppathlen = dentry->d_name.len;
+		path_info->path = dentry->d_name.name;
+		path_info->pathlen = dentry->d_name.len;
+		path_info->freepath = false;
 		return 0;
 	}
 	rcu_read_unlock();
-	path = ceph_mdsc_build_path(mdsc, dentry, ppathlen, pino, 1);
+	path = ceph_mdsc_build_path(mdsc, dentry, path_info, 1);
 	if (IS_ERR(path))
 		return PTR_ERR(path);
-	*ppath = path;
-	*pfreepath = true;
+	/*
+	 * ceph_mdsc_build_path already fills path_info, including snap handling.
+	 */
 	return 0;
 }
 
-static int build_inode_path(struct inode *inode,
-			    const char **ppath, int *ppathlen, u64 *pino,
-			    bool *pfreepath)
+static int build_inode_path(struct inode *inode, struct ceph_path_info *path_info)
 {
 	struct ceph_mds_client *mdsc = ceph_sb_to_mdsc(inode->i_sb);
 	struct dentry *dentry;
 	char *path;
 
 	if (ceph_snap(inode) == CEPH_NOSNAP) {
-		*pino = ceph_ino(inode);
-		*ppathlen = 0;
+		path_info->vino.ino = ceph_ino(inode);
+		path_info->vino.snap = ceph_snap(inode);
+		path_info->pathlen = 0;
+		path_info->freepath = false;
 		return 0;
 	}
 	dentry = d_find_alias(inode);
-	path = ceph_mdsc_build_path(mdsc, dentry, ppathlen, pino, 1);
+	path = ceph_mdsc_build_path(mdsc, dentry, path_info, 1);
 	dput(dentry);
 	if (IS_ERR(path))
 		return PTR_ERR(path);
-	*ppath = path;
-	*pfreepath = true;
+	/*
+	 * ceph_mdsc_build_path already fills path_info, including snap from dentry.
+	 * Override with inode's snap since that's what this function is for.
+	 */
+	path_info->vino.snap = ceph_snap(inode);
 	return 0;
 }
 
@@ -2872,26 +2889,32 @@ static int build_inode_path(struct inode
  */
 static int set_request_path_attr(struct ceph_mds_client *mdsc, struct inode *rinode,
 				 struct dentry *rdentry, struct inode *rdiri,
-				 const char *rpath, u64 rino, const char **ppath,
-				 int *pathlen, u64 *ino, bool *freepath,
+				 const char *rpath, u64 rino,
+				 struct ceph_path_info *path_info,
 				 bool parent_locked)
 {
 	struct ceph_client *cl = mdsc->fsc->client;
 	int r = 0;
 
+	/* Initialize the output structure */
+	memset(path_info, 0, sizeof(*path_info));
+
 	if (rinode) {
-		r = build_inode_path(rinode, ppath, pathlen, ino, freepath);
+		r = build_inode_path(rinode, path_info);
 		doutc(cl, " inode %p %llx.%llx\n", rinode, ceph_ino(rinode),
 		      ceph_snap(rinode));
 	} else if (rdentry) {
-		r = build_dentry_path(mdsc, rdentry, rdiri, ppath, pathlen, ino,
-					freepath, parent_locked);
-		doutc(cl, " dentry %p %llx/%.*s\n", rdentry, *ino, *pathlen, *ppath);
+		r = build_dentry_path(mdsc, rdentry, rdiri, path_info, parent_locked);
+		doutc(cl, " dentry %p %llx/%.*s\n", rdentry, path_info->vino.ino,
+		      path_info->pathlen, path_info->path);
 	} else if (rpath || rino) {
-		*ino = rino;
-		*ppath = rpath;
-		*pathlen = rpath ? strlen(rpath) : 0;
-		doutc(cl, " path %.*s\n", *pathlen, rpath);
+		path_info->vino.ino = rino;
+		path_info->vino.snap = CEPH_NOSNAP;
+		path_info->path = rpath;
+		path_info->pathlen = rpath ? strlen(rpath) : 0;
+		path_info->freepath = false;
+
+		doutc(cl, " path %.*s\n", path_info->pathlen, rpath);
 	}
 
 	return r;
@@ -2968,11 +2991,8 @@ static struct ceph_msg *create_request_m
 	struct ceph_client *cl = mdsc->fsc->client;
 	struct ceph_msg *msg;
 	struct ceph_mds_request_head_legacy *lhead;
-	const char *path1 = NULL;
-	const char *path2 = NULL;
-	u64 ino1 = 0, ino2 = 0;
-	int pathlen1 = 0, pathlen2 = 0;
-	bool freepath1 = false, freepath2 = false;
+	struct ceph_path_info path_info1 = {0};
+	struct ceph_path_info path_info2 = {0};
 	struct dentry *old_dentry = NULL;
 	int len;
 	u16 releases;
@@ -2982,25 +3002,49 @@ static struct ceph_msg *create_request_m
 	u16 request_head_version = mds_supported_head_version(session);
 	kuid_t caller_fsuid = req->r_cred->fsuid;
 	kgid_t caller_fsgid = req->r_cred->fsgid;
+	bool parent_locked = test_bit(CEPH_MDS_R_PARENT_LOCKED, &req->r_req_flags);
 
 	ret = set_request_path_attr(mdsc, req->r_inode, req->r_dentry,
-			      req->r_parent, req->r_path1, req->r_ino1.ino,
-			      &path1, &pathlen1, &ino1, &freepath1,
-			      test_bit(CEPH_MDS_R_PARENT_LOCKED,
-					&req->r_req_flags));
+				    req->r_parent, req->r_path1, req->r_ino1.ino,
+				    &path_info1, parent_locked);
 	if (ret < 0) {
 		msg = ERR_PTR(ret);
 		goto out;
 	}
 
+	/*
+	 * When the parent directory's i_rwsem is *not* locked, req->r_parent may
+	 * have become stale (e.g. after a concurrent rename) between the time the
+	 * dentry was looked up and now.  If we detect that the stored r_parent
+	 * does not match the inode number we just encoded for the request, switch
+	 * to the correct inode so that the MDS receives a valid parent reference.
+	 */
+	if (!parent_locked && req->r_parent && path_info1.vino.ino &&
+	    ceph_ino(req->r_parent) != path_info1.vino.ino) {
+		struct inode *old_parent = req->r_parent;
+		struct inode *correct_dir = ceph_get_inode(mdsc->fsc->sb, path_info1.vino, NULL);
+		if (!IS_ERR(correct_dir)) {
+			WARN_ONCE(1, "ceph: r_parent mismatch (had %llx wanted %llx) - updating\n",
+			          ceph_ino(old_parent), path_info1.vino.ino);
+			/*
+			 * Transfer CEPH_CAP_PIN from the old parent to the new one.
+			 * The pin was taken earlier in ceph_mdsc_submit_request().
+			 */
+			ceph_put_cap_refs(ceph_inode(old_parent), CEPH_CAP_PIN);
+			iput(old_parent);
+			req->r_parent = correct_dir;
+			ceph_get_cap_refs(ceph_inode(req->r_parent), CEPH_CAP_PIN);
+		}
+	}
+
 	/* If r_old_dentry is set, then assume that its parent is locked */
 	if (req->r_old_dentry &&
 	    !(req->r_old_dentry->d_flags & DCACHE_DISCONNECTED))
 		old_dentry = req->r_old_dentry;
 	ret = set_request_path_attr(mdsc, NULL, old_dentry,
-			      req->r_old_dentry_dir,
-			      req->r_path2, req->r_ino2.ino,
-			      &path2, &pathlen2, &ino2, &freepath2, true);
+				    req->r_old_dentry_dir,
+				    req->r_path2, req->r_ino2.ino,
+				    &path_info2, true);
 	if (ret < 0) {
 		msg = ERR_PTR(ret);
 		goto out_free1;
@@ -3031,7 +3075,7 @@ static struct ceph_msg *create_request_m
 
 	/* filepaths */
 	len += 2 * (1 + sizeof(u32) + sizeof(u64));
-	len += pathlen1 + pathlen2;
+	len += path_info1.pathlen + path_info2.pathlen;
 
 	/* cap releases */
 	len += sizeof(struct ceph_mds_request_release) *
@@ -3039,9 +3083,9 @@ static struct ceph_msg *create_request_m
 		 !!req->r_old_inode_drop + !!req->r_old_dentry_drop);
 
 	if (req->r_dentry_drop)
-		len += pathlen1;
+		len += path_info1.pathlen;
 	if (req->r_old_dentry_drop)
-		len += pathlen2;
+		len += path_info2.pathlen;
 
 	/* MClientRequest tail */
 
@@ -3154,8 +3198,8 @@ static struct ceph_msg *create_request_m
 	lhead->ino = cpu_to_le64(req->r_deleg_ino);
 	lhead->args = req->r_args;
 
-	ceph_encode_filepath(&p, end, ino1, path1);
-	ceph_encode_filepath(&p, end, ino2, path2);
+	ceph_encode_filepath(&p, end, path_info1.vino.ino, path_info1.path);
+	ceph_encode_filepath(&p, end, path_info2.vino.ino, path_info2.path);
 
 	/* make note of release offset, in case we need to replay */
 	req->r_request_release_offset = p - msg->front.iov_base;
@@ -3218,11 +3262,9 @@ static struct ceph_msg *create_request_m
 	msg->hdr.data_off = cpu_to_le16(0);
 
 out_free2:
-	if (freepath2)
-		ceph_mdsc_free_path((char *)path2, pathlen2);
+	ceph_mdsc_free_path_info(&path_info2);
 out_free1:
-	if (freepath1)
-		ceph_mdsc_free_path((char *)path1, pathlen1);
+	ceph_mdsc_free_path_info(&path_info1);
 out:
 	return msg;
 out_err:
@@ -4579,24 +4621,20 @@ static int reconnect_caps_cb(struct inod
 	struct ceph_pagelist *pagelist = recon_state->pagelist;
 	struct dentry *dentry;
 	struct ceph_cap *cap;
-	char *path;
-	int pathlen = 0, err;
-	u64 pathbase;
+	struct ceph_path_info path_info = {0};
+	int err;
 	u64 snap_follows;
 
 	dentry = d_find_primary(inode);
 	if (dentry) {
 		/* set pathbase to parent dir when msg_version >= 2 */
-		path = ceph_mdsc_build_path(mdsc, dentry, &pathlen, &pathbase,
+		char *path = ceph_mdsc_build_path(mdsc, dentry, &path_info,
 					    recon_state->msg_version >= 2);
 		dput(dentry);
 		if (IS_ERR(path)) {
 			err = PTR_ERR(path);
 			goto out_err;
 		}
-	} else {
-		path = NULL;
-		pathbase = 0;
 	}
 
 	spin_lock(&ci->i_ceph_lock);
@@ -4629,7 +4667,7 @@ static int reconnect_caps_cb(struct inod
 		rec.v2.wanted = cpu_to_le32(__ceph_caps_wanted(ci));
 		rec.v2.issued = cpu_to_le32(cap->issued);
 		rec.v2.snaprealm = cpu_to_le64(ci->i_snap_realm->ino);
-		rec.v2.pathbase = cpu_to_le64(pathbase);
+		rec.v2.pathbase = cpu_to_le64(path_info.vino.ino);
 		rec.v2.flock_len = (__force __le32)
 			((ci->i_ceph_flags & CEPH_I_ERROR_FILELOCK) ? 0 : 1);
 	} else {
@@ -4644,7 +4682,7 @@ static int reconnect_caps_cb(struct inod
 		ts = inode_get_atime(inode);
 		ceph_encode_timespec64(&rec.v1.atime, &ts);
 		rec.v1.snaprealm = cpu_to_le64(ci->i_snap_realm->ino);
-		rec.v1.pathbase = cpu_to_le64(pathbase);
+		rec.v1.pathbase = cpu_to_le64(path_info.vino.ino);
 	}
 
 	if (list_empty(&ci->i_cap_snaps)) {
@@ -4706,7 +4744,7 @@ encode_again:
 			    sizeof(struct ceph_filelock);
 		rec.v2.flock_len = cpu_to_le32(struct_len);
 
-		struct_len += sizeof(u32) + pathlen + sizeof(rec.v2);
+		struct_len += sizeof(u32) + path_info.pathlen + sizeof(rec.v2);
 
 		if (struct_v >= 2)
 			struct_len += sizeof(u64); /* snap_follows */
@@ -4730,7 +4768,7 @@ encode_again:
 			ceph_pagelist_encode_8(pagelist, 1);
 			ceph_pagelist_encode_32(pagelist, struct_len);
 		}
-		ceph_pagelist_encode_string(pagelist, path, pathlen);
+		ceph_pagelist_encode_string(pagelist, (char *)path_info.path, path_info.pathlen);
 		ceph_pagelist_append(pagelist, &rec, sizeof(rec.v2));
 		ceph_locks_to_pagelist(flocks, pagelist,
 				       num_fcntl_locks, num_flock_locks);
@@ -4741,17 +4779,17 @@ out_freeflocks:
 	} else {
 		err = ceph_pagelist_reserve(pagelist,
 					    sizeof(u64) + sizeof(u32) +
-					    pathlen + sizeof(rec.v1));
+					    path_info.pathlen + sizeof(rec.v1));
 		if (err)
 			goto out_err;
 
 		ceph_pagelist_encode_64(pagelist, ceph_ino(inode));
-		ceph_pagelist_encode_string(pagelist, path, pathlen);
+		ceph_pagelist_encode_string(pagelist, (char *)path_info.path, path_info.pathlen);
 		ceph_pagelist_append(pagelist, &rec, sizeof(rec.v1));
 	}
 
 out_err:
-	ceph_mdsc_free_path(path, pathlen);
+	ceph_mdsc_free_path_info(&path_info);
 	if (!err)
 		recon_state->nr_caps++;
 	return err;
--- a/fs/ceph/mds_client.h
+++ b/fs/ceph/mds_client.h
@@ -617,14 +617,24 @@ extern int ceph_mds_check_access(struct
 
 extern void ceph_mdsc_pre_umount(struct ceph_mds_client *mdsc);
 
-static inline void ceph_mdsc_free_path(char *path, int len)
+/*
+ * Structure to group path-related output parameters for build_*_path functions
+ */
+struct ceph_path_info {
+	const char *path;
+	int pathlen;
+	struct ceph_vino vino;
+	bool freepath;
+};
+
+static inline void ceph_mdsc_free_path_info(const struct ceph_path_info *path_info)
 {
-	if (!IS_ERR_OR_NULL(path))
-		__putname(path - (PATH_MAX - 1 - len));
+	if (path_info && path_info->freepath && !IS_ERR_OR_NULL(path_info->path))
+		__putname((char *)path_info->path - (PATH_MAX - 1 - path_info->pathlen));
 }
 
 extern char *ceph_mdsc_build_path(struct ceph_mds_client *mdsc,
-				  struct dentry *dentry, int *plen, u64 *base,
+				  struct dentry *dentry, struct ceph_path_info *path_info,
 				  int for_wire);
 
 extern void __ceph_mdsc_drop_dentry_lease(struct dentry *dentry);



  parent reply	other threads:[~2025-09-17 12:41 UTC|newest]

Thread overview: 205+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-09-17 12:31 [PATCH 6.16 000/189] 6.16.8-rc1 review Greg Kroah-Hartman
2025-09-17 12:31 ` [PATCH 6.16 001/189] fs: add a FMODE_ flag to indicate IOCB_HAS_METADATA availability Greg Kroah-Hartman
2025-09-17 12:31 ` [PATCH 6.16 002/189] block: dont silently ignore metadata for sync read/write Greg Kroah-Hartman
2025-09-17 12:31 ` [PATCH 6.16 003/189] coredump: dont pointlessly check and spew warnings Greg Kroah-Hartman
2025-09-17 12:31 ` [PATCH 6.16 004/189] fuse: Block access to folio overlimit Greg Kroah-Hartman
2025-09-17 12:31 ` [PATCH 6.16 005/189] fhandle: use more consistent rules for decoding file handle from userns Greg Kroah-Hartman
2025-09-17 12:31 ` [PATCH 6.16 006/189] dma-debug: dont enforce dma mapping check on noncoherent allocations Greg Kroah-Hartman
2025-09-17 12:31 ` [PATCH 6.16 007/189] perf: Fix the POLL_HUP delivery breakage Greg Kroah-Hartman
2025-09-17 12:31 ` [PATCH 6.16 008/189] irqchip/mvebu-gicp: Fix an IS_ERR() vs NULL check in probe() Greg Kroah-Hartman
2025-09-17 12:31 ` [PATCH 6.16 009/189] Bluetooth: hci_conn: Fix not cleaning up Broadcaster/Broadcast Source Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 010/189] iommu/vt-d: Split intel_iommu_domain_alloc_paging_flags() Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 011/189] iommu/vt-d: Create unique domain ops for each stage Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 012/189] iommu/vt-d: Split paging_domain_compatible() Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 013/189] iommu/vt-d: Make iotlb_sync_map a static property of dmar_domain Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 014/189] Bluetooth: hci_conn: Fix running bis_cleanup for hci_conn->type PA_LINK Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 015/189] Bluetooth: ISO: Fix getname not returning broadcast fields Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 016/189] Revert "drm/amdgpu: Add more checks to PSP mailbox" Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 017/189] flexfiles/pNFS: fix NULL checks on result of ff_layout_choose_ds_for_read Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 018/189] SUNRPC: call xs_sock_process_cmsg for all cmsg Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 019/189] NFSv4: Dont clear capabilities that wont be reset Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 020/189] md: keep recovery_cp in mdp_superblock_s Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 021/189] trace/fgraph: Fix error handling Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 022/189] NFSv4: Clear the NFS_CAP_FS_LOCATIONS flag if it is not set Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 023/189] NFSv4: Clear NFS_CAP_OPEN_XOR and NFS_CAP_DELEGTIME if not supported Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 024/189] NFSv4: Clear the NFS_CAP_XATTR flag if not supported by the server Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 025/189] tracing: Fix tracing_marker may trigger page fault during preempt_disable Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 026/189] nfs/localio: restore creds before releasing pageio data Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 027/189] ftrace/samples: Fix function size computation Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 028/189] tracing/osnoise: Fix null-ptr-deref in bitmap_parselist() Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 029/189] NFS: Serialise O_DIRECT i/o and truncate() Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 030/189] NFSv4.2: Serialise O_DIRECT i/o and fallocate() Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 031/189] NFSv4.2: Serialise O_DIRECT i/o and clone range Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 032/189] NFSv4.2: Serialise O_DIRECT i/o and copy range Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 033/189] NFS: nfs_invalidate_folio() must observe the offset and size arguments Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 034/189] NFSv4/flexfiles: Fix layout merge mirror check Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 035/189] tracing: Silence warning when chunk allocation fails in trace_pid_write Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 036/189] bpf, cpumap: Disable page_pool direct xdp_return need larger scope Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 037/189] cpufreq/amd-pstate: Fix setting of CPPC.min_perf in active mode for performance governor Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 038/189] s390/pai: Deny all events not handled by this PMU Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 039/189] s390/cpum_cf: Deny all sampling events by counter PMU Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 040/189] cpufreq/amd-pstate: Fix a regression leading to EPP 0 after resume Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 041/189] bpf: Fix out-of-bounds dynptr write in bpf_crypto_crypt Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 042/189] xsk: Fix immature cq descriptor production Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 043/189] rqspinlock: Choose trylock fallback for NMI waiters Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 044/189] bpf: Allow fall back to interpreter for programs with stack size <= 512 Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 045/189] bpf: Tell memcg to use allow_spinning=false path in bpf_timer_init() Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 046/189] tcp_bpf: Call sk_msg_free() when tcp_bpf_send_verdict() fails to allocate psock->cork Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 047/189] proc: fix type confusion in pde_set_flags() Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 048/189] EDAC/altera: Delete an inappropriate dma_free_coherent() call Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 049/189] i2c: rtl9300: fix channel number bound check Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 050/189] Revert "SUNRPC: Dont allow waiting for exiting tasks" Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 051/189] compiler-clang.h: define __SANITIZE_*__ macros only when undefined Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 052/189] arm64: kexec: initialize kexec_buf struct in load_other_segments() Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 053/189] mptcp: sockopt: make sync_socket_options propagate SOCK_KEEPOPEN Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 054/189] doc: mptcp: net.mptcp.pm_type is deprecated Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 055/189] netlink: specs: mptcp: fix if-idx attribute type Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 056/189] ocfs2: fix recursive semaphore deadlock in fiemap call Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 057/189] btrfs: fix squota compressed stats leak Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 058/189] btrfs: fix subvolume deletion lockup caused by inodes xarray race Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 059/189] i2c: i801: Hide Intel Birch Stream SoC TCO WDT Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 060/189] i2c: rtl9300: ensure data length is within supported range Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 061/189] i2c: rtl9300: remove broken SMBus Quick operation support Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 062/189] net: libwx: fix to enable RSS Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 063/189] net: usb: asix: ax88772: drop phylink use in PM to avoid MDIO runtime PM wakeups Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 064/189] PM: EM: Add function for registering a PD without capacity update Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 065/189] PM: hibernate: Restrict GFP mask in hibernation_snapshot() Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 066/189] wifi: iwlwifi: fix 130/1030 configs Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 067/189] s390: kexec: initialize kexec_buf struct Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 068/189] smb: client: fix compound alignment with encryption Greg Kroah-Hartman
2025-09-17 12:32 ` [PATCH 6.16 069/189] smb: client: fix data loss due to broken rename(2) Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 070/189] mtd: nand: raw: atmel: Respect tAR, tCLR in read setup timing Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 071/189] mtd: rawnand: stm32_fmc2: avoid overlapping mappings on ECC buffer Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 072/189] mtd: rawnand: stm32_fmc2: fix ECC overwrite Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 073/189] fuse: do not allow mapping a non-regular backing file Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 074/189] fuse: check if copy_file_range() returns larger than requested size Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 075/189] fuse: prevent overflow in copy_file_range return value Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 076/189] mm/hugetlb: add missing hugetlb_lock in __unmap_hugepage_range() Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 077/189] mm/khugepaged: fix the address passed to notifier on testing young Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 078/189] mm/vmalloc, mm/kasan: respect gfp mask in kasan_populate_vmalloc() Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 079/189] mm/memory-failure: fix VM_BUG_ON_PAGE(PagePoisoned(page)) when unpoison memory Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 080/189] mm/memory-failure: fix redundant updates for already poisoned pages Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 081/189] mm/damon/core: set quota->charged_from to jiffies at first charge window Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 082/189] mm/damon/lru_sort: avoid divide-by-zero in damon_lru_sort_apply_parameters() Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 083/189] drm/mediatek: fix potential OF node use-after-free Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 084/189] drm/i915/power: fix size for for_each_set_bit() in abox iteration Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 085/189] drm/xe: Attempt to bring bos back to VRAM after eviction Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 086/189] drm/xe: Allow the pm notifier to continue on failure Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 087/189] drm/xe: Block exec and rebind worker while evicting for suspend / hibernate Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 088/189] drm/amdgpu: fix a memory leak in fence cleanup when unloading Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 089/189] drm/amdgpu/vcn: Allow limiting ctx to instance 0 for AV1 at any time Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 090/189] drm/amdgpu/vcn4: Fix IB parsing with multiple engine info packages Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 091/189] drm/amd/display: Correct sequences and delays for DCN35 PG & RCG Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 092/189] drm/amd/display: remove oem i2c adapter on finish Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 093/189] drm/edid: Define the quirks in an enum list Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 094/189] drm/edid: Add support for quirks visible to DRM core and drivers Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 095/189] drm/dp: Add an EDID quirk for the DPCD register access probe Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 096/189] drm/amd/display: Disable DPCD Probe Quirk Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 097/189] btrfs: use readahead_expand() on compressed extents Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 098/189] btrfs: fix corruption reading compressed range when block size is smaller than page size Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 099/189] kernfs: Fix UAF in polling when open file is released Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 100/189] libceph: fix invalid accesses to ceph_connection_v1_info Greg Kroah-Hartman
2025-09-17 12:33 ` Greg Kroah-Hartman [this message]
2025-09-17 12:33 ` [PATCH 6.16 102/189] ceph: fix race condition where r_parent becomes stale before sending message Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 103/189] ceph: always call ceph_shift_unused_folios_left() Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 104/189] ceph: fix crash after fscrypt_encrypt_pagecache_blocks() error Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 105/189] mtd: spinand: Add a ->configure_chip() hook Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 106/189] mtd: spinand: winbond: Enable high-speed modes on w25n0xjw Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 107/189] mtd: spinand: winbond: Fix oob_layout for W25N01JW Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 108/189] mm/damon/sysfs: fix use-after-free in state_show() Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 109/189] mm/damon/reclaim: avoid divide-by-zero in damon_reclaim_apply_parameters() Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 110/189] drm/amd/display: Destroy cached state in complete() callback Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 111/189] drm/amd/display: Drop dm_prepare_suspend() and dm_complete() Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 112/189] drm/amd/amdgpu: Declare isp firmware binary file Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 113/189] hrtimers: Unconditionally update target CPU base after offline timer migration Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 114/189] fs/resctrl: Eliminate false positive lockdep warning when reading SNC counters Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 115/189] x86/cpu/topology: Always try cpu_parse_topology_ext() on AMD/Hygon Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 116/189] Input: iqs7222 - avoid enabling unused interrupts Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 117/189] Input: i8042 - add TUXEDO InfinityBook Pro Gen10 AMD to i8042 quirk table Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 118/189] Input: xpad - add support for Flydigi Apex 5 Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 119/189] Revert "net: usb: asix: ax88772: drop phylink use in PM to avoid MDIO runtime PM wakeups" Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 120/189] tty: hvc_console: Call hvc_kick in hvc_write unconditionally Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 121/189] serial: sc16is7xx: fix bug in flow control levels init Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 122/189] dt-bindings: serial: brcm,bcm7271-uart: Constrain clocks Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 123/189] USB: serial: option: add Telit Cinterion FN990A w/audio compositions Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 124/189] USB: serial: option: add Telit Cinterion LE910C4-WWX new compositions Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 125/189] mtd: rawnand: nuvoton: Fix an error handling path in ma35_nand_chips_init() Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 126/189] drm/panthor: validate group queue count Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 127/189] net: fec: Fix possible NPD in fec_enet_phy_reset_after_clk_enable() Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 128/189] net: phylink: add lock for serializing concurrent pl->phydev writes with resolver Greg Kroah-Hartman
2025-09-17 12:33 ` [PATCH 6.16 129/189] net: phy: transfer phy_config_inband() locking responsibility to phylink Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 130/189] wifi: ath12k: Fix missing station power save configuration Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 131/189] wifi: ath12k: add link support for multi-link in arsta Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 132/189] wifi: ath12k: Add support to enqueue management frame at MLD level Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 133/189] wifi: ath12k: fix WMI TLV header misalignment Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 134/189] PCI: mvebu: Fix use of for_each_of_range() iterator Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 135/189] genetlink: fix genl_bind() invoking bind() after -EPERM Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 136/189] net: dsa: b53: fix ageing time for BCM53101 Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 137/189] net: bridge: Bounce invalid boolopts Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 138/189] tunnels: reset the GSO metadata before reusing the skb Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 139/189] docs: networking: can: change bcm_msg_head frames member to support flexible array Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 140/189] igb: Fix NULL pointer dereference in ethtool loopback test Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 141/189] igb: fix link test skipping when interface is admin down Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 142/189] i40e: fix IRQ freeing in i40e_vsi_request_irq_msix error path Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 143/189] drm/xe/configfs: Dont touch survivability_mode on fini Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 144/189] drm/amd/display: use udelay rather than fsleep Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 145/189] net: dev_ioctl: take ops lock in hwtstamp lower paths Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 146/189] macsec: sync features on RTM_NEWLINK Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 147/189] selftests: can: enable CONFIG_CAN_VCAN as a module Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 148/189] can: j1939: implement NETDEV_UNREGISTER notification handler Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 149/189] can: j1939: j1939_sk_bind(): call j1939_priv_put() immediately when j1939_local_ecu_get() failed Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 150/189] can: j1939: j1939_local_ecu_get(): undo increment when j1939_local_ecu_get() fails Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 151/189] can: xilinx_can: xcan_write_frame(): fix use-after-free of transmitted SKB Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 152/189] netfilter: nft_set_bitmap: fix lockdep splat due to missing annotation Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 153/189] netfilter: nft_set_pipapo: remove unused arguments Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 154/189] netfilter: nft_set: remove one argument from lookup and update functions Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 155/189] netfilter: nft_set_pipapo: merge pipapo_get/lookup Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 156/189] netfilter: nft_set_pipapo: dont return bogus extension pointer Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 157/189] netfilter: nft_set_pipapo: dont check genbit from packetpath lookups Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 158/189] netfilter: nft_set_rbtree: continue traversal if element is inactive Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 159/189] netfilter: nf_tables: Reintroduce shortened deletion notifications Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 160/189] netfilter: nf_tables: place base_seq in struct net Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 161/189] netfilter: nf_tables: make nft_set_do_lookup available unconditionally Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 162/189] netfilter: nf_tables: restart set lookup on base_seq change Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 163/189] hsr: use rtnl lock when iterating over ports Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 164/189] hsr: use hsr_for_each_port_rtnl in hsr_port_get_hsr Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 165/189] hsr: hold rcu and dev lock for hsr_get_port_ndev Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 166/189] phy: qualcomm: phy-qcom-eusb2-repeater: fix override properties Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 167/189] dmaengine: idxd: Remove improper idxd_free Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 168/189] dmaengine: idxd: Fix refcount underflow on module unload Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 169/189] dmaengine: idxd: Fix double free in idxd_setup_wqs() Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 170/189] erofs: get rid of {get,put}_page() for ztailpacking data Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 171/189] erofs: remove need_kmap in erofs_read_metabuf() Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 172/189] erofs: unify meta buffers in z_erofs_fill_inode() Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 173/189] erofs: fix invalid algorithm for encoded extents Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 174/189] dmaengine: ti: edma: Fix memory allocation size for queue_priority_map Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 175/189] regulator: sy7636a: fix lifecycle of power good gpio Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 176/189] erofs: fix runtime warning on truncate_folio_batch_exceptionals() Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 177/189] xhci: dbc: decouple endpoint allocation from initialization Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 178/189] xhci: dbc: Fix full DbC transfer ring after several reconnects Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 179/189] xhci: fix memory leak regression when freeing xhci vdev devices depth first Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 180/189] USB: gadget: dummy-hcd: Fix locking bug in RT-enabled kernels Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 181/189] usb: typec: tcpm: properly deliver cable vdms to altmode drivers Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 182/189] usb: gadget: midi2: Fix missing UMP group attributes initialization Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 183/189] usb: gadget: midi2: Fix MIDI2 IN EP max packet size Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 184/189] dmaengine: qcom: bam_dma: Fix DT error handling for num-channels/ees Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 185/189] dmaengine: dw: dmamux: Fix device reference leak in rzn1_dmamux_route_allocate Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 186/189] phy: qcom: qmp-pcie: Fix PHY initialization when powered down by firmware Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 187/189] phy: tegra: xusb: fix device and OF node leak at probe Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 188/189] phy: ti: omap-usb2: fix device leak at unbind Greg Kroah-Hartman
2025-09-17 12:34 ` [PATCH 6.16 189/189] phy: ti-pipe3: " Greg Kroah-Hartman
2025-09-17 18:09 ` [PATCH 6.16 000/189] 6.16.8-rc1 review Hardik Garg
2025-09-17 19:08 ` Achill Gilgenast
2025-09-17 20:08 ` Jon Hunter
2025-09-17 20:51 ` Pascal Ernster
2025-09-19  8:23   ` Pascal Ernster
2025-09-18  2:37 ` Peter Schneider
2025-09-18  3:07 ` Takeshi Ogasawara
2025-09-18  5:16 ` Brett A C Sheffield
2025-09-18 10:46 ` [PATCH 6.16 000/189] " Anders Roxell
2025-09-18 11:43 ` Dileep malepu
2025-09-18 12:46 ` Ron Economos
2025-09-18 18:02 ` Mark Brown
2025-09-18 18:22 ` Florian Fainelli
2025-09-18 19:21 ` Pavel Machek
2025-09-19 11:11 ` Christian Heusel

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=20250917123354.331140664@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=Slava.Dubeyko@ibm.com \
    --cc=amarkuze@redhat.com \
    --cc=idryomov@gmail.com \
    --cc=patches@lists.linux.dev \
    --cc=stable@vger.kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox