int sysfs_hash_and_remove(struct sysfs_dirent *dir_sd, const char *name) { struct sysfs_addrm_cxt acxt; struct sysfs_dirent **pos, *sd; if (!dir_sd) return -ENOENT; sysfs_addrm_start(&acxt, dir_sd); for (pos = &dir_sd->s_children; *pos; pos = &(*pos)->s_sibling) { sd = *pos; if (!sysfs_type(sd)) continue; if (!strcmp(sd->s_name, name)) { *pos = sd->s_sibling; sd->s_sibling = NULL; sysfs_remove_one(&acxt, sd); break; } } if (sysfs_addrm_finish(&acxt)) return 0; return -ENOENT; }
static void __sysfs_remove_dir(struct sysfs_dirent *dir_sd) { struct sysfs_addrm_cxt acxt; struct sysfs_dirent **pos; if (!dir_sd) return; pr_debug("sysfs %s: removing dir\n", dir_sd->s_name); sysfs_addrm_start(&acxt, dir_sd); pos = &dir_sd->s_children; while (*pos) { struct sysfs_dirent *sd = *pos; if (sysfs_type(sd) && sysfs_type(sd) != SYSFS_DIR) { *pos = sd->s_sibling; sd->s_sibling = NULL; sysfs_remove_one(&acxt, sd); } else pos = &(*pos)->s_sibling; } sysfs_addrm_finish(&acxt); remove_dir(dir_sd); }
static void remove_dir(struct sysfs_dirent *sd) { struct sysfs_addrm_cxt acxt; sysfs_addrm_start(&acxt, sd->s_parent); sysfs_remove_one(&acxt, sd); sysfs_addrm_finish(&acxt); }
static void __sysfs_remove(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd) { struct sysfs_dirent *pos, *next; if (!sd) return; pr_debug("sysfs %s: removing\n", sd->s_name); next = NULL; do { pos = next; next = sysfs_next_descendant_post(pos, sd); if (pos) sysfs_remove_one(acxt, pos); } while (next); }
int sysfs_hash_and_remove(struct sysfs_dirent *dir_sd, const char *name) { struct sysfs_addrm_cxt acxt; struct sysfs_dirent *sd; if (!dir_sd) return -ENOENT; sysfs_addrm_start(&acxt, dir_sd); sd = sysfs_find_dirent(dir_sd, name); if (sd) sysfs_remove_one(&acxt, sd); sysfs_addrm_finish(&acxt); if (sd) return 0; else return -ENOENT; }
int sysfs_hash_and_remove(struct sysfs_dirent *dir_sd, const void *ns, const char *name) { struct sysfs_addrm_cxt acxt; struct sysfs_dirent *sd; if (!dir_sd) { WARN(1, KERN_WARNING "sysfs: can not remove '%s', no directory\n", name); return -ENOENT; } sysfs_addrm_start(&acxt, dir_sd); sd = sysfs_find_dirent(dir_sd, ns, name); if (sd) sysfs_remove_one(&acxt, sd); sysfs_addrm_finish(&acxt); if (sd) return 0; else return -ENOENT; }