X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fdevpts%2Finode.c;fp=fs%2Fdevpts%2Finode.c;h=caba0b5d41264d249520290fd19be86b76a42583;hb=64ba3f394c830ec48a1c31b53dcae312c56f1604;hp=b44d79196246b68356cbc7b1bc0a78e9861af847;hpb=be1e6109ac94a859551f8e1774eb9a8469fe055c;p=linux-2.6.git diff --git a/fs/devpts/inode.c b/fs/devpts/inode.c index b44d79196..caba0b5d4 100644 --- a/fs/devpts/inode.c +++ b/fs/devpts/inode.c @@ -18,7 +18,6 @@ #include #include #include -#include static int devpts_permission(struct inode *inode, int mask, struct nameidata *nd) @@ -45,60 +44,39 @@ static struct { umode_t mode; } config = {.mode = 0600}; -enum { - Opt_uid, Opt_gid, Opt_mode, - Opt_err -}; - -static match_table_t tokens = { - {Opt_uid, "uid=%u"}, - {Opt_gid, "gid=%u"}, - {Opt_mode, "mode=%o"}, - {Opt_err, NULL} -}; - static int devpts_remount(struct super_block *sb, int *flags, char *data) { - char *p; - - config.setuid = 0; - config.setgid = 0; - config.uid = 0; - config.gid = 0; - config.mode = 0600; - - while ((p = strsep(&data, ",")) != NULL) { - substring_t args[MAX_OPT_ARGS]; - int token; - int option; - - if (!*p) + int setuid = 0; + int setgid = 0; + uid_t uid = 0; + gid_t gid = 0; + umode_t mode = 0600; + char *this_char; + + this_char = NULL; + while ((this_char = strsep(&data, ",")) != NULL) { + int n; + char dummy; + if (!*this_char) continue; - - token = match_token(p, tokens, args); - switch (token) { - case Opt_uid: - if (match_int(&args[0], &option)) - return -EINVAL; - config.uid = option; - config.setuid = 1; - break; - case Opt_gid: - if (match_int(&args[0], &option)) - return -EINVAL; - config.gid = option; - config.setgid = 1; - break; - case Opt_mode: - if (match_octal(&args[0], &option)) - return -EINVAL; - config.mode = option & ~S_IFMT; - break; - default: - printk(KERN_ERR "devpts: called with bogus options\n"); + if (sscanf(this_char, "uid=%i%c", &n, &dummy) == 1) { + setuid = 1; + uid = n; + } else if (sscanf(this_char, "gid=%i%c", &n, &dummy) == 1) { + setgid = 1; + gid = n; + } else if (sscanf(this_char, "mode=%o%c", &n, &dummy) == 1) + mode = n & ~S_IFMT; + else { + printk("devpts: called with bogus options\n"); return -EINVAL; } } + config.setuid = setuid; + config.setgid = setgid; + config.uid = uid; + config.gid = gid; + config.mode = mode; return 0; } @@ -143,6 +121,7 @@ devpts_fill_super(struct super_block *s, void *data, int silent) inode->i_ino = 1; inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; inode->i_blocks = 0; + inode->i_blksize = 1024; inode->i_uid = inode->i_gid = 0; inode->i_mode = S_IFDIR | S_IRUGO | S_IXUGO | S_IWUSR; inode->i_op = &simple_dir_inode_operations; @@ -160,10 +139,10 @@ fail: return -ENOMEM; } -static int devpts_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data, struct vfsmount *mnt) +static struct super_block *devpts_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data) { - return get_sb_single(fs_type, flags, data, devpts_fill_super, mnt); + return get_sb_single(fs_type, flags, data, devpts_fill_super); } static struct file_system_type devpts_fs_type = { @@ -202,13 +181,14 @@ int devpts_pty_new(struct tty_struct *tty) return -ENOMEM; inode->i_ino = number+2; + inode->i_blksize = 1024; inode->i_uid = config.setuid ? config.uid : current->fsuid; inode->i_gid = config.setgid ? config.gid : current->fsgid; inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; init_special_inode(inode, S_IFCHR|config.mode, device); inode->i_xid = vx_current_xid(); inode->i_op = &devpts_file_inode_operations; - inode->i_private = tty; + inode->u.generic_ip = tty; dentry = get_node(number); if (!IS_ERR(dentry) && !dentry->d_inode) @@ -227,7 +207,7 @@ struct tty_struct *devpts_get_tty(int number) tty = NULL; if (!IS_ERR(dentry)) { if (dentry->d_inode) - tty = dentry->d_inode->i_private; + tty = dentry->d_inode->u.generic_ip; dput(dentry); }