Skip to content

Commit

Permalink
partitions: fix sometimes unreadable partition strings
Browse files Browse the repository at this point in the history
Fix this garbage happening quite often:

==>	 sda:
	scsi 3:0:0:0: CD-ROM            TOSHIBA
==>	 sda1 sda2 sda3 sda4 <sr0: scsi3-mmc drive: 24x/24x writer dvd-ram cd/rw xa/form2 cdda tray
			    ^^^
	Uniform CD-ROM driver Revision: 3.20
	sr 3:0:0:0: Attached scsi CD-ROM sr0
==>	 sda5 sda6 sda7 >

Make "sda: sda1 ..." lines actually lines.

Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Alexey Dobriyan authored and Linus Torvalds committed Aug 11, 2010
1 parent ecd6269 commit 9c867fb
Show file tree
Hide file tree
Showing 16 changed files with 136 additions and 72 deletions.
35 changes: 20 additions & 15 deletions fs/partitions/acorn.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,11 @@ adfs_partition(struct parsed_partitions *state, char *name, char *data,
nr_sects = (le32_to_cpu(dr->disc_size_high) << 23) |
(le32_to_cpu(dr->disc_size) >> 9);

if (name)
printk(" [%s]", name);
if (name) {
strlcat(state->pp_buf, " [", PAGE_SIZE);
strlcat(state->pp_buf, name, PAGE_SIZE);
strlcat(state->pp_buf, "]", PAGE_SIZE);
}
put_partition(state, slot, first_sector, nr_sects);
return dr;
}
Expand Down Expand Up @@ -81,14 +84,14 @@ static int riscix_partition(struct parsed_partitions *state,
if (!rr)
return -1;

printk(" [RISCiX]");
strlcat(state->pp_buf, " [RISCiX]", PAGE_SIZE);


if (rr->magic == RISCIX_MAGIC) {
unsigned long size = nr_sects > 2 ? 2 : nr_sects;
int part;

printk(" <");
strlcat(state->pp_buf, " <", PAGE_SIZE);

put_partition(state, slot++, first_sect, size);
for (part = 0; part < 8; part++) {
Expand All @@ -97,11 +100,13 @@ static int riscix_partition(struct parsed_partitions *state,
put_partition(state, slot++,
le32_to_cpu(rr->part[part].start),
le32_to_cpu(rr->part[part].length));
printk("(%s)", rr->part[part].name);
strlcat(state->pp_buf, "(", PAGE_SIZE);
strlcat(state->pp_buf, rr->part[part].name, PAGE_SIZE);
strlcat(state->pp_buf, ")", PAGE_SIZE);
}
}

printk(" >\n");
strlcat(state->pp_buf, " >\n", PAGE_SIZE);
} else {
put_partition(state, slot++, first_sect, nr_sects);
}
Expand Down Expand Up @@ -131,15 +136,15 @@ static int linux_partition(struct parsed_partitions *state,
struct linux_part *linuxp;
unsigned long size = nr_sects > 2 ? 2 : nr_sects;

printk(" [Linux]");
strlcat(state->pp_buf, " [Linux]", PAGE_SIZE);

put_partition(state, slot++, first_sect, size);

linuxp = read_part_sector(state, first_sect, &sect);
if (!linuxp)
return -1;

printk(" <");
strlcat(state->pp_buf, " <", PAGE_SIZE);
while (linuxp->magic == cpu_to_le32(LINUX_NATIVE_MAGIC) ||
linuxp->magic == cpu_to_le32(LINUX_SWAP_MAGIC)) {
if (slot == state->limit)
Expand All @@ -149,7 +154,7 @@ static int linux_partition(struct parsed_partitions *state,
le32_to_cpu(linuxp->nr_sects));
linuxp ++;
}
printk(" >");
strlcat(state->pp_buf, " >", PAGE_SIZE);

put_dev_sector(sect);
return slot;
Expand Down Expand Up @@ -294,7 +299,7 @@ int adfspart_check_ADFS(struct parsed_partitions *state)
break;
}
}
printk("\n");
strlcat(state->pp_buf, "\n", PAGE_SIZE);
return 1;
}
#endif
Expand Down Expand Up @@ -367,7 +372,7 @@ int adfspart_check_ICS(struct parsed_partitions *state)
return 0;
}

