struct parsed_partitions * check_partition(struct gendisk *hd, struct block_device *bdev) { struct parsed_partitions *state; int i, res, err; state = kzalloc(sizeof(struct parsed_partitions), GFP_KERNEL); if (!state) return NULL; state->pp_buf = (char *)__get_free_page(GFP_KERNEL); if (!state->pp_buf) { kfree(state); return NULL; } state->pp_buf[0] = '\0'; state->bdev = bdev; disk_name(hd, 0, state->name); snprintf(state->pp_buf, PAGE_SIZE, " %s:", state->name); if (isdigit(state->name[strlen(state->name)-1])) sprintf(state->name, "p"); state->limit = disk_max_parts(hd); i = res = err = 0; while (!res && check_part[i]) { memset(&state->parts, 0, sizeof(state->parts)); res = check_part[i++](state); if (res < 0) { /* We have hit an I/O error which we don't report now. * But record it, and let the others do their job. */ err = res; res = 0; } } if (res > 0) { printk(KERN_INFO "%s", state->pp_buf); free_page((unsigned long)state->pp_buf); return state; } if (state->access_beyond_eod) err = -ENOSPC; if (err) /* The partition is unrecognized. So report I/O errors if there were any */ res = err; if (!res) strlcat(state->pp_buf, " unknown partition table\n", PAGE_SIZE); else if (warn_no_part) strlcat(state->pp_buf, " unable to read partition table\n", PAGE_SIZE); printk(KERN_INFO "%s", state->pp_buf); free_page((unsigned long)state->pp_buf); kfree(state); return ERR_PTR(res); }
static struct parsed_partitions *allocate_partitions(struct gendisk *hd) { struct parsed_partitions *state; int nr; state = kzalloc(sizeof(*state), GFP_KERNEL); if (!state) return NULL; nr = disk_max_parts(hd); state->parts = vzalloc(nr * sizeof(state->parts[0])); if (!state->parts) { kfree(state); return NULL; } state->limit = nr; return state; }