From: "Serge E. Hallyn" <serue-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
To: sukadev-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org
Cc: kyle-hoO6YkzgTuCM0SS3m2neIg@public.gmane.org,
sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org,
bastian-yyjItF7Rl6lg9hUCZPvPmw@public.gmane.org,
hpa-YMNOUZJC4hwAvxtiuMwx3w@public.gmane.org,
containers-qjLDD68F18O7TbgM5vRIOg@public.gmane.org,
xemul-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org,
alan-qBU/x9rampVanCEyBjwyrvXRex20P6io@public.gmane.org,
ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org
Subject: Re: [PATCH 06/10] Define mknod_ptmx()
Date: Wed, 24 Sep 2008 13:21:25 -0500 [thread overview]
Message-ID: <20080924182125.GF25255@us.ibm.com> (raw)
In-Reply-To: <20080912175237.GG17350-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
Quoting sukadev-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org (sukadev-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org):
>
> >From df5d5863f8601baa25237b60c3fcd614ee0b34aa Mon Sep 17 00:00:00 2001
> From: Sukadev Bhattiprolu <sukadev-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
> Date: Tue, 9 Sep 2008 10:23:07 -0700
> Subject: [PATCH 06/10] Define mknod_ptmx()
>
> /dev/ptmx is closely tied to the devpts filesystem. An open of /dev/ptmx,
> allocates the next pty index and the associated device shows up in the
> devpts fs as /dev/pts/n.
>
> Wih multiple instancs of devpts filesystem, during an open of /dev/ptmx
> we would be unable to determine which instance of the devpts is being
> accessed.
>
> So we move the 'ptmx' node into /dev/pts and use the inode of the 'ptmx'
> node to identify the superblock and hence the devpts instance. This patch
> adds ability for the kernel to internally create the [ptmx, c, 5:2] device
> when mounting devpts filesystem. Since the ptmx node in devpts is new and
> may surprise some userspace scripts, the default permissions for the new
> node is 0000. These permissions can be changed either using chmod or by
> remounting with the new '-o ptmxmode=0666' mount option.
>
> Changelog[v4]:
> - Change default permissions of pts/ptmx node to 0000.
> - Move code for ptmxmode under #ifdef CONFIG_DEVPTS_MULTIPLE_INSTANCES.
>
> Changelog[v3]:
> - Rename ptmx_mode to ptmxmode (for consistency with 'newinstance')
>
> Changelog[v2]:
> - [H. Peter Anvin] Remove mknod() system call support and create the
> ptmx node internally.
>
> Changelog[v1]:
> - Earlier version of this patch enabled creating /dev/pts/tty as
> well. As pointed out by Al Viro and H. Peter Anvin, that is not
> really necessary.
>
> Signed-off-by: Sukadev Bhattiprolu <sukadev-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
> ---
> fs/devpts/inode.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++-
> 1 files changed, 74 insertions(+), 2 deletions(-)
>
> diff --git a/fs/devpts/inode.c b/fs/devpts/inode.c
> index 7ae60aa..17e14f5 100644
> --- a/fs/devpts/inode.c
> +++ b/fs/devpts/inode.c
> @@ -27,6 +27,13 @@
> #define DEVPTS_SUPER_MAGIC 0x1cd1
>
> #define DEVPTS_DEFAULT_MODE 0600
> +/*
> + * ptmx is a new node in /dev/pts and will be unused in legacy (single-
> + * instance) mode. To prevent surprises in user space, set permissions of
> + * ptmx to 0. Use 'chmod' or remount with '-o ptmxmode' to set meaningful
> + * permissions.
> + */
> +#define DEVPTS_DEFAULT_PTMX_MODE 0000
> #define PTMX_MINOR 2
>
> extern int pty_limit; /* Config limit on Unix98 ptys */
> @@ -40,10 +47,11 @@ struct pts_mount_opts {
> uid_t uid;
> gid_t gid;
> umode_t mode;
> + umode_t ptmxmode;
> };
>
> enum {
> - Opt_uid, Opt_gid, Opt_mode,
> + Opt_uid, Opt_gid, Opt_mode, Opt_ptmxmode,
> Opt_err
> };
>
> @@ -51,6 +59,9 @@ static match_table_t tokens = {
> {Opt_uid, "uid=%u"},
> {Opt_gid, "gid=%u"},
> {Opt_mode, "mode=%o"},
> +#ifdef CONFIG_DEVPTS_MULTIPLE_INSTANCES
> + {Opt_ptmxmode, "ptmxmode=%o"},
> +#endif
> {Opt_err, NULL}
> };
>
> @@ -81,6 +92,7 @@ static int parse_mount_options(char *data, struct pts_mount_opts *opts)
> opts->uid = 0;
> opts->gid = 0;
> opts->mode = DEVPTS_DEFAULT_MODE;
> + opts->ptmxmode = DEVPTS_DEFAULT_PTMX_MODE;
>
> while ((p = strsep(&data, ",")) != NULL) {
> substring_t args[MAX_OPT_ARGS];
> @@ -109,6 +121,13 @@ static int parse_mount_options(char *data, struct pts_mount_opts *opts)
> return -EINVAL;
> opts->mode = option & S_IALLUGO;
> break;
> +#ifdef CONFIG_DEVPTS_MULTIPLE_INSTANCES
> + case Opt_ptmxmode:
> + if (match_octal(&args[0], &option))
> + return -EINVAL;
> + opts->ptmxmode = option & S_IALLUGO;
> + break;
> +#endif
> default:
> printk(KERN_ERR "devpts: called with bogus options\n");
> return -EINVAL;
> @@ -118,6 +137,55 @@ static int parse_mount_options(char *data, struct pts_mount_opts *opts)
> return 0;
> }
>
> +#ifdef CONFIG_DEVPTS_MULTIPLE_INSTANCES
> +static int mknod_ptmx(struct super_block *sb)
> +{
> + struct dentry *root;
> + struct dentry *dentry;
> + struct inode *inode;
> + struct pts_fs_info *fsi = DEVPTS_SB(sb);
> + struct pts_mount_opts *opts = &fsi->mount_opts;
> + int mode;
> +
> + root = sb->s_root;
> + dentry = lookup_one_len("ptmx", root, 4);
I realize you intend for this to only be used before mount is completed,
but it still seems like a good idea to have this grab the root inode
mutex.
> + if (IS_ERR(dentry)) {
> + printk(KERN_ERR "Unable to alloc dentry for ptmx node\n");
> + return -ENOMEM;
> + }
> +
> + if (dentry->d_inode) {
> + printk(KERN_ERR "'ptmx' (ino %lu) exists in this devpts\n",
> + dentry->d_inode->i_ino);
> + return 0;
> + }
> +
> + /*
> + * Create a new 'ptmx' node in this mount of devpts.
> + */
> + inode = new_inode(sb);
> + if (!inode) {
> + printk(KERN_ERR "Unable to alloc inode for ptmx node\n");
> + dput(dentry);
> + return -ENOMEM;
> + }
> +
> + inode->i_uid = inode->i_gid = 0;
As we've discussed, you need to reserve inode number 2 for ptmx, set
inode->i_ino to 2 here, and then set inode->i_ino to the pty_index+3
when creating a new pty.
> + inode->i_blocks = 0;
> + inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
> +
> + mode = S_IFCHR|opts->ptmxmode;
> + init_special_inode(inode, mode, MKDEV(TTYAUX_MAJOR, 2));
> +
> + d_add(dentry, inode);
> +
> + printk(KERN_DEBUG "Created ptmx node in devpts ino %lu\n",
> + inode->i_ino);
> +
> + return 0;
> +}
> +#endif
> +
> static int devpts_remount(struct super_block *sb, int *flags, char *data)
> {
> struct pts_fs_info *fsi = DEVPTS_SB(sb);
> @@ -136,6 +204,9 @@ static int devpts_show_options(struct seq_file *seq, struct vfsmount *vfs)
> if (opts->setgid)
> seq_printf(seq, ",gid=%u", opts->gid);
> seq_printf(seq, ",mode=%03o", opts->mode);
> +#ifdef CONFIG_DEVPTS_MULTIPLE_INSTANCES
> + seq_printf(seq, ",ptmxmode=%03o", opts->ptmxmode);
> +#endif
>
> return 0;
> }
> @@ -156,6 +227,7 @@ static void *new_pts_fs_info(void)
>
> ida_init(&fsi->allocated_ptys);
> fsi->mount_opts.mode = DEVPTS_DEFAULT_MODE;
> + fsi->mount_opts.ptmxmode = DEVPTS_DEFAULT_PTMX_MODE;
>
> return fsi;
> }
> @@ -211,7 +283,7 @@ static void devpts_kill_sb(struct super_block *sb)
> struct pts_fs_info *fsi = DEVPTS_SB(sb);
>
> kfree(fsi);
> - kill_anon_super(sb);
> + kill_litter_super(sb);
> }
>
> static struct file_system_type devpts_fs_type = {
> --
> 1.5.2.5
next prev parent reply other threads:[~2008-09-24 18:21 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-09-12 17:48 [PATCH 0/10][v4]: Enable multiple devpts instances sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20080912174845.GA17350-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-12 17:50 ` [PATCH 01/10] Remove devpts_root global sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20080912175057.GB17350-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-24 17:04 ` Serge E. Hallyn
2008-09-12 17:51 ` [PATCH 02/10] Per-mount allocated_ptys sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20080912175116.GC17350-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-24 17:14 ` Serge E. Hallyn
[not found] ` <20080924171408.GB25255-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-27 1:12 ` sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8
2008-09-12 17:51 ` [PATCH 03/10] Per-mount 'config' object sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20080912175135.GD17350-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-24 17:20 ` Serge E. Hallyn
2008-09-12 17:51 ` [PATCH 04/10] Extract option parsing to new function sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20080912175153.GE17350-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-24 17:23 ` Serge E. Hallyn
2008-09-12 17:52 ` [PATCH 05/10] Add DEVPTS_MULTIPLE_INSTANCES config token sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20080912175210.GF17350-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-24 17:24 ` Serge E. Hallyn
2008-09-12 17:52 ` [PATCH 06/10] Define mknod_ptmx() sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20080912175237.GG17350-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-24 18:21 ` Serge E. Hallyn [this message]
[not found] ` <20080924182125.GF25255-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-26 21:32 ` sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8
2008-09-24 18:50 ` Serge E. Hallyn
[not found] ` <20080924185046.GA31535-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-26 21:29 ` sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8
[not found] ` <20080926212954.GE31505-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-29 13:14 ` Serge E. Hallyn
2008-09-12 17:52 ` [PATCH 07/10] Update ptmx permissions during remount sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20080912175252.GH17350-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-24 18:30 ` Serge E. Hallyn
2008-09-12 17:53 ` [PATCH 08/10] Define get_sb_ref() sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20080912175308.GI17350-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-24 19:20 ` Serge E. Hallyn
2008-09-24 19:55 ` Dave Hansen
2008-09-26 21:21 ` sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8
[not found] ` <20080926212115.GD31505-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-26 21:31 ` Dave Hansen
2008-09-27 0:47 ` sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8
[not found] ` <20080927004727.GA2161-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-29 14:00 ` Cedric Le Goater
[not found] ` <48E0DF71.2070007-NmTC/0ZBporQT0dZR+AlfA@public.gmane.org>
2008-09-30 15:13 ` Serge E. Hallyn
[not found] ` <20080930151325.GA26713-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-10-01 12:38 ` Cedric Le Goater
2008-09-27 20:29 ` sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8
[not found] ` <20080927202924.GA16208-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-10-04 3:09 ` sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8
2008-09-12 17:53 ` [PATCH 09/10] Enable multiple instances of devpts sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20080912175322.GJ17350-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-24 20:26 ` Serge E. Hallyn
[not found] ` <20080924202616.GB31664-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-26 21:03 ` sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8
[not found] ` <20080926210347.GB31505-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-29 13:01 ` Serge E. Hallyn
[not found] ` <20080929130131.GA12531-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-29 15:18 ` sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8
[not found] ` <20080929151828.GA10202-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-29 15:29 ` Serge E. Hallyn
[not found] ` <20080929152951.GA32518-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-29 15:58 ` Cedric Le Goater
2008-09-29 14:06 ` Cedric Le Goater
2008-09-12 17:53 ` [PATCH 10/10] Document usage of multiple-instances " sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20080912175347.GK17350-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-19 15:33 ` Alan Cox
[not found] ` <20080919163311.626b715f-qBU/x9rampVanCEyBjwyrvXRex20P6io@public.gmane.org>
2008-09-19 16:53 ` H. Peter Anvin
2008-09-20 16:17 ` sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8
[not found] ` <20080920161717.GA23693-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-22 13:29 ` Serge E. Hallyn
[not found] ` <20080922132937.GA11932-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-22 19:25 ` Serge E. Hallyn
2008-09-22 16:16 ` Serge E. Hallyn
[not found] ` <20080922161658.GA27087-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-22 16:33 ` sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8
2008-09-24 20:36 ` Serge E. Hallyn
[not found] ` <20080924203650.GC31664-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-26 21:05 ` sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8
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=20080924182125.GF25255@us.ibm.com \
--to=serue-r/jw6+rmf7hqt0dzr+alfa@public.gmane.org \
--cc=alan-qBU/x9rampVanCEyBjwyrvXRex20P6io@public.gmane.org \
--cc=bastian-yyjItF7Rl6lg9hUCZPvPmw@public.gmane.org \
--cc=containers-qjLDD68F18O7TbgM5vRIOg@public.gmane.org \
--cc=ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org \
--cc=hpa-YMNOUZJC4hwAvxtiuMwx3w@public.gmane.org \
--cc=kyle-hoO6YkzgTuCM0SS3m2neIg@public.gmane.org \
--cc=sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org \
--cc=sukadev-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org \
--cc=xemul-GEFAQzZX7r8dnm+yROfE0A@public.gmane.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 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.