/* * Determine ktype->sysfs_ops for the given sysfs_dirent. This function * must be called while holding an active reference. */ static const struct sysfs_ops *sysfs_file_ops(struct sysfs_dirent *sd) { struct kobject *kobj = sd->s_parent->s_dir.kobj; if (!sysfs_ignore_lockdep(sd)) lockdep_assert_held(sd); return kobj->ktype ? kobj->ktype->sysfs_ops : NULL; }
/** * sysfs_get_active - get an active reference to sysfs_dirent * @sd: sysfs_dirent to get an active reference to * * Get an active reference of @sd. This function is noop if @sd * is NULL. * * RETURNS: * Pointer to @sd on success, NULL on failure. */ struct sysfs_dirent *sysfs_get_active(struct sysfs_dirent *sd) { if (unlikely(!sd)) return NULL; if (!atomic_inc_unless_negative(&sd->s_active)) return NULL; if (likely(!sysfs_ignore_lockdep(sd))) rwsem_acquire_read(&sd->dep_map, 0, 1, _RET_IP_); return sd; }
/** * sysfs_put_active - put an active reference to sysfs_dirent * @sd: sysfs_dirent to put an active reference to * * Put an active reference to @sd. This function is noop if @sd * is NULL. */ void sysfs_put_active(struct sysfs_dirent *sd) { int v; if (unlikely(!sd)) return; if (likely(!sysfs_ignore_lockdep(sd))) rwsem_release(&sd->dep_map, 1, _RET_IP_); v = atomic_dec_return(&sd->s_active); if (likely(v != SD_DEACTIVATED_BIAS)) return; /* atomic_dec_return() is a mb(), we'll always see the updated * sd->u.completion. */ complete(sd->u.completion); }