From: sukadev-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org
To: hpa-YMNOUZJC4hwAvxtiuMwx3w@public.gmane.org,
alan-qBU/x9rampVanCEyBjwyrvXRex20P6io@public.gmane.org
Cc: kyle-hoO6YkzgTuCM0SS3m2neIg@public.gmane.org,
ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org,
bastian-yyjItF7Rl6lg9hUCZPvPmw@public.gmane.org,
containers-qjLDD68F18O7TbgM5vRIOg@public.gmane.org,
sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org,
xemul-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org
Subject: [PATCH 10/11][v3]: Ability to internally create ptmx
Date: Wed, 3 Sep 2008 22:35:22 -0700 [thread overview]
Message-ID: <20080904053522.GK3680@us.ibm.com> (raw)
In-Reply-To: <20080904052718.GA3680-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
From: Sukadev Bhattiprolu <sukadev-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
Subject: [PATCH 10/11]: Ability to internally create 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. The permissions for the device node can
be specified by the '-o ptmxmode=0666' option. The default 'ptmxmode' is
0666.
See next patch ("PATCH [11/11] Enable multiple instances of devpts") for
usage of this interface, user-space impact and backward compatibility issues
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 | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 60 insertions(+), 2 deletions(-)
Index: linux-2.6.27-rc3-tty/fs/devpts/inode.c
===================================================================
--- linux-2.6.27-rc3-tty.orig/fs/devpts/inode.c 2008-09-03 21:33:46.000000000 -0700
+++ linux-2.6.27-rc3-tty/fs/devpts/inode.c 2008-09-03 21:34:36.000000000 -0700
@@ -27,6 +27,7 @@
#define DEVPTS_SUPER_MAGIC 0x1cd1
#define DEVPTS_DEFAULT_MODE 0600
+#define DEVPTS_DEFAULT_PTMX_MODE 0666
#define PTMX_MINOR 2
extern int pty_limit; /* Config limit on Unix98 ptys */
@@ -40,10 +41,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 +53,7 @@ static match_table_t tokens = {
{Opt_uid, "uid=%u"},
{Opt_gid, "gid=%u"},
{Opt_mode, "mode=%o"},
+ {Opt_ptmxmode, "ptmxmode=%o"},
{Opt_err, NULL}
};
@@ -81,6 +84,7 @@ static int parse_mount_options(char *dat
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 +113,11 @@ static int parse_mount_options(char *dat
return -EINVAL;
opts->mode = option & S_IALLUGO;
break;
+ case Opt_ptmxmode:
+ if (match_octal(&args[0], &option))
+ return -EINVAL;
+ opts->ptmxmode = option & S_IALLUGO;
+ break;
default:
printk(KERN_ERR "devpts: called with bogus options\n");
return -EINVAL;
@@ -136,6 +145,7 @@ static int devpts_show_options(struct se
if (opts->setgid)
seq_printf(seq, ",gid=%u", opts->gid);
seq_printf(seq, ",mode=%03o", opts->mode);
+ seq_printf(seq, ",ptmxmode=%03o", opts->ptmxmode);
return 0;
}
@@ -156,6 +166,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;
}
@@ -201,6 +212,53 @@ fail:
return -ENOMEM;
}
+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);
+ 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;
+ 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); // d_instantiate() should be enough ?
+
+ printk(KERN_DEBUG "Created ptmx node in devpts ino %lu\n",
+ inode->i_ino);
+
+ return 0;
+}
+
static int devpts_get_sb(struct file_system_type *fs_type,
int flags, const char *dev_name, void *data, struct vfsmount *mnt)
{
@@ -213,7 +271,7 @@ static void devpts_kill_sb(struct super_
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 = {
next prev parent reply other threads:[~2008-09-04 5:35 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-09-04 5:27 [PATCH 0/11][v3]: Enable multiple mounts of devpts sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20080904052718.GA3680-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-04 5:29 ` [PATCH 1/11][v3]: Move tty lookup/reopen to tty_open sukadev-r/Jw6+rmf7HQT0dZR+AlfA
2008-09-04 5:30 ` [PATCH 2/11][v3]: Add an instance parameter devpts interfaces sukadev-r/Jw6+rmf7HQT0dZR+AlfA
2008-09-04 5:31 ` [PATCH 3/11][v3]: Simplify devpts_get_tty() sukadev-r/Jw6+rmf7HQT0dZR+AlfA
2008-09-04 5:32 ` [PATCH 4/11][v3]: Simplify devpts_pty_new() sukadev-r/Jw6+rmf7HQT0dZR+AlfA
2008-09-04 5:32 ` [PATCH 5/11][v3]: Simplify devpts_pty_kill sukadev-r/Jw6+rmf7HQT0dZR+AlfA
2008-09-04 5:33 ` [PATCH 6/11][v3]: Remove devpts_root global sukadev-r/Jw6+rmf7HQT0dZR+AlfA
2008-09-04 5:33 ` [PATCH 7/11][v3]: Per-mount allocated_ptys sukadev-r/Jw6+rmf7HQT0dZR+AlfA
2008-09-04 5:34 ` [PATCH 8/11][v3]: Per-mount 'config' object sukadev-r/Jw6+rmf7HQT0dZR+AlfA
2008-09-04 5:34 ` [PATCH 9/11][v3]: Extract option parsing to new function sukadev-r/Jw6+rmf7HQT0dZR+AlfA
2008-09-04 5:35 ` sukadev-r/Jw6+rmf7HQT0dZR+AlfA [this message]
2008-09-04 5:35 ` [PATCH 11/11][v3]: Enable multiple instances of devpts sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20080904053551.GL3680-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-04 6:38 ` H. Peter Anvin
[not found] ` <48BF8283.7040601-YMNOUZJC4hwAvxtiuMwx3w@public.gmane.org>
2008-09-04 15:54 ` sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20080904155431.GA11174-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-04 16:02 ` H. Peter Anvin
[not found] ` <48C00698.8050803-YMNOUZJC4hwAvxtiuMwx3w@public.gmane.org>
2008-09-04 16:25 ` Alan Cox
[not found] ` <20080904172542.3ad7bb85-qBU/x9rampVanCEyBjwyrvXRex20P6io@public.gmane.org>
2008-09-04 16:48 ` H. Peter Anvin
[not found] ` <48C01163.1050704-YMNOUZJC4hwAvxtiuMwx3w@public.gmane.org>
2008-09-04 17:18 ` sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20080904171828.GC11174-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-04 17:31 ` H. Peter Anvin
[not found] ` <48C01B58.2040006-YMNOUZJC4hwAvxtiuMwx3w@public.gmane.org>
2008-09-05 2:01 ` sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20080905020131.GA17535-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-05 2:08 ` H. Peter Anvin
2008-09-05 12:27 ` Alan Cox
[not found] ` <20080905132710.50018aef-qBU/x9rampVanCEyBjwyrvXRex20P6io@public.gmane.org>
2008-09-05 17:24 ` H. Peter Anvin
[not found] ` <48C16B42.7030103-YMNOUZJC4hwAvxtiuMwx3w@public.gmane.org>
2008-09-05 19:44 ` sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20080905194450.GA18119-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-09-06 14:05 ` H. Peter Anvin
[not found] ` <48C28E3D.6060404-YMNOUZJC4hwAvxtiuMwx3w@public.gmane.org>
2008-09-06 21:45 ` sukadev-r/Jw6+rmf7HQT0dZR+AlfA
2008-09-04 16:08 ` [PATCH 0/11][v3]: Enable multiple mounts " sukadev-r/Jw6+rmf7HQT0dZR+AlfA
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=20080904053522.GK3680@us.ibm.com \
--to=sukadev-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=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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox