From: Josef Bacik <josef@toxicpanda.com>
To: Christian Brauner <brauner@kernel.org>,
James Bottomley <James.Bottomley@HansenPartnership.com>,
Andrew Halaney <andrew@amutable.com>,
Jeremy Bingham <jbingham@gmail.com>,
Tahera Fahimi <taherafahimi@linux.microsoft.com>,
Serge Hallyn <sergeh@kernel.org>
Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org,
Josef Bacik <josef@toxicpanda.com>
Subject: [PATCH RFC v3 40/90] pidfd: add PIDFD_EMPTY
Date: Thu, 05 Nov 2026 15:02:32 +0000 [thread overview]
Message-ID: <20261105-b4-cells-v3-40-bc9095937a84@toxicpanda.com> (raw)
In-Reply-To: <20261105-b4-cells-v3-0-bc9095937a84@toxicpanda.com>
Do for tasks what fsopen() did for mounts. pidfd_open() with PIDFD_EMPTY
returns a pidfd that has no task yet. The caller then describes the task
and starts it.
It is an ordinary pidfd, for a struct pid that has no task and no numbers.
Everything that takes a pidfd already handles a pidfd without a task: it
returns ESRCH, or ECHILD in the case of waitid(). Once the task exists it
is still the same pidfd on the same inode, and pidfd_open() on the pid of
the task finds that inode.
pidfs itself needs changes, because it takes a missing task to mean that
the task has exited. Teach it the difference between "no task yet" and "no
task any more" in three places:
- poll() must not report an exit.
- PIDFD_GET_INFO has no exit status to report.
- fdinfo shows "Pid: 0" instead of -1.
The namespace ioctls already return ESRCH, and a struct pid without
numbers cannot be found by file handle.
Nothing is reserved ahead of time. The struct pid gets its numbers when
the task is created. So the task that is started first becomes the init of
its pid namespace, an empty pidfd that is closed leaves nothing behind,
and one that is never started does not keep zap_pid_ns_processes()
waiting.
The size of a struct pid depends on the level of its pid namespace, so the
namespace must be known when the pidfd is created. With PIDFD_EMPTY the
first argument of pidfd_open() is therefore a cellfd instead of a pid.
Such a task would be useful outside of a cell as well. That is not
implemented, and -EBADF in place of the cellfd is reserved for it.
The configuration is attached to the file. So only the file that
pidfd_open() returned can be used to configure the task, no matter who
else can open a pidfd for it.
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
---
fs/pidfs.c | 27 ++++++++---
include/linux/cell.h | 11 +++++
include/uapi/linux/pidfd.h | 1 +
kernel/embryo.c | 117 +++++++++++++++++++++++++++++++++++++++++++++
kernel/pid.c | 5 ++
5 files changed, 155 insertions(+), 6 deletions(-)
diff --git a/fs/pidfs.c b/fs/pidfs.c
index ef305cc359eb..b1c1e0ea1e4a 100644
--- a/fs/pidfs.c
+++ b/fs/pidfs.c
@@ -1,5 +1,6 @@
// SPDX-License-Identifier: GPL-2.0
#include <linux/anon_inodes.h>
+#include <linux/cell.h>
#include <linux/compat.h>
#include <linux/exportfs.h>
#include <linux/file.h>
@@ -278,6 +279,9 @@ static void pidfd_show_fdinfo(struct seq_file *m, struct file *f)
if (likely(pid_has_task(pid, PIDTYPE_PID))) {
ns = proc_pid_ns(file_inode(m->file)->i_sb);
nr = pid_nr_ns(pid, ns);
+ } else if (embryo_pidfd_is_empty(f)) {
+ /* No task yet is not the same as no task any more. */
+ nr = 0;
}
seq_put_decimal_ll(m, "Pid:\t", nr);
@@ -310,6 +314,9 @@ static __poll_t pidfd_poll(struct file *file, struct poll_table_struct *pts)
__poll_t poll_flags = 0;
poll_wait(file, &pid->wait_pidfd, pts);
+ /* No task yet is not the same as no task any more. */
+ if (embryo_pidfd_is_empty(file))
+ return 0;
/*
* Don't wake waiters if the thread-group leader exited
* prematurely. They either get notified when the last subthread
@@ -437,6 +444,10 @@ static long pidfd_info(struct file *file, unsigned int cmd, unsigned long arg)
*/
if (!(mask & PIDFD_INFO_EXIT))
return -ESRCH;
+ /* What was opened empty may never have had a task to exit. */
+ if ((file->f_flags & PIDFD_EMPTY) &&
+ !test_bit(PIDFS_ATTR_BIT_EXIT, &attr->attr_mask))
+ return -ESRCH;
goto copy_out;
}
@@ -729,6 +740,9 @@ static int pidfs_file_release(struct inode *inode, struct file *file)
struct pid *pid = inode->i_private;
struct task_struct *task;
+ if (file->f_flags & PIDFD_EMPTY)
+ embryo_pidfd_release(file);
+
if (!(file->f_flags & PIDFD_AUTOKILL))
return 0;
@@ -1004,7 +1018,8 @@ static struct file *pidfs_dentry_open(const struct path *path,
file = dentry_open(path, flags | O_RDWR, cred);
/* do_dentry_open() strips O_EXCL and O_TRUNC. */
if (!IS_ERR(file))
- file->f_flags |= flags & (PIDFD_THREAD | PIDFD_AUTOKILL);
+ file->f_flags |= flags & (PIDFD_THREAD | PIDFD_AUTOKILL |
+ PIDFD_EMPTY);
return file;
}
@@ -1033,10 +1048,10 @@ static int pidfs_export_permission(struct handle_to_path_ctx *ctx,
static struct file *pidfs_export_open(const struct path *path, unsigned int oflags)
{
/*
- * Opening via file handle may never raise PIDFD_AUTOKILL. That can
- * only be done at task creation!
+ * Opening via file handle may never raise PIDFD_AUTOKILL or
+ * PIDFD_EMPTY. That can only be done at task creation, or ahead of it!
*/
- if (WARN_ON_ONCE(oflags & PIDFD_AUTOKILL))
+ if (WARN_ON_ONCE(oflags & (PIDFD_AUTOKILL | PIDFD_EMPTY)))
return ERR_PTR(-EINVAL);
/* Clear O_LARGEFILE as open_by_handle_at() forces it. */
return pidfs_dentry_open(path, oflags & ~O_LARGEFILE, current_cred());
@@ -1226,8 +1241,8 @@ struct file *pidfs_alloc_file(struct pid *pid, unsigned int flags)
* Ensure that internal pidfd flags don't overlap with each
* other or with uapi pidfd flags.
*/
- BUILD_BUG_ON(hweight32(PIDFD_THREAD | PIDFD_NONBLOCK |
- PIDFD_STALE | PIDFD_AUTOKILL) != 4);
+ BUILD_BUG_ON(hweight32(PIDFD_THREAD | PIDFD_NONBLOCK | PIDFD_STALE |
+ PIDFD_AUTOKILL | PIDFD_EMPTY) != 5);
ret = path_from_stashed(&pid->stashed, pidfs_mnt, get_pid(pid), &path);
if (ret < 0)
diff --git a/include/linux/cell.h b/include/linux/cell.h
index f9975b0fb65c..a68638b7319d 100644
--- a/include/linux/cell.h
+++ b/include/linux/cell.h
@@ -217,4 +217,15 @@ static inline void embryo_fork_finish(struct kernel_clone_args *a, struct task_s
#endif
+/* An empty pidfd. */
+#ifdef CONFIG_CELLS
+int embryo_pidfd_open(int cfd, unsigned int flags);
+bool embryo_pidfd_is_empty(const struct file *file);
+void embryo_pidfd_release(struct file *file);
+#else
+static inline int embryo_pidfd_open(int cfd, unsigned int flags) { return -EINVAL; }
+static inline bool embryo_pidfd_is_empty(const struct file *file) { return false; }
+static inline void embryo_pidfd_release(struct file *file) { }
+#endif
+
#endif /* _LINUX_CELL_H */
diff --git a/include/uapi/linux/pidfd.h b/include/uapi/linux/pidfd.h
index 0919246a1611..eb3704687c04 100644
--- a/include/uapi/linux/pidfd.h
+++ b/include/uapi/linux/pidfd.h
@@ -10,6 +10,7 @@
/* Flags for pidfd_open(). */
#define PIDFD_NONBLOCK O_NONBLOCK
#define PIDFD_THREAD O_EXCL
+#define PIDFD_EMPTY O_NOCTTY /* No task yet. See pidfd_configure(). */
#ifdef __KERNEL__
#include <linux/sched.h>
#define PIDFD_STALE CLONE_PIDFD
diff --git a/kernel/embryo.c b/kernel/embryo.c
index 163115c56ab4..e052c09f9192 100644
--- a/kernel/embryo.c
+++ b/kernel/embryo.c
@@ -125,3 +125,120 @@ void embryo_fork_finish(struct kernel_clone_args *args, struct task_struct *p)
embryo_put(e);
}
}
+
+static int embryo_pidfd_create(struct embryo *e, unsigned int flags)
+{
+ struct file *file;
+
+ CLASS(get_unused_fd, fd)(O_CLOEXEC);
+ if (fd < 0)
+ return fd;
+ file = pidfs_alloc_file(e->pid, flags | O_RDWR);
+ if (IS_ERR(file))
+ return PTR_ERR(file);
+
+ file->private_data = e;
+ fd_install(fd, file);
+ return take_fd(fd);
+}
+
+/**
+ * embryo_pidfd_open - pidfd_open() with PIDFD_EMPTY
+ * @cfd: the cell the task is going to be in
+ * @flags: PIDFD_EMPTY, and PIDFD_NONBLOCK if wanted
+ *
+ * The struct pid is made here and gets no numbers before the task is started.
+ * Its size goes by the pid namespace, which is why the cell has to be known by
+ * now. It reserves nothing in there: whichever task is started first is the init
+ * of the cell, and a pidfd that is left empty keeps no cell from dying.
+ *
+ * Return: the pidfd, which is always close-on-exec, -EPERM if the caller is in a
+ * cell, -EOPNOTSUPP without a cell, what cell_fork_prepare() has to say about the
+ * cell, or another negative error.
+ */
+int embryo_pidfd_open(int cfd, unsigned int flags)
+{
+ struct embryo *e;
+ struct cell *cell;
+ int ret;
+
+ if (flags & ~(PIDFD_EMPTY | PIDFD_NONBLOCK))
+ return -EINVAL;
+ /* Whatever the file descriptor is. */
+ if (!cell_may_spawn())
+ return -EPERM;
+ /* A task like this outside of a cell makes sense. It is not done yet. */
+ if (cfd == -EBADF)
+ return -EOPNOTSUPP;
+
+ CLASS(fd, f)(cfd);
+ if (fd_empty(f))
+ return -EBADF;
+ cell = cell_from_file(fd_file(f));
+ if (!cell)
+ return -EINVAL;
+
+ e = kzalloc_obj(struct embryo, GFP_KERNEL_ACCOUNT);
+ if (!e)
+ return -ENOMEM;
+ refcount_set(&e->ref, 1);
+ mutex_init(&e->lock);
+ init_completion(&e->done);
+
+ ret = cell_fork_prepare(cell);
+ if (ret) {
+ kfree(e);
+ return ret;
+ }
+ e->pid = alloc_pid_struct(cell_nsproxy(cell)->pid_ns_for_children);
+ e->cell = cell_get(cell);
+ cell_fork_finish(cell);
+
+ ret = -ENOMEM;
+ if (!e->pid)
+ goto err_put;
+ ret = pidfs_add_pid(e->pid);
+ if (ret)
+ goto err_pid;
+ ret = embryo_pidfd_create(e, flags);
+ if (ret >= 0)
+ return ret;
+err_pid:
+ free_pid_struct(e->pid);
+err_put:
+ embryo_put(e);
+ return ret;
+}
+
+/**
+ * embryo_pidfd_is_empty - is there no task yet, rather than no task any more?
+ * @file: a pidfd
+ *
+ * Return: true for what pidfd_open() returned for PIDFD_EMPTY, until there is a
+ * task or it is known that there never will be.
+ */
+bool embryo_pidfd_is_empty(const struct file *file)
+{
+ const struct embryo *e = file->private_data;
+
+ return (file->f_flags & PIDFD_EMPTY) && !READ_ONCE(e->settled);
+}
+
+/**
+ * embryo_pidfd_release - what pidfd_open() returned for PIDFD_EMPTY was closed
+ * @file: the pidfd
+ *
+ * A task that was started is left alone. If there never was one, neither is
+ * there anything to kill.
+ *
+ * Context: The ->release() of the file.
+ */
+void embryo_pidfd_release(struct file *file)
+{
+ struct embryo *e = file->private_data;
+
+ /* Otherwise free_pid() has dropped, or is going to drop, that reference. */
+ if (!pid_has_numbers(e->pid))
+ free_pid_struct(e->pid);
+ embryo_put(e);
+}
diff --git a/kernel/pid.c b/kernel/pid.c
index 0611406e9a9a..9b75daf407ca 100644
--- a/kernel/pid.c
+++ b/kernel/pid.c
@@ -39,6 +39,7 @@
#include <linux/proc_ns.h>
#include <linux/refcount.h>
#include <linux/anon_inodes.h>
+#include <linux/cell.h>
#include <linux/sched/signal.h>
#include <linux/sched/task.h>
#include <linux/idr.h>
@@ -760,6 +761,10 @@ SYSCALL_DEFINE2(pidfd_open, pid_t, pid, unsigned int, flags)
int fd;
struct pid *p;
+ /* There is no task to name yet. @pid says where it is going to be. */
+ if (flags & PIDFD_EMPTY)
+ return embryo_pidfd_open(pid, flags);
+
if (flags & ~(PIDFD_NONBLOCK | PIDFD_THREAD))
return -EINVAL;
--
2.55.0
next prev parent reply other threads:[~2026-11-05 15:14 UTC|newest]
Thread overview: 93+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-05 14:56 [PATCH RFC v3 00/90] cells: a container as one kernel object Josef Bacik
2026-11-05 14:56 ` [PATCH RFC v3 01/90] Documentation: add a design document for cells Josef Bacik
2026-11-05 17:06 ` Serge E. Hallyn
2026-11-05 18:23 ` Josef Bacik
2026-11-05 14:56 ` [PATCH RFC v3 02/90] Documentation: add examples " Josef Bacik
2026-11-05 14:56 ` [PATCH RFC v3 03/90] cells: reserve a window of ids Josef Bacik
2026-11-05 14:56 ` [PATCH RFC v3 04/90] user_namespace: let a cell own a user namespace Josef Bacik
2026-11-05 14:56 ` [PATCH RFC v3 05/90] user_namespace: refuse setns() into a cell Josef Bacik
2026-11-05 14:56 ` [PATCH RFC v3 06/90] capability: give the owner no say over " Josef Bacik
2026-11-05 14:56 ` [PATCH RFC v3 07/90] ucount: count the id blocks a user holds Josef Bacik
2026-11-05 14:56 ` [PATCH RFC v3 08/90] user_namespace: let the kernel map the ids of a cell Josef Bacik
2026-11-05 14:57 ` [PATCH RFC v3 09/90] user_namespace: keep legacy maps out of the window Josef Bacik
2026-11-05 14:57 ` [PATCH RFC v3 10/90] user: add uid_range_in_use() Josef Bacik
2026-11-05 14:57 ` [PATCH RFC v3 11/90] keys: add key_user_range_in_use() Josef Bacik
2026-11-05 14:57 ` [PATCH RFC v3 12/90] fs: add kuid_has_fsmapping() and kgid_has_fsmapping() Josef Bacik
2026-11-05 14:57 ` [PATCH RFC v3 13/90] fs: never store an id that was lent to a cell Josef Bacik
2026-11-05 14:57 ` [PATCH RFC v3 14/90] fs: take no id of a cell for a mount option Josef Bacik
2026-11-05 14:57 ` [PATCH RFC v3 15/90] fs: let an idmapping pin the ids of a cell Josef Bacik
2026-11-05 14:57 ` [PATCH RFC v3 16/90] cgroup: let a cgroup become the budget " Josef Bacik
2026-11-05 14:57 ` [PATCH RFC v3 17/90] cgroup: add cgroup_cell_chown() Josef Bacik
2026-11-05 14:57 ` [PATCH RFC v3 18/90] cgroup: give the budget of a cell back Josef Bacik
2026-11-05 14:57 ` [PATCH RFC v3 19/90] cgroup: add cgroup_cell_kill() Josef Bacik
2026-11-05 14:57 ` [PATCH RFC v3 20/90] cgroup: root a cgroup namespace at a given cgroup Josef Bacik
2026-11-05 14:57 ` [PATCH RFC v3 21/90] fs: seal a mount namespace for a cell Josef Bacik
2026-11-05 14:57 ` [PATCH RFC v3 22/90] nsfs: make open_namespace() available outside of fs/ Josef Bacik
2026-11-05 14:57 ` [PATCH RFC v3 23/90] nsproxy: build the nsproxy the tasks of a cell share Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 24/90] cells: add the cell object and cell_create() Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 25/90] cells: add cell_kill() Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 26/90] cells: add cell_configure() Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 27/90] cells: add the "budget" slot Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 28/90] cells: add the "root" slot Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 29/90] cells: add the "ids" slot, for a single id Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 30/90] cells: lend a cell a block of ids Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 31/90] cells: reserve the "spawn" slot Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 32/90] cells: add CELL_CMD_SEAL Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 33/90] cells: add cell_open() Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 34/90] pid: allocate a struct pid ahead of its numbers Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 35/90] fork: let copy_process() place a task in a cell Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 36/90] cgroup: fork a task of a cell into the budget Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 37/90] x86: give a task without an mm no user state Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 38/90] uprobes: cope with a new task that has no mm Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 39/90] fork: add tasks that start out with nothing Josef Bacik
2026-11-05 15:02 ` Josef Bacik [this message]
2026-11-05 15:02 ` [PATCH RFC v3 41/90] pidfd: add pidfd_configure() Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 42/90] pidfd: let pidfd_configure() place files Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 43/90] pidfd: let pidfd_configure() set credentials Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 44/90] pidfd: let pidfd_configure() name a cgroup to start in Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 45/90] ptrace: keep everybody off an embryo Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 46/90] cells: end a cell when its init exits Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 47/90] cells: refuse a task of a cell a change of namespaces Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 48/90] fs: refuse a task of a cell a new mount namespace Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 49/90] nsproxy: refuse to enter a namespace of a cell Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 50/90] cgroup: keep a task of a cell within the budget Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 51/90] cgroup: let nothing but a spawn into a budget Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 52/90] kernfs: let a filesystem refuse a change to a node Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 53/90] cgroup: let a cell change nothing outside its budget Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 54/90] cgroup: leave the limits of a budget to who is above Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 55/90] fs: let a filesystem hold ids that go with the cell Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 56/90] cgroup: let a cell make cgroups below its budget Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 57/90] resctrl: let a cell change nothing Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 58/90] cred: let no id count across cells Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 59/90] ptrace: refuse PTRACE_TRACEME " Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 60/90] keys: ignore an equal uid or gid " Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 61/90] fs: accept a cellfd for MOUNT_ATTR_IDMAP Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 62/90] fs: let a cell set no set-id bits Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 63/90] fs: drop privileges from what a cell may write to Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 64/90] cells: add the "caps" slot Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 65/90] capabilities: take nothing from a file in a cell Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 66/90] capabilities: let a cell shrink its bounding sets Josef Bacik
2026-11-05 15:02 ` [PATCH RFC v3 67/90] af_unix: deliver ancillary data only within a cell Josef Bacik
2026-11-05 15:03 ` [PATCH RFC v3 68/90] af_unix: tell a sender that control data will not cross Josef Bacik
2026-11-05 15:03 ` [PATCH RFC v3 69/90] net: do not identify a peer in another cell Josef Bacik
2026-11-05 15:03 ` [PATCH RFC v3 70/90] seccomp: let a listener put no file into a cell Josef Bacik
2026-11-05 15:03 ` [PATCH RFC v3 71/90] umh: run no program for a task of " Josef Bacik
2026-11-05 15:03 ` [PATCH RFC v3 72/90] coredump: let no core dump leave " Josef Bacik
2026-11-05 15:03 ` [PATCH RFC v3 73/90] cells: add the "net" slot Josef Bacik
2026-11-05 15:03 ` [PATCH RFC v3 74/90] net: give a cell without a network no sockets Josef Bacik
2026-11-05 15:03 ` [PATCH RFC v3 75/90] net: add net_may() Josef Bacik
2026-11-05 15:03 ` [PATCH RFC v3 76/90] rtnetlink: use net_may() for requests that change state Josef Bacik
2026-11-05 15:03 ` [PATCH RFC v3 77/90] net: use net_may() in the configuration ioctls Josef Bacik
2026-11-05 15:03 ` [PATCH RFC v3 78/90] netfilter: use net_may() for configuration Josef Bacik
2026-11-05 15:03 ` [PATCH RFC v3 79/90] tun: use net_may() to create and attach to devices Josef Bacik
2026-11-05 15:03 ` [PATCH RFC v3 80/90] net: use net_may() for the net sysctls Josef Bacik
2026-11-05 15:03 ` [PATCH RFC v3 81/90] net: use net_may() for privileged socket options Josef Bacik
2026-11-05 15:03 ` [PATCH RFC v3 82/90] net: use net_may() for raw and packet sockets Josef Bacik
2026-11-05 15:03 ` [PATCH RFC v3 83/90] cells: add the "net-rights" slot Josef Bacik
2026-11-05 15:03 ` [PATCH RFC v3 84/90] net: honour the rights of a cell in net_may() Josef Bacik
2026-11-05 15:03 ` [PATCH RFC v3 85/90] tun: ignore an equal uid or gid across cells Josef Bacik
2026-11-05 15:03 ` [PATCH RFC v3 86/90] cells: add cell_info() Josef Bacik
2026-11-05 15:03 ` [PATCH RFC v3 87/90] cells: add CONFIG_CELLS Josef Bacik
2026-11-05 15:03 ` [PATCH RFC v3 88/90] arch: wire up the cell system calls Josef Bacik
2026-11-05 15:03 ` [PATCH RFC v3 89/90] MAINTAINERS: add an entry for cells Josef Bacik
2026-11-05 15:03 ` [PATCH RFC v3 90/90] selftests: add tests " Josef Bacik
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=20261105-b4-cells-v3-40-bc9095937a84@toxicpanda.com \
--to=josef@toxicpanda.com \
--cc=James.Bottomley@HansenPartnership.com \
--cc=andrew@amutable.com \
--cc=brauner@kernel.org \
--cc=jbingham@gmail.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=sergeh@kernel.org \
--cc=taherafahimi@linux.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®