hc
2024-05-10 23fa18eaa71266feff7ba8d83022d9e1cc83c65a
kernel/include/media/dvbdev.h
....@@ -126,6 +126,7 @@
126126 * struct dvb_device - represents a DVB device node
127127 *
128128 * @list_head: List head with all DVB devices
129
+ * @ref: reference counter
129130 * @fops: pointer to struct file_operations
130131 * @adapter: pointer to the adapter that holds this device node
131132 * @type: type of the device, as defined by &enum dvb_device_type.
....@@ -156,6 +157,7 @@
156157 */
157158 struct dvb_device {
158159 struct list_head list_head;
160
+ struct kref ref;
159161 const struct file_operations *fops;
160162 struct dvb_adapter *adapter;
161163 enum dvb_device_type type;
....@@ -186,6 +188,35 @@
186188
187189 void *priv;
188190 };
191
+
192
+/**
193
+ * struct dvbdevfops_node - fops nodes registered in dvbdevfops_list
194
+ *
195
+ * @fops: Dynamically allocated fops for ->owner registration
196
+ * @type: type of dvb_device
197
+ * @template: dvb_device used for registration
198
+ * @list_head: list_head for dvbdevfops_list
199
+ */
200
+struct dvbdevfops_node {
201
+ struct file_operations *fops;
202
+ enum dvb_device_type type;
203
+ const struct dvb_device *template;
204
+ struct list_head list_head;
205
+};
206
+
207
+/**
208
+ * dvb_device_get - Increase dvb_device reference
209
+ *
210
+ * @dvbdev: pointer to struct dvb_device
211
+ */
212
+struct dvb_device *dvb_device_get(struct dvb_device *dvbdev);
213
+
214
+/**
215
+ * dvb_device_put - Decrease dvb_device reference
216
+ *
217
+ * @dvbdev: pointer to struct dvb_device
218
+ */
219
+void dvb_device_put(struct dvb_device *dvbdev);
189220
190221 /**
191222 * dvb_register_adapter - Registers a new DVB adapter
....@@ -231,28 +262,16 @@
231262 /**
232263 * dvb_remove_device - Remove a registered DVB device
233264 *
234
- * This does not free memory. To do that, call dvb_free_device().
265
+ * This does not free memory. dvb_free_device() will do that when
266
+ * reference counter is empty
235267 *
236268 * @dvbdev: pointer to struct dvb_device
237269 */
238270 void dvb_remove_device(struct dvb_device *dvbdev);
239271
240
-/**
241
- * dvb_free_device - Free memory occupied by a DVB device.
242
- *
243
- * Call dvb_unregister_device() before calling this function.
244
- *
245
- * @dvbdev: pointer to struct dvb_device
246
- */
247
-void dvb_free_device(struct dvb_device *dvbdev);
248272
249273 /**
250274 * dvb_unregister_device - Unregisters a DVB device
251
- *
252
- * This is a combination of dvb_remove_device() and dvb_free_device().
253
- * Using this function is usually a mistake, and is often an indicator
254
- * for a use-after-free bug (when a userspace process keeps a file
255
- * handle to a detached device).
256275 *
257276 * @dvbdev: pointer to struct dvb_device
258277 */