From e8d1d9defe31667f3ec4fd43a6c01f8e1e042d12 Mon Sep 17 00:00:00 2001 From: Michael Hunold <hunold@linuxtv.org> Date: Tue, 7 Oct 2003 18:47:02 -0700 Subject: [PATCH] [PATCH] multiple device *read* opens support - allow multiple read device opens --- drivers/media/dvb/dvb-core/dvb_frontend.c | 1 + drivers/media/dvb/dvb-core/dvbdev.c | 11 +++++++++-- drivers/media/dvb/dvb-core/dvbdev.h | 8 +++++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c index fc4c01309c80..f5e38f1e1ba2 100644 --- a/drivers/media/dvb/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb/dvb-core/dvb_frontend.c @@ -870,6 +870,7 @@ dvb_register_frontend (int (*ioctl) (struct dvb_frontend *frontend, static const struct dvb_device dvbdev_template = { .users = ~0, .writers = 1, + .readers = (~0)-1, .fops = &dvb_frontend_fops, .kernel_ioctl = dvb_frontend_ioctl }; diff --git a/drivers/media/dvb/dvb-core/dvbdev.c b/drivers/media/dvb/dvb-core/dvbdev.c index 77ee97465c78..22dcdcb7dc05 100644 --- a/drivers/media/dvb/dvb-core/dvbdev.c +++ b/drivers/media/dvb/dvb-core/dvbdev.c @@ -112,7 +112,11 @@ int dvb_generic_open(struct inode *inode, struct file *file) if (!dvbdev->users) return -EBUSY; - if ((file->f_flags & O_ACCMODE) != O_RDONLY) { + if ((file->f_flags & O_ACCMODE) == O_RDONLY) { + if (!dvbdev->readers) + return -EBUSY; + dvbdev->readers--; + } else { if (!dvbdev->writers) return -EBUSY; dvbdev->writers--; @@ -130,8 +134,11 @@ int dvb_generic_release(struct inode *inode, struct file *file) if (!dvbdev) return -ENODEV; - if ((file->f_flags & O_ACCMODE) != O_RDONLY) + if ((file->f_flags & O_ACCMODE) == O_RDONLY) { + dvbdev->readers++; + } else { dvbdev->writers++; + } dvbdev->users++; return 0; diff --git a/drivers/media/dvb/dvb-core/dvbdev.h b/drivers/media/dvb/dvb-core/dvbdev.h index 137a8dd4d042..92963f90f359 100644 --- a/drivers/media/dvb/dvb-core/dvbdev.h +++ b/drivers/media/dvb/dvb-core/dvbdev.h @@ -55,12 +55,18 @@ struct dvb_adapter { struct dvb_device { struct list_head list_head; struct file_operations *fops; + + + struct dvb_adapter *adapter; int type; u32 id; - int users; + /* in theory, 'users' can vanish now, + but I don't want to change too much now... */ + int readers; int writers; + int users; /* don't really need those !? -- FIXME: use video_usercopy */ int (*kernel_ioctl)(struct inode *inode, struct file *file, -- 2.30.9