+ * Deregister a changelog character device whose refcount has reached zero.
+ */
+static void chlg_dev_clear(struct kref *kref)
+{
+ struct chlg_registered_dev *entry = container_of(kref,
+ struct chlg_registered_dev,
+ ced_refs);
+ ENTRY;
+
+ list_del(&entry->ced_link);
+ misc_deregister(&entry->ced_misc);
+ OBD_FREE_PTR(entry);
+ EXIT;
+}
+
+static inline struct obd_device* chlg_obd_get(struct chlg_registered_dev *dev)
+{
+ struct obd_device *obd;
+
+ mutex_lock(&chlg_registered_dev_lock);
+ if (list_empty(&dev->ced_obds))
+ return NULL;
+
+ obd = list_first_entry(&dev->ced_obds, struct obd_device,
+ u.cli.cl_chg_dev_linkage);
+ class_incref(obd, "changelog", dev);
+ mutex_unlock(&chlg_registered_dev_lock);
+ return obd;
+}
+
+static inline void chlg_obd_put(struct chlg_registered_dev *dev,
+ struct obd_device *obd)
+{
+ class_decref(obd, "changelog", dev);
+}
+
+/**