aboutsummaryrefslogtreecommitdiff
path: root/fs/char_dev.c
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2008-08-11 15:34:22 +0200
committerAl Viro <viro@zeniv.linux.org.uk>2008-10-23 05:12:59 -0400
commita518ab9329041411526ab8e05edfda7e2715244f (patch)
treeb615e9ad591b4b7f0ee75ce25e26e1718066192b /fs/char_dev.c
parentca30bc99527ab968707bafc09e38807de7e70c4a (diff)
downloadlinux-a518ab9329041411526ab8e05edfda7e2715244f.tar.gz
[PATCH] tidy up chrdev_open
Use a single goto label for chrdev_put + return error cases. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/char_dev.c')
-rw-r--r--fs/char_dev.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/fs/char_dev.c b/fs/char_dev.c
index 262fa10e213..700697a7261 100644
--- a/fs/char_dev.c
+++ b/fs/char_dev.c
@@ -386,15 +386,22 @@ static int chrdev_open(struct inode *inode, struct file *filp)
cdev_put(new);
if (ret)
return ret;
+
+ ret = -ENXIO;
filp->f_op = fops_get(p->ops);
- if (!filp->f_op) {
- cdev_put(p);
- return -ENXIO;
- }
- if (filp->f_op->open)
+ if (!filp->f_op)
+ goto out_cdev_put;
+
+ if (filp->f_op->open) {
ret = filp->f_op->open(inode,filp);
- if (ret)
- cdev_put(p);
+ if (ret)
+ goto out_cdev_put;
+ }
+
+ return 0;
+
+ out_cdev_put:
+ cdev_put(p);
return ret;
}