printk(" [ICS]");
strlcat(state->pp_buf, " [ICS]", PAGE_SIZE);

for (slot = 1, p = (const struct ics_part *)data; p->size; p++) {
u32 start = le32_to_cpu(p->start);
Expand Down Expand Up @@ -401,7 +406,7 @@ int adfspart_check_ICS(struct parsed_partitions *state)
}

put_dev_sector(sect);
printk("\n");
strlcat(state->pp_buf, "\n", PAGE_SIZE);
return 1;
}
#endif
Expand Down Expand Up @@ -461,7 +466,7 @@ int adfspart_check_POWERTEC(struct parsed_partitions *state)
return 0;
}

printk(" [POWERTEC]");
strlcat(state->pp_buf, " [POWERTEC]", PAGE_SIZE);

for (i = 0, p = (const struct ptec_part *)data; i < 12; i++, p++) {
u32 start = le32_to_cpu(p->start);
Expand All @@ -472,7 +477,7 @@ int adfspart_check_POWERTEC(struct parsed_partitions *state)
}

put_dev_sector(sect);
printk("\n");
strlcat(state->pp_buf, "\n", PAGE_SIZE);
return 1;
}
#endif
Expand Down Expand Up @@ -543,7 +548,7 @@ int adfspart_check_EESOX(struct parsed_partitions *state)

size = get_capacity(state->bdev->bd_disk);
put_partition(state, slot++, start, size - start);
printk("\n");
strlcat(state->pp_buf, "\n", PAGE_SIZE);
}

return i ? 1 : 0;
Expand Down
20 changes: 15 additions & 5 deletions fs/partitions/amiga.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,13 @@ int amiga_partition(struct parsed_partitions *state)
/* blksize is blocks per 512 byte standard block */
blksize = be32_to_cpu( rdb->rdb_BlockBytes ) / 512;

