/** * sysfs_remove_dir - remove an object's directory. * @kobj: object. * * The only thing special about this is that we remove any files in * the directory before we remove the directory, and we've inlined * what used to be sysfs_rmdir() below, instead of calling separately. */ void sysfs_remove_dir(struct kobject *kobj) { struct sysfs_dirent *sd = kobj->sd; /* * In general, kboject owner is responsible for ensuring removal * doesn't race with other operations and sysfs doesn't provide any * protection; however, when @kobj is used as a symlink target, the * symlinking entity usually doesn't own @kobj and thus has no * control over removal. @kobj->sd may be removed anytime and * symlink code may end up dereferencing an already freed sd. * * sysfs_symlink_target_lock synchronizes @kobj->sd disassociation * against symlink operations so that symlink code can safely * dereference @kobj->sd. */ spin_lock(&sysfs_symlink_target_lock); kobj->sd = NULL; spin_unlock(&sysfs_symlink_target_lock); if (sd) { WARN_ON_ONCE(sysfs_type(sd) != SYSFS_DIR); sysfs_remove(sd); } }
static void dps_connected_sysfs_shutdown(struct dce6 *dce) { u8 i; for (i = 0; i < dce->ddev.crtcs_n; ++i) { if ((dce->dps_used & BIT(i)) == 0) continue; if (!dce->dps[i].connected) continue; sysfs_remove(dce, i); } }