diff options
-rw-r--r-- | fs/devpts/inode.c | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/fs/devpts/inode.c b/fs/devpts/inode.c index add566303c68..c35ffdc12bba 100644 --- a/fs/devpts/inode.c +++ b/fs/devpts/inode.c | |||
@@ -142,6 +142,8 @@ static inline struct super_block *pts_sb_from_inode(struct inode *inode) | |||
142 | if (inode->i_sb->s_magic == DEVPTS_SUPER_MAGIC) | 142 | if (inode->i_sb->s_magic == DEVPTS_SUPER_MAGIC) |
143 | return inode->i_sb; | 143 | return inode->i_sb; |
144 | #endif | 144 | #endif |
145 | if (!devpts_mnt) | ||
146 | return NULL; | ||
145 | return devpts_mnt->mnt_sb; | 147 | return devpts_mnt->mnt_sb; |
146 | } | 148 | } |
147 | 149 | ||
@@ -525,10 +527,14 @@ static struct file_system_type devpts_fs_type = { | |||
525 | int devpts_new_index(struct inode *ptmx_inode) | 527 | int devpts_new_index(struct inode *ptmx_inode) |
526 | { | 528 | { |
527 | struct super_block *sb = pts_sb_from_inode(ptmx_inode); | 529 | struct super_block *sb = pts_sb_from_inode(ptmx_inode); |
528 | struct pts_fs_info *fsi = DEVPTS_SB(sb); | 530 | struct pts_fs_info *fsi; |
529 | int index; | 531 | int index; |
530 | int ida_ret; | 532 | int ida_ret; |
531 | 533 | ||
534 | if (!sb) | ||
535 | return -ENODEV; | ||
536 | |||
537 | fsi = DEVPTS_SB(sb); | ||
532 | retry: | 538 | retry: |
533 | if (!ida_pre_get(&fsi->allocated_ptys, GFP_KERNEL)) | 539 | if (!ida_pre_get(&fsi->allocated_ptys, GFP_KERNEL)) |
534 | return -ENOMEM; | 540 | return -ENOMEM; |
@@ -584,11 +590,18 @@ struct inode *devpts_pty_new(struct inode *ptmx_inode, dev_t device, int index, | |||
584 | struct dentry *dentry; | 590 | struct dentry *dentry; |
585 | struct super_block *sb = pts_sb_from_inode(ptmx_inode); | 591 | struct super_block *sb = pts_sb_from_inode(ptmx_inode); |
586 | struct inode *inode; | 592 | struct inode *inode; |
587 | struct dentry *root = sb->s_root; | 593 | struct dentry *root; |
588 | struct pts_fs_info *fsi = DEVPTS_SB(sb); | 594 | struct pts_fs_info *fsi; |
589 | struct pts_mount_opts *opts = &fsi->mount_opts; | 595 | struct pts_mount_opts *opts; |
590 | char s[12]; | 596 | char s[12]; |
591 | 597 | ||
598 | if (!sb) | ||
599 | return ERR_PTR(-ENODEV); | ||
600 | |||
601 | root = sb->s_root; | ||
602 | fsi = DEVPTS_SB(sb); | ||
603 | opts = &fsi->mount_opts; | ||
604 | |||
592 | inode = new_inode(sb); | 605 | inode = new_inode(sb); |
593 | if (!inode) | 606 | if (!inode) |
594 | return ERR_PTR(-ENOMEM); | 607 | return ERR_PTR(-ENOMEM); |
@@ -676,12 +689,16 @@ static int __init init_devpts_fs(void) | |||
676 | struct ctl_table_header *table; | 689 | struct ctl_table_header *table; |
677 | 690 | ||
678 | if (!err) { | 691 | if (!err) { |
692 | struct vfsmount *mnt; | ||
693 | |||
679 | table = register_sysctl_table(pty_root_table); | 694 | table = register_sysctl_table(pty_root_table); |
680 | devpts_mnt = kern_mount(&devpts_fs_type); | 695 | mnt = kern_mount(&devpts_fs_type); |
681 | if (IS_ERR(devpts_mnt)) { | 696 | if (IS_ERR(mnt)) { |
682 | err = PTR_ERR(devpts_mnt); | 697 | err = PTR_ERR(mnt); |
683 | unregister_filesystem(&devpts_fs_type); | 698 | unregister_filesystem(&devpts_fs_type); |
684 | unregister_sysctl_table(table); | 699 | unregister_sysctl_table(table); |
700 | } else { | ||
701 | devpts_mnt = mnt; | ||
685 | } | 702 | } |
686 | } | 703 | } |
687 | return err; | 704 | return err; |