printk(" RDSK (%d)", blksize * 512); /* Be more informative */
{
char tmp[7 + 10 + 1 + 1];

/* Be more informative */
snprintf(tmp, sizeof(tmp), " RDSK (%d)", blksize * 512);
strlcat(state->pp_buf, tmp, PAGE_SIZE);
}
blk = be32_to_cpu(rdb->rdb_PartitionList);
put_dev_sector(sect);
for (part = 1; blk>0 && part<=16; part++, put_dev_sector(sect)) {
Expand Down Expand Up @@ -106,23 +112,27 @@ int amiga_partition(struct parsed_partitions *state)
{
/* Be even more informative to aid mounting */
char dostype[4];
char tmp[42];

__be32 *dt = (__be32 *)dostype;
*dt = pb->pb_Environment[16];
if (dostype[3] < ' ')
printk(" (%c%c%c^%c)",
snprintf(tmp, sizeof(tmp), " (%c%c%c^%c)",
dostype[0], dostype[1],
dostype[2], dostype[3] + '@' );
else
printk(" (%c%c%c%c)",
snprintf(tmp, sizeof(tmp), " (%c%c%c%c)",
dostype[0], dostype[1],
dostype[2], dostype[3]);
printk("(res %d spb %d)",
strlcat(state->pp_buf, tmp, PAGE_SIZE);
snprintf(tmp, sizeof(tmp), "(res %d spb %d)",
be32_to_cpu(pb->pb_Environment[6]),
be32_to_cpu(pb->pb_Environment[4]));
strlcat(state->pp_buf, tmp, PAGE_SIZE);
}
res = 1;
}
printk("\n");
strlcat(state->pp_buf, "\n", PAGE_SIZE);

rdb_done:
return res;
Expand Down
12 changes: 6 additions & 6 deletions fs/partitions/atari.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ int atari_partition(struct parsed_partitions *state)
}

pi = &rs->part[0];
printk (" AHDI");
strlcat(state->pp_buf, " AHDI", PAGE_SIZE);
for (slot = 1; pi < &rs->part[4] && slot < state->limit; slot++, pi++) {
struct rootsector *xrs;
Sector sect2;
Expand All @@ -81,7 +81,7 @@ int atari_partition(struct parsed_partitions *state)
#ifdef ICD_PARTS
part_fmt = 1;
#endif
printk(" XGM<");
strlcat(state->pp_buf, " XGM<", PAGE_SIZE);
partsect = extensect = be32_to_cpu(pi->st);
while (1) {
xrs = read_part_sector(state, partsect, &sect2);
Expand Down Expand Up @@ -120,14 +120,14 @@ int atari_partition(struct parsed_partitions *state)
break;
}
}
printk(" >");
strlcat(state->pp_buf, " >", PAGE_SIZE);
}
#ifdef ICD_PARTS
if ( part_fmt!=1 ) { /* no extended partitions -> test ICD-format */
pi = &rs->icdpart[0];
/* sanity check: no ICD format if first partition invalid */
if (OK_id(pi->id)) {
printk(" ICD<");
strlcat(state->pp_buf, " ICD<", PAGE_SIZE);
for (; pi < &rs->icdpart[8] && slot < state->limit; slot++, pi++) {
/* accept only GEM,BGM,RAW,LNX,SWP partitions */
if (!((pi->flg & 1) && OK_id(pi->id)))
Expand All @@ -137,13 +137,13 @@ int atari_partition(struct parsed_partitions *state)
be32_to_cpu(pi->st),
be32_to_cpu(pi->siz));
}
printk(" >");
strlcat(state->pp_buf, " >", PAGE_SIZE);
}
}
#endif
put_dev_sector(sect);

printk ("\n");
strlcat(state->pp_buf, "\n", PAGE_SIZE);

return 1;
}
22 changes: 18 additions & 4 deletions fs/partitions/check.c
Original file line number Diff line number Diff line change
Expand Up @@ -164,10 +164,16 @@ check_partition(struct gendisk *hd, struct block_device *bdev)
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);
printk(KERN_INFO " %s:", state->name);
snprintf(state->pp_buf, PAGE_SIZE, " %s:", state->name);
if (isdigit(state->name[strlen(state->name)-1]))
sprintf(state->name, "p");

Expand All @@ -185,17 +191,25 @@ check_partition(struct gendisk *hd, struct block_device *bdev)
}

}
if (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)
printk(" unknown partition table\n");
strlcat(state->pp_buf, " unknown partition table\n", PAGE_SIZE);
else if (warn_no_part)
printk(" unable to read partition table\n");
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);
}
Expand Down
6 changes: 5 additions & 1 deletion fs/partitions/check.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ struct parsed_partitions {
int next;
int limit;
bool access_beyond_eod;
char *pp_buf;
};

static inline void *read_part_sector(struct parsed_partitions *state,
Expand All @@ -32,9 +33,12 @@ static inline void
put_partition(struct parsed_partitions *p, int n, sector_t from, sector_t size)
{
if (n < p->limit) {
char tmp[1 + BDEVNAME_SIZE + 10 + 1];

p->parts[n].from = from;
p->parts[n].size = size;
printk(" %s%d", p->name, n);
snprintf(tmp, sizeof(tmp), " %s%d", p->name, n);
strlcat(p->pp_buf, tmp, PAGE_SIZE);
}
}

Expand Down
2 changes: 1 addition & 1 deletion fs/partitions/efi.c
Original file line number Diff line number Diff line change
Expand Up @@ -630,6 +630,6 @@ int efi_partition(struct parsed_partitions *state)
}
kfree(ptes);
kfree(gpt);
printk("\n");
strlcat(state->pp_buf, "\n", PAGE_SIZE);
return 1;
}
17 changes: 11 additions & 6 deletions fs/partitions/ibm.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ int ibm_partition(struct parsed_partitions *state)
unsigned char *data;
Sector sect;
sector_t labelsect;
char tmp[64];

res = 0;
blocksize = bdev_logical_block_size(bdev);
Expand Down Expand Up @@ -144,13 +145,15 @@ int ibm_partition(struct parsed_partitions *state)
*/
blocksize = label->cms.block_size;
if (label->cms.disk_offset != 0) {
printk("CMS1/%8s(MDSK):", name);
snprintf(tmp, sizeof(tmp), "CMS1/%8s(MDSK):", name);
strlcat(state->pp_buf, tmp, PAGE_SIZE);
/* disk is reserved minidisk */
offset = label->cms.disk_offset;
size = (label->cms.block_count - 1)
* (blocksize >> 9);
} else {
printk("CMS1/%8s:", name);
snprintf(tmp, sizeof(tmp), "CMS1/%8s:", name);
strlcat(state->pp_buf, tmp, PAGE_SIZE);
offset = (info->label_block + 1);
size = label->cms.block_count
* (blocksize >> 9);
Expand All @@ -159,7 +162,8 @@ int ibm_partition(struct parsed_partitions *state)
size-offset*(blocksize >> 9));
} else {
if (strncmp(type, "LNX1", 4) == 0) {
printk("LNX1/%8s:", name);
snprintf(tmp, sizeof(tmp), "LNX1/%8s:", name);
strlcat(state->pp_buf, tmp, PAGE_SIZE);
if (label->lnx.ldl_version == 0xf2) {
fmt_size = label->lnx.formatted_blocks
* (blocksize >> 9);
Expand All @@ -178,7 +182,7 @@ int ibm_partition(struct parsed_partitions *state)
offset = (info->label_block + 1);
} else {
/* unlabeled disk */
printk("(nonl)");
strlcat(tmp, sizeof(tmp), "(nonl)", PAGE_SIZE);
size = i_size >> 9;
offset = (info->label_block + 1);
}
Expand All @@ -197,7 +201,8 @@ int ibm_partition(struct parsed_partitions *state)
* if not, something is wrong, skipping partition detection
*/
if (strncmp(type, "VOL1", 4) == 0) {
printk("VOL1/%8s:", name);
snprintf(tmp, sizeof(tmp), "VOL1/%8s:", name);
strlcat(state->pp_buf, tmp, PAGE_SIZE);
/*
* get block number and read then go through format1
* labels
Expand Down Expand Up @@ -253,7 +258,7 @@ int ibm_partition(struct parsed_partitions *state)

}

printk("\n");
strlcat(state->pp_buf, "\n", PAGE_SIZE);
goto out_freeall;


Expand Down
2 changes: 1 addition & 1 deletion fs/partitions/karma.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ int karma_partition(struct parsed_partitions *state)
}
slot++;
}
printk("\n");
strlcat(state->pp_buf, "\n", PAGE_SIZE);
put_dev_sector(sect);
return 1;
}
Expand Down
4 changes: 2 additions & 2 deletions fs/partitions/ldm.c
Original file line number Diff line number Diff line change
Expand Up @@ -643,7 +643,7 @@ static bool ldm_create_data_partitions (struct parsed_partitions *pp,
return false;
}

printk (" [LDM]");
strlcat(pp->pp_buf, " [LDM]", PAGE_SIZE);

/* Create the data partitions */
list_for_each (item, &ldb->v_part) {
Expand All @@ -658,7 +658,7 @@ static bool ldm_create_data_partitions (struct parsed_partitions *pp,
part_num++;
}

printk ("\n");
strlcat(pp->pp_buf, "\n", PAGE_SIZE);
return true;
}

Expand Down
Loading

0 comments on commit 9c867fb

Please sign in to comment.