struct hd_struct *get_part(char *name) { dev_t devt; int partno; struct disk_part_iter piter; struct gendisk *disk; struct hd_struct *part = NULL; if (!name) return part; devt = blk_lookup_devt("mmcblk0", 0); disk = get_gendisk(devt, &partno); if (!disk || get_capacity(disk) == 0) return 0; disk_part_iter_init(&piter, disk, 0); while ((part = disk_part_iter_next(&piter))) { if (part->info && !strcmp(part->info->volname, name)) { get_device(part_to_dev(part)); break; } } disk_part_iter_exit(&piter); return part; }
static ssize_t upgrade_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { dev_t devt; int partno; struct gendisk *disk; struct partition_package *package; int len; size_t ret; devt = blk_lookup_devt("mmcblk0", 0); disk = get_gendisk(devt, &partno); if (!disk || get_capacity(disk) == 0) return 0; package = alloc_partition_package(disk, &len); if (!package) { ret = -ENOMEM; part_err("upgrade_proc_read: fail to malloc package\n"); goto fail_malloc; } get_partition_package(disk, package); ret = simple_read_from_buffer(buf, count, ppos, package, len); kfree(package); fail_malloc: return ret; }
static int partinfo_show_proc(struct seq_file *m, void *v) { dev_t devt; int partno; struct disk_part_iter piter; struct gendisk *disk; struct hd_struct *part; u64 last = 0; devt = blk_lookup_devt("mmcblk0", 0); disk = get_gendisk(devt, &partno), seq_printf(m, "%-16s %-16s\t%-16s\n", "Name", "Start", "Size"); if (!disk || get_capacity(disk) == 0) return 0; disk_part_iter_init(&piter, disk, 0); seq_printf(m, "%-16s 0x%016llx\t0x%016llx\n", "pgpt", 0ULL, 512 * 1024ULL); while ((part = disk_part_iter_next(&piter))) { seq_printf(m, "%-16s 0x%016llx\t0x%016llx\n", part->info ? (char *)(part->info->volname) : "unknown", (u64)part->start_sect * 512, (u64)part->nr_sects * 512); last = (part->start_sect + part->nr_sects) * 512; } seq_printf(m, "%-16s 0x%016llx\t0x%016llx\n", "sgpt", last, 512 * 1024ULL); disk_part_iter_exit(&piter); return 0; }
static dev_t find_devt_for_selftest(struct device *dev) { int i, idx = 0; uint32_t count = 0; uint64_t size; uint64_t size_list[MAX_SCAN_PART]; dev_t devt_list[MAX_SCAN_PART]; dev_t devt_scan, devt; struct block_device *bdev; fmode_t fmode = FMODE_WRITE | FMODE_READ; do { for (i = 0; i < MAX_SCAN_PART; i++) { devt_scan = blk_lookup_devt("sda", i); bdev = blkdev_get_by_dev(devt_scan, fmode, NULL); if (IS_ERR(bdev)) continue; else { size_list[idx++] = (uint64_t)i_size_read(bdev->bd_inode); devt_list[idx++] = devt_scan; } } if (!idx) { mdelay(100); count++; continue; } for (i = 0; i < idx; i++) { if (i == 0) { size = size_list[i]; devt = devt_list[i]; } else { if (size < size_list[i]) devt = devt_list[i]; } } return devt; } while (count < 100); dev_err(dev, "SCSI disk isn't initialized yet. It makes to fail FMP selftest\n"); return (dev_t)0; }
dev_t name_to_dev_t(char *name) { char s[32]; char *p; dev_t res = 0; if (strncmp(name, "/dev/", 5) != 0) { unsigned maj, min; if (sscanf(name, "%u:%u", &maj, &min) == 2) { res = MKDEV(maj, min); if (maj != MAJOR(res) || min != MINOR(res)) goto fail; } else { res = new_decode_dev(simple_strtoul(name, &p, 16)); if (*p) goto fail; } goto done; } name += 5; res = Root_NFS; if (strcmp(name, "nfs") == 0) goto done; res = Root_RAM0; if (strcmp(name, "ram") == 0) goto done; if (strlen(name) > 31) goto fail; strcpy(s, name); for (p = s; *p; p++) if (*p == '/') *p = '!'; res = blk_lookup_devt(s); if (res) goto done; fail: return 0; done: return res; }
static dev_t find_devt_for_selftest(void) { int i, idx = 0; uint64_t size; uint64_t size_list[MAX_SCAN_PART]; dev_t devt_list[MAX_SCAN_PART]; dev_t devt_scan, devt; struct block_device *bdev; fmode_t fmode = FMODE_WRITE | FMODE_READ; for (i = 0; i < MAX_SCAN_PART; i++) { devt_scan = blk_lookup_devt("sda", i); bdev = blkdev_get_by_dev(devt_scan, fmode, NULL); if (IS_ERR(bdev)) continue; else { size_list[idx++] = (uint64_t)i_size_read(bdev->bd_inode); devt_list[idx++] = devt_scan; } } if (!idx) goto err; for (i = 0; i < idx; i++) { if (i == 0) { size = size_list[i]; devt = devt_list[i]; } else { if (size < size_list[i]) devt = devt_list[i]; } } return devt; err: return (dev_t)0; }
dev_t name_to_dev_t(char *name) { char s[32]; char *p; dev_t res = 0; int part; #ifdef CONFIG_BLOCK if (strncmp(name, "PARTUUID=", 9) == 0) { name += 9; res = devt_from_partuuid(name); if (!res) goto fail; goto done; } #endif if (strncmp(name, "/dev/", 5) != 0) { unsigned maj, min; if (sscanf(name, "%u:%u", &maj, &min) == 2) { res = MKDEV(maj, min); if (maj != MAJOR(res) || min != MINOR(res)) goto fail; } else { res = new_decode_dev(simple_strtoul(name, &p, 16)); if (*p) goto fail; } goto done; } name += 5; res = Root_NFS; if (strcmp(name, "nfs") == 0) goto done; res = Root_RAM0; if (strcmp(name, "ram") == 0) goto done; if (strlen(name) > 31) goto fail; strcpy(s, name); for (p = s; *p; p++) if (*p == '/') *p = '!'; res = blk_lookup_devt(s, 0); if (res) goto done; /* * try non-existent, but valid partition, which may only exist * after revalidating the disk, like partitioned md devices */ while (p > s && isdigit(p[-1])) p--; if (p == s || !*p || *p == '0') goto fail; /* try disk name without <part number> */ part = simple_strtoul(p, NULL, 10); *p = '\0'; res = blk_lookup_devt(s, part); if (res) goto done; /* try disk name without p<part number> */ if (p < s + 2 || !isdigit(p[-2]) || p[-1] != 'p') goto fail; p[-1] = '\0'; res = blk_lookup_devt(s, part); if (res) goto done; fail: return 0; done: return res; }
unsigned int size /*unsigned long long int _makedev (unsigned int __major,unsigned int __minor) { return ((__major<<20)|(((1U<<20)-1)&&__minor)); } */ dev_t name_to_dev_t(char *name) { char s[32]; char *p; dev_t res = 0; int part; if (strncmp(name, "/dev/", 5) != 0) { unsigned maj, min; if (sscanf(name, "%u:%u", &maj, &min) == 2) { res = MKDEV(maj, min); if (maj != MAJOR(res) || min != MINOR(res)) goto fail; } else { res = new_decode_dev(simple_strtoul(name, &p, 16)); if (*p) goto fail; } goto done; } name += 5; res = Root_NFS; if (strcmp(name, "nfs") == 0) goto done; res = Root_RAM0; if (strcmp(name, "ram") == 0) goto done; if (strlen(name) > 31) goto fail; strcpy(s, name); for (p = s; *p; p++) if (*p == '/') *p = '!'; res = blk_lookup_devt(s, 0); if (res) { printk("after lookup\n"); goto done; } while (p > s && isdigit(p[-1])) p--; if (p == s || !*p || *p == '0') goto fail; /* try disk name without <part number> */ part = simple_strtoul(p, NULL, 10); *p = '\0'; res = blk_lookup_devt(s, part); if (res) goto done; /* try disk name without p<part number> */ if (p < s + 2 || !isdigit(p[-2]) || p[-1] != 'p') goto fail; p[-1] = '\0'; res = blk_lookup_devt(s, part); if (res) goto done; fail: return 0; done: return res; }
dev_t name_to_dev_t(char *name) { char s[32]; char *p; dev_t res = 0; int part; if (strncmp(name, "/dev/", 5) != 0) { unsigned maj, min; if (sscanf(name, "%u:%u", &maj, &min) == 2) { res = MKDEV(maj, min); if (maj != MAJOR(res) || min != MINOR(res)) goto fail; } else { res = new_decode_dev(simple_strtoul(name, &p, 16)); if (*p) goto fail; } goto done; } name += 5; res = Root_NFS; if (strcmp(name, "nfs") == 0) goto done; res = Root_RAM0; if (strcmp(name, "ram") == 0) goto done; if (strlen(name) > 31) goto fail; strcpy(s, name); for (p = s; *p; p++) if (*p == '/') *p = '!'; res = blk_lookup_devt(s, 0); if (res) { goto done; } while (p > s && isdigit(p[-1])) p--; if (p == s || !*p || *p == '0') goto fail; part = simple_strtoul(p, NULL, 10); *p = '\0'; res = blk_lookup_devt(s, part); if (res) goto done; if (p < s + 2 || !isdigit(p[-2]) || p[-1] != 'p') goto fail; p[-1] = '\0'; res = blk_lookup_devt(s, part); if (res) goto done; fail: return 0; done: return res; }
dev_t name_to_dev_t(char *name) { char s[32]; char *p; dev_t res = 0; int part; if (strncmp(name, "/dev/", 5) != 0) { unsigned maj, min; if (sscanf(name, "%u:%u", &maj, &min) == 2) { res = MKDEV(maj, min); if (maj != MAJOR(res) || min != MINOR(res)) goto fail; } else { res = new_decode_dev(simple_strtoul(name, &p, 16)); if (*p) goto fail; } goto done; } name += 5; res = Root_NFS; if (strcmp(name, "nfs") == 0) goto done; res = Root_RAM0; if (strcmp(name, "ram") == 0) goto done; #if defined(CONFIG_MTD_BLOCK) || defined(CONFIG_MTD_BLOCK_RO) /* Allow specification of MTD device by name, e.g. * root=/dev/mtdblock:foo * Similar to JFFS2-specific hack in prepare_namespace(), * but more generic. */ if (strncmp(name, "mtdblock:", sizeof("mtdblock:") - 1) == 0) { struct mtd_info *mtd = get_mtd_device_nm(name + sizeof("mtdblock:") - 1); if (unlikely(!mtd)) goto fail; sprintf(name, "mtdblock%d", mtd->index); put_mtd_device(mtd); } #endif if (strlen(name) > 31) goto fail; strcpy(s, name); for (p = s; *p; p++) if (*p == '/') *p = '!'; res = blk_lookup_devt(s, 0); if (res) goto done; /* * try non-existant, but valid partition, which may only exist * after revalidating the disk, like partitioned md devices */ while (p > s && isdigit(p[-1])) p--; if (p == s || !*p || *p == '0') goto fail; /* try disk name without <part number> */ part = simple_strtoul(p, NULL, 10); *p = '\0'; res = blk_lookup_devt(s, part); if (res) goto done; /* try disk name without p<part number> */ if (p < s + 2 || !isdigit(p[-2]) || p[-1] != 'p') goto fail; p[-1] = '\0'; res = blk_lookup_devt(s, part); if (res) goto done; fail: return 0; done: return res; }