check.h 1.1 KB

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