void release_sysfs_dirent(struct sysfs_dirent *sd) { struct sysfs_dirent *parent_sd; repeat: /* Moving/renaming is always done while holding reference. * sd->s_parent won't change beneath us. */ parent_sd = sd->s_parent; WARN(!(sd->s_flags & SYSFS_FLAG_REMOVED), "sysfs: free using entry: %s/%s\n", parent_sd ? parent_sd->s_name : "", sd->s_name); if (sysfs_type(sd) == SYSFS_KOBJ_LINK) sysfs_put(sd->s_symlink.target_sd); if (sysfs_type(sd) & SYSFS_COPY_NAME) kfree(sd->s_name); if (sd->s_iattr && sd->s_iattr->ia_secdata) security_release_secctx(sd->s_iattr->ia_secdata, sd->s_iattr->ia_secdata_len); kfree(sd->s_iattr); sysfs_free_ino(sd->s_ino); kmem_cache_free(sysfs_dir_cachep, sd); sd = parent_sd; if (sd && atomic_dec_and_test(&sd->s_count)) goto repeat; }
void release_sysfs_dirent(struct sysfs_dirent * sd) { struct sysfs_dirent *parent_sd; repeat: /* Moving/renaming is always done while holding reference. * sd->s_parent won't change beneath us. */ parent_sd = sd->s_parent; if (sysfs_type(sd) == SYSFS_KOBJ_LINK) sysfs_put(sd->s_elem.symlink.target_sd); if (sysfs_type(sd) & SYSFS_COPY_NAME) kfree(sd->s_name); kfree(sd->s_iattr); sysfs_free_ino(sd->s_ino); kmem_cache_free(sysfs_dir_cachep, sd); sd = parent_sd; if (sd && atomic_dec_and_test(&sd->s_count)) goto repeat; }