diff options
Diffstat (limited to 'fs/char_dev.c')
| -rw-r--r-- | fs/char_dev.c | 9 | 
1 files changed, 6 insertions, 3 deletions
diff --git a/fs/char_dev.c b/fs/char_dev.c index afc2bb69178..f77f7702fab 100644 --- a/fs/char_dev.c +++ b/fs/char_dev.c @@ -368,6 +368,7 @@ void cdev_put(struct cdev *p)   */  static int chrdev_open(struct inode *inode, struct file *filp)  { +	const struct file_operations *fops;  	struct cdev *p;  	struct cdev *new = NULL;  	int ret = 0; @@ -400,10 +401,11 @@ static int chrdev_open(struct inode *inode, struct file *filp)  		return ret;  	ret = -ENXIO; -	filp->f_op = fops_get(p->ops); -	if (!filp->f_op) +	fops = fops_get(p->ops); +	if (!fops)  		goto out_cdev_put; +	replace_fops(filp, fops);  	if (filp->f_op->open) {  		ret = filp->f_op->open(inode, filp);  		if (ret) @@ -574,7 +576,8 @@ static struct kobject *base_probe(dev_t dev, int *part, void *data)  void __init chrdev_init(void)  {  	cdev_map = kobj_map_init(base_probe, &chrdevs_lock); -	bdi_init(&directly_mappable_cdev_bdi); +	if (bdi_init(&directly_mappable_cdev_bdi)) +		panic("Failed to init directly mappable cdev bdi");  }  | 
