* Unify reading the FAT volume label. One of two places didn't yet handle FAT32
volume labels at all. * Use the common function in both identifying and mounting the volume so the name is in sync between what the disk device manager got through scanning and what Tracker gets through reading the fs stat. * Strip trailing spaces from volume names in all places. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25828 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -146,6 +146,35 @@ debug_dc2s(int argc, char **argv)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
dosfs_trim_spaces(char *label)
|
||||||
|
{
|
||||||
|
uint8 index;
|
||||||
|
for (index = 10; index > 0; index--) {
|
||||||
|
if (label[index] == ' ')
|
||||||
|
label[index] = 0;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
dosfs_read_label(bool fat32, uint8 *buffer, char *label)
|
||||||
|
{
|
||||||
|
uint8 check = fat32 ? 0x42 : 0x29;
|
||||||
|
uint8 offset = fat32 ? 0x47 : 0x2b;
|
||||||
|
|
||||||
|
if (buffer[check] == 0x29
|
||||||
|
&& memcmp(buffer + offset, " ", 11) != 0) {
|
||||||
|
memcpy(label, buffer + offset, 11);
|
||||||
|
dosfs_trim_spaces(label);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
lock_removable_device(int fd, bool state)
|
lock_removable_device(int fd, bool state)
|
||||||
{
|
{
|
||||||
@@ -283,7 +312,7 @@ mount_fat_disk(const char *path, fs_volume *_vol, const int flags,
|
|||||||
}
|
}
|
||||||
|
|
||||||
vol->vol_entry = -2; // for now, assume there is no volume entry
|
vol->vol_entry = -2; // for now, assume there is no volume entry
|
||||||
memset(vol->vol_label, ' ', 11);
|
strcpy(vol->vol_label, "no name");
|
||||||
|
|
||||||
// now become more discerning citizens
|
// now become more discerning citizens
|
||||||
vol->sectors_per_fat = read16(buf,0x16);
|
vol->sectors_per_fat = read16(buf,0x16);
|
||||||
@@ -311,6 +340,9 @@ mount_fat_disk(const char *path, fs_volume *_vol, const int flags,
|
|||||||
dprintf("dosfs: root vnode cluster too large (%lx)\n", vol->root_vnode.cluster);
|
dprintf("dosfs: root vnode cluster too large (%lx)\n", vol->root_vnode.cluster);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dosfs_read_label(true, buf, vol->vol_label))
|
||||||
|
vol->vol_entry = -1;
|
||||||
} else {
|
} else {
|
||||||
// fat12 & fat16
|
// fat12 & fat16
|
||||||
if (vol->fat_count != 2) {
|
if (vol->fat_count != 2) {
|
||||||
@@ -351,15 +383,6 @@ mount_fat_disk(const char *path, fs_volume *_vol, const int flags,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (buf[0x26] == 0x29) {
|
|
||||||
// fill in the volume label
|
|
||||||
if (memcmp(buf+0x2b, " ", 11)) {
|
|
||||||
memcpy(vol->vol_label, buf+0x2b, 11);
|
|
||||||
vol->vol_entry = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
vol->fat_mirrored = true;
|
vol->fat_mirrored = true;
|
||||||
vol->active_fat = 0;
|
vol->active_fat = 0;
|
||||||
|
|
||||||
@@ -378,6 +401,9 @@ mount_fat_disk(const char *path, fs_volume *_vol, const int flags,
|
|||||||
vol->fat_bits = 16;
|
vol->fat_bits = 16;
|
||||||
else
|
else
|
||||||
vol->fat_bits = 12;
|
vol->fat_bits = 12;
|
||||||
|
|
||||||
|
if (dosfs_read_label(false, buf, vol->vol_label))
|
||||||
|
vol->vol_entry = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check that the partition is large enough to contain the file system */
|
/* check that the partition is large enough to contain the file system */
|
||||||
@@ -528,6 +554,7 @@ mount_fat_disk(const char *path, fs_volume *_vol, const int flags,
|
|||||||
if ((buffer[0x0b] & FAT_VOLUME) && (buffer[0x0b] != 0xf) && (buffer[0] != 0xe5)) {
|
if ((buffer[0x0b] & FAT_VOLUME) && (buffer[0x0b] != 0xf) && (buffer[0] != 0xe5)) {
|
||||||
vol->vol_entry = diri.current_index;
|
vol->vol_entry = diri.current_index;
|
||||||
memcpy(vol->vol_label, buffer, 11);
|
memcpy(vol->vol_label, buffer, 11);
|
||||||
|
dosfs_trim_spaces(vol->vol_label);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -535,7 +562,7 @@ mount_fat_disk(const char *path, fs_volume *_vol, const int flags,
|
|||||||
}
|
}
|
||||||
|
|
||||||
DPRINTF(0, ("root vnode id = %Lx\n", vol->root_vnode.vnid));
|
DPRINTF(0, ("root vnode id = %Lx\n", vol->root_vnode.vnid));
|
||||||
DPRINTF(0, ("volume label [%11.11s] (%lx)\n", vol->vol_label, vol->vol_entry));
|
DPRINTF(0, ("volume label [%s] (%lx)\n", vol->vol_label, vol->vol_entry));
|
||||||
|
|
||||||
// steal a trick from bfs
|
// steal a trick from bfs
|
||||||
if (!memcmp(vol->vol_label, "__RO__ ", 11)) {
|
if (!memcmp(vol->vol_label, "__RO__ ", 11)) {
|
||||||
@@ -622,26 +649,17 @@ dosfs_identify_partition(int fd, partition_data *partition, void **_cookie)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
strcpy(name, "no name ");
|
strcpy(name, "no name");
|
||||||
sectors_per_fat = read16(buf,0x16);
|
sectors_per_fat = read16(buf,0x16);
|
||||||
if (sectors_per_fat == 0) {
|
if (sectors_per_fat == 0) {
|
||||||
total_sectors = read32(buf,0x20);
|
total_sectors = read32(buf,0x20);
|
||||||
|
dosfs_read_label(true, buf, name);
|
||||||
if (buf[0x42] == 0x29) {
|
|
||||||
// fill in FAT32 volume label
|
|
||||||
if (memcmp(buf + 0x47, " ", 11) != 0)
|
|
||||||
memcpy(name, buf + 0x47, 11);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
total_sectors = read16(buf,0x13); // partition size
|
total_sectors = read16(buf,0x13); // partition size
|
||||||
if (total_sectors == 0)
|
if (total_sectors == 0)
|
||||||
total_sectors = read32(buf,0x20);
|
total_sectors = read32(buf,0x20);
|
||||||
|
|
||||||
if (buf[0x26] == 0x29) {
|
dosfs_read_label(false, buf, name);
|
||||||
// fill in the volume label
|
|
||||||
if (memcmp(buf + 0x2b, " ", 11) != 0)
|
|
||||||
memcpy(name, buf + 0x2b, 11);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cookie = (identify_cookie *)malloc(sizeof(identify_cookie));
|
cookie = (identify_cookie *)malloc(sizeof(identify_cookie));
|
||||||
@@ -924,7 +942,7 @@ dosfs_read_fs_stat(fs_volume *_vol, struct fs_info * fss)
|
|||||||
if (vol->vol_entry > -2)
|
if (vol->vol_entry > -2)
|
||||||
strncpy(fss->volume_name, vol->vol_label, sizeof(fss->volume_name));
|
strncpy(fss->volume_name, vol->vol_label, sizeof(fss->volume_name));
|
||||||
else
|
else
|
||||||
strcpy(fss->volume_name, "no name ");
|
strcpy(fss->volume_name, "no name");
|
||||||
|
|
||||||
// XXX: should sanitize name as well
|
// XXX: should sanitize name as well
|
||||||
for (i=10;i>0;i--)
|
for (i=10;i>0;i--)
|
||||||
@@ -996,13 +1014,16 @@ dosfs_write_fs_stat(fs_volume *_vol, const struct fs_info * fss, uint32 mask)
|
|||||||
result = EIO;
|
result = EIO;
|
||||||
goto bi;
|
goto bi;
|
||||||
}
|
}
|
||||||
if ((buffer[0x26] != 0x29) || memcmp(buffer + 0x2b, vol->vol_label, 11)) {
|
if ((vol->sectors_per_fat == 0 && (buffer[0x42] != 0x29
|
||||||
|
|| strncmp(buffer + 0x47, vol->vol_label, 11) != 0))
|
||||||
|
|| (vol->sectors_per_fat != 0 && (buffer[0x26] != 0x29
|
||||||
|
|| strncmp(buffer + 0x2b, vol->vol_label, 11) != 0))) {
|
||||||
dprintf("dosfs_wfsstat: label mismatch\n");
|
dprintf("dosfs_wfsstat: label mismatch\n");
|
||||||
block_cache_set_dirty(vol->fBlockCache, 0, false, tid);
|
block_cache_set_dirty(vol->fBlockCache, 0, false, tid);
|
||||||
result = B_ERROR;
|
result = B_ERROR;
|
||||||
} else {
|
} else {
|
||||||
memcpy(buffer + 0x2b, name, 11);
|
memcpy(buffer + 0x2b, name, 11);
|
||||||
result = 0;
|
result = B_OK;
|
||||||
}
|
}
|
||||||
block_cache_put(vol->fBlockCache, 0);
|
block_cache_put(vol->fBlockCache, 0);
|
||||||
cache_end_transaction(vol->fBlockCache, tid, NULL, NULL);
|
cache_end_transaction(vol->fBlockCache, tid, NULL, NULL);
|
||||||
@@ -1012,7 +1033,7 @@ dosfs_write_fs_stat(fs_volume *_vol, const struct fs_info * fss, uint32 mask)
|
|||||||
buffer = diri_init(vol, vol->root_vnode.cluster, vol->vol_entry, &diri);
|
buffer = diri_init(vol, vol->root_vnode.cluster, vol->vol_entry, &diri);
|
||||||
|
|
||||||
// check if it is the same as the old volume label
|
// check if it is the same as the old volume label
|
||||||
if ((buffer == NULL) || (memcmp(buffer, vol->vol_label, 11))) {
|
if ((buffer == NULL) || (strncmp(buffer, vol->vol_label, 11))) {
|
||||||
dprintf("dosfs_wfsstat: label mismatch\n");
|
dprintf("dosfs_wfsstat: label mismatch\n");
|
||||||
diri_free(&diri);
|
diri_free(&diri);
|
||||||
result = B_ERROR;
|
result = B_ERROR;
|
||||||
@@ -1021,15 +1042,17 @@ dosfs_write_fs_stat(fs_volume *_vol, const struct fs_info * fss, uint32 mask)
|
|||||||
memcpy(buffer, name, 11);
|
memcpy(buffer, name, 11);
|
||||||
diri_mark_dirty(&diri);
|
diri_mark_dirty(&diri);
|
||||||
diri_free(&diri);
|
diri_free(&diri);
|
||||||
result = 0;
|
result = B_OK;
|
||||||
} else {
|
} else {
|
||||||
uint32 index;
|
uint32 index;
|
||||||
result = create_volume_label(vol, name, &index);
|
result = create_volume_label(vol, name, &index);
|
||||||
if (result == B_OK) vol->vol_entry = index;
|
if (result == B_OK) vol->vol_entry = index;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result == 0)
|
if (result == B_OK) {
|
||||||
memcpy(vol->vol_label, name, 11);
|
memcpy(vol->vol_label, name, 11);
|
||||||
|
dosfs_trim_spaces(vol->vol_label);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vol->fs_flags & FS_FLAGS_OP_SYNC)
|
if (vol->fs_flags & FS_FLAGS_OP_SYNC)
|
||||||
@@ -1083,7 +1106,7 @@ dosfs_ioctl(fs_volume *_vol, fs_vnode *_node, void *cookie, ulong code,
|
|||||||
dprintf("fat mirroring is %s, fs info sector at sector %x\n", (vol->fat_mirrored) ? "on" : "off", vol->fsinfo_sector);
|
dprintf("fat mirroring is %s, fs info sector at sector %x\n", (vol->fat_mirrored) ? "on" : "off", vol->fsinfo_sector);
|
||||||
dprintf("last allocated cluster = %lx\n", vol->last_allocated);
|
dprintf("last allocated cluster = %lx\n", vol->last_allocated);
|
||||||
dprintf("root vnode id = %Lx\n", vol->root_vnode.vnid);
|
dprintf("root vnode id = %Lx\n", vol->root_vnode.vnid);
|
||||||
dprintf("volume label [%11.11s]\n", vol->vol_label);
|
dprintf("volume label [%s]\n", vol->vol_label);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 100001 :
|
case 100001 :
|
||||||
|
|||||||
Reference in New Issue
Block a user