check.h 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #include <linux/pagemap.h>
  3. #include <linux/blkdev.h>
  4. #include <linux/genhd.h>
  5. /*
  6. * add_gd_partition adds a partitions details to the devices partition
  7. * description.
  8. */
  9. struct parsed_partitions {
  10. struct block_device *bdev;
  11. char name[BDEVNAME_SIZE];
  12. struct {
  13. sector_t from;
  14. sector_t size;
  15. int flags;
  16. bool has_info;
  17. struct partition_meta_info info;
  18. } *parts;
  19. int next;
  20. int limit;
  21. bool access_beyond_eod;
  22. char *pp_buf;
  23. };
  24. void free_partitions(struct parsed_partitions *state);
  25. struct parsed_partitions *
  26. check_partition(struct gendisk *, struct block_device *);
  27. static inline void *read_part_sector(struct parsed_partitions *state,
  28. sector_t n, Sector *p)
  29. {
  30. if (n >= get_capacity(state->bdev->bd_disk)) {
  31. state->access_beyond_eod = true;
  32. return NULL;
  33. }
  34. return read_dev_sector(state->bdev, n, p);
  35. }
  36. static inline void
  37. put_partition(struct parsed_partitions *p, int n, sector_t from, sector_t size)
  38. {
  39. if (n < p->limit) {
  40. char tmp[1 + BDEVNAME_SIZE + 10 + 1];
  41. p->parts[n].from = from;
  42. p->parts[n].size = size;
  43. snprintf(tmp, sizeof(tmp), " %s%d", p->name, n);
  44. strlcat(p->pp_buf, tmp, PAGE_SIZE);
  45. }
  46. }
  47. extern int warn_no_part;