diff options
-rw-r--r-- | drivers/media/video/gspca/gspca.c | 32 | ||||
-rw-r--r-- | drivers/media/video/gspca/gspca.h | 1 |
2 files changed, 5 insertions, 28 deletions
diff --git a/drivers/media/video/gspca/gspca.c b/drivers/media/video/gspca/gspca.c index fbc5666ee29e..0ba42dd4b99b 100644 --- a/drivers/media/video/gspca/gspca.c +++ b/drivers/media/video/gspca/gspca.c | |||
@@ -1210,29 +1210,15 @@ static void gspca_release(struct video_device *vfd) | |||
1210 | static int dev_open(struct file *file) | 1210 | static int dev_open(struct file *file) |
1211 | { | 1211 | { |
1212 | struct gspca_dev *gspca_dev; | 1212 | struct gspca_dev *gspca_dev; |
1213 | int ret; | ||
1214 | 1213 | ||
1215 | PDEBUG(D_STREAM, "[%s] open", current->comm); | 1214 | PDEBUG(D_STREAM, "[%s] open", current->comm); |
1216 | gspca_dev = (struct gspca_dev *) video_devdata(file); | 1215 | gspca_dev = (struct gspca_dev *) video_devdata(file); |
1217 | if (mutex_lock_interruptible(&gspca_dev->queue_lock)) | 1216 | if (!gspca_dev->present) |
1218 | return -ERESTARTSYS; | 1217 | return -ENODEV; |
1219 | if (!gspca_dev->present) { | ||
1220 | ret = -ENODEV; | ||
1221 | goto out; | ||
1222 | } | ||
1223 | |||
1224 | if (gspca_dev->users > 4) { /* (arbitrary value) */ | ||
1225 | ret = -EBUSY; | ||
1226 | goto out; | ||
1227 | } | ||
1228 | 1218 | ||
1229 | /* protect the subdriver against rmmod */ | 1219 | /* protect the subdriver against rmmod */ |
1230 | if (!try_module_get(gspca_dev->module)) { | 1220 | if (!try_module_get(gspca_dev->module)) |
1231 | ret = -ENODEV; | 1221 | return -ENODEV; |
1232 | goto out; | ||
1233 | } | ||
1234 | |||
1235 | gspca_dev->users++; | ||
1236 | 1222 | ||
1237 | file->private_data = gspca_dev; | 1223 | file->private_data = gspca_dev; |
1238 | #ifdef GSPCA_DEBUG | 1224 | #ifdef GSPCA_DEBUG |
@@ -1244,14 +1230,7 @@ static int dev_open(struct file *file) | |||
1244 | gspca_dev->vdev.debug &= ~(V4L2_DEBUG_IOCTL | 1230 | gspca_dev->vdev.debug &= ~(V4L2_DEBUG_IOCTL |
1245 | | V4L2_DEBUG_IOCTL_ARG); | 1231 | | V4L2_DEBUG_IOCTL_ARG); |
1246 | #endif | 1232 | #endif |
1247 | ret = 0; | 1233 | return 0; |
1248 | out: | ||
1249 | mutex_unlock(&gspca_dev->queue_lock); | ||
1250 | if (ret != 0) | ||
1251 | PDEBUG(D_ERR|D_STREAM, "open failed err %d", ret); | ||
1252 | else | ||
1253 | PDEBUG(D_STREAM, "open done"); | ||
1254 | return ret; | ||
1255 | } | 1234 | } |
1256 | 1235 | ||
1257 | static int dev_close(struct file *file) | 1236 | static int dev_close(struct file *file) |
@@ -1261,7 +1240,6 @@ static int dev_close(struct file *file) | |||
1261 | PDEBUG(D_STREAM, "[%s] close", current->comm); | 1240 | PDEBUG(D_STREAM, "[%s] close", current->comm); |
1262 | if (mutex_lock_interruptible(&gspca_dev->queue_lock)) | 1241 | if (mutex_lock_interruptible(&gspca_dev->queue_lock)) |
1263 | return -ERESTARTSYS; | 1242 | return -ERESTARTSYS; |
1264 | gspca_dev->users--; | ||
1265 | 1243 | ||
1266 | /* if the file did the capture, free the streaming resources */ | 1244 | /* if the file did the capture, free the streaming resources */ |
1267 | if (gspca_dev->capt_file == file) { | 1245 | if (gspca_dev->capt_file == file) { |
diff --git a/drivers/media/video/gspca/gspca.h b/drivers/media/video/gspca/gspca.h index a2a1a6aa0606..41755226d389 100644 --- a/drivers/media/video/gspca/gspca.h +++ b/drivers/media/video/gspca/gspca.h | |||
@@ -211,7 +211,6 @@ struct gspca_dev { | |||
211 | #ifdef CONFIG_PM | 211 | #ifdef CONFIG_PM |
212 | char frozen; /* suspend - resume */ | 212 | char frozen; /* suspend - resume */ |
213 | #endif | 213 | #endif |
214 | char users; /* number of opens */ | ||
215 | char present; /* device connected */ | 214 | char present; /* device connected */ |
216 | char nbufread; /* number of buffers for read() */ | 215 | char nbufread; /* number of buffers for read() */ |
217 | char memory; /* memory type (V4L2_MEMORY_xxx) */ | 216 | char memory; /* memory type (V4L2_MEMORY_xxx) */ |