diff options
Diffstat (limited to 'fs/hpfs/super.c')
| -rw-r--r-- | fs/hpfs/super.c | 118 |
1 files changed, 51 insertions, 67 deletions
diff --git a/fs/hpfs/super.c b/fs/hpfs/super.c index c89b40808587..98580a3b5005 100644 --- a/fs/hpfs/super.c +++ b/fs/hpfs/super.c | |||
| @@ -18,15 +18,16 @@ | |||
| 18 | 18 | ||
| 19 | /* Mark the filesystem dirty, so that chkdsk checks it when os/2 booted */ | 19 | /* Mark the filesystem dirty, so that chkdsk checks it when os/2 booted */ |
| 20 | 20 | ||
| 21 | static void mark_dirty(struct super_block *s) | 21 | static void mark_dirty(struct super_block *s, int remount) |
| 22 | { | 22 | { |
| 23 | if (hpfs_sb(s)->sb_chkdsk && !(s->s_flags & MS_RDONLY)) { | 23 | if (hpfs_sb(s)->sb_chkdsk && (remount || !(s->s_flags & MS_RDONLY))) { |
| 24 | struct buffer_head *bh; | 24 | struct buffer_head *bh; |
| 25 | struct hpfs_spare_block *sb; | 25 | struct hpfs_spare_block *sb; |
| 26 | if ((sb = hpfs_map_sector(s, 17, &bh, 0))) { | 26 | if ((sb = hpfs_map_sector(s, 17, &bh, 0))) { |
| 27 | sb->dirty = 1; | 27 | sb->dirty = 1; |
| 28 | sb->old_wrote = 0; | 28 | sb->old_wrote = 0; |
| 29 | mark_buffer_dirty(bh); | 29 | mark_buffer_dirty(bh); |
| 30 | sync_dirty_buffer(bh); | ||
| 30 | brelse(bh); | 31 | brelse(bh); |
| 31 | } | 32 | } |
| 32 | } | 33 | } |
| @@ -40,10 +41,12 @@ static void unmark_dirty(struct super_block *s) | |||
| 40 | struct buffer_head *bh; | 41 | struct buffer_head *bh; |
| 41 | struct hpfs_spare_block *sb; | 42 | struct hpfs_spare_block *sb; |
| 42 | if (s->s_flags & MS_RDONLY) return; | 43 | if (s->s_flags & MS_RDONLY) return; |
| 44 | sync_blockdev(s->s_bdev); | ||
| 43 | if ((sb = hpfs_map_sector(s, 17, &bh, 0))) { | 45 | if ((sb = hpfs_map_sector(s, 17, &bh, 0))) { |
| 44 | sb->dirty = hpfs_sb(s)->sb_chkdsk > 1 - hpfs_sb(s)->sb_was_error; | 46 | sb->dirty = hpfs_sb(s)->sb_chkdsk > 1 - hpfs_sb(s)->sb_was_error; |
| 45 | sb->old_wrote = hpfs_sb(s)->sb_chkdsk >= 2 && !hpfs_sb(s)->sb_was_error; | 47 | sb->old_wrote = hpfs_sb(s)->sb_chkdsk >= 2 && !hpfs_sb(s)->sb_was_error; |
| 46 | mark_buffer_dirty(bh); | 48 | mark_buffer_dirty(bh); |
| 49 | sync_dirty_buffer(bh); | ||
| 47 | brelse(bh); | 50 | brelse(bh); |
| 48 | } | 51 | } |
| 49 | } | 52 | } |
| @@ -63,13 +66,13 @@ void hpfs_error(struct super_block *s, const char *fmt, ...) | |||
| 63 | if (!hpfs_sb(s)->sb_was_error) { | 66 | if (!hpfs_sb(s)->sb_was_error) { |
| 64 | if (hpfs_sb(s)->sb_err == 2) { | 67 | if (hpfs_sb(s)->sb_err == 2) { |
| 65 | printk("; crashing the system because you wanted it\n"); | 68 | printk("; crashing the system because you wanted it\n"); |
| 66 | mark_dirty(s); | 69 | mark_dirty(s, 0); |
| 67 | panic("HPFS panic"); | 70 | panic("HPFS panic"); |
| 68 | } else if (hpfs_sb(s)->sb_err == 1) { | 71 | } else if (hpfs_sb(s)->sb_err == 1) { |
| 69 | if (s->s_flags & MS_RDONLY) printk("; already mounted read-only\n"); | 72 | if (s->s_flags & MS_RDONLY) printk("; already mounted read-only\n"); |
| 70 | else { | 73 | else { |
| 71 | printk("; remounting read-only\n"); | 74 | printk("; remounting read-only\n"); |
| 72 | mark_dirty(s); | 75 | mark_dirty(s, 0); |
| 73 | s->s_flags |= MS_RDONLY; | 76 | s->s_flags |= MS_RDONLY; |
| 74 | } | 77 | } |
| 75 | } else if (s->s_flags & MS_RDONLY) printk("; going on - but anything won't be destroyed because it's read-only\n"); | 78 | } else if (s->s_flags & MS_RDONLY) printk("; going on - but anything won't be destroyed because it's read-only\n"); |
| @@ -102,9 +105,12 @@ static void hpfs_put_super(struct super_block *s) | |||
| 102 | { | 105 | { |
| 103 | struct hpfs_sb_info *sbi = hpfs_sb(s); | 106 | struct hpfs_sb_info *sbi = hpfs_sb(s); |
| 104 | 107 | ||
| 108 | hpfs_lock(s); | ||
| 109 | unmark_dirty(s); | ||
| 110 | hpfs_unlock(s); | ||
| 111 | |||
| 105 | kfree(sbi->sb_cp_table); | 112 | kfree(sbi->sb_cp_table); |
| 106 | kfree(sbi->sb_bmp_dir); | 113 | kfree(sbi->sb_bmp_dir); |
| 107 | unmark_dirty(s); | ||
| 108 | s->s_fs_info = NULL; | 114 | s->s_fs_info = NULL; |
| 109 | kfree(sbi); | 115 | kfree(sbi); |
| 110 | } | 116 | } |
| @@ -129,7 +135,7 @@ static unsigned count_bitmaps(struct super_block *s) | |||
| 129 | n_bands = (hpfs_sb(s)->sb_fs_size + 0x3fff) >> 14; | 135 | n_bands = (hpfs_sb(s)->sb_fs_size + 0x3fff) >> 14; |
| 130 | count = 0; | 136 | count = 0; |
| 131 | for (n = 0; n < n_bands; n++) | 137 | for (n = 0; n < n_bands; n++) |
| 132 | count += hpfs_count_one_bitmap(s, hpfs_sb(s)->sb_bmp_dir[n]); | 138 | count += hpfs_count_one_bitmap(s, le32_to_cpu(hpfs_sb(s)->sb_bmp_dir[n])); |
| 133 | return count; | 139 | return count; |
| 134 | } | 140 | } |
| 135 | 141 | ||
| @@ -188,8 +194,6 @@ static void init_once(void *foo) | |||
| 188 | { | 194 | { |
| 189 | struct hpfs_inode_info *ei = (struct hpfs_inode_info *) foo; | 195 | struct hpfs_inode_info *ei = (struct hpfs_inode_info *) foo; |
| 190 | 196 | ||
| 191 | mutex_init(&ei->i_mutex); | ||
| 192 | mutex_init(&ei->i_parent_mutex); | ||
| 193 | inode_init_once(&ei->vfs_inode); | 197 | inode_init_once(&ei->vfs_inode); |
| 194 | } | 198 | } |
| 195 | 199 | ||
| @@ -218,7 +222,6 @@ static void destroy_inodecache(void) | |||
| 218 | 222 | ||
| 219 | enum { | 223 | enum { |
| 220 | Opt_help, Opt_uid, Opt_gid, Opt_umask, Opt_case_lower, Opt_case_asis, | 224 | Opt_help, Opt_uid, Opt_gid, Opt_umask, Opt_case_lower, Opt_case_asis, |
| 221 | Opt_conv_binary, Opt_conv_text, Opt_conv_auto, | ||
| 222 | Opt_check_none, Opt_check_normal, Opt_check_strict, | 225 | Opt_check_none, Opt_check_normal, Opt_check_strict, |
| 223 | Opt_err_cont, Opt_err_ro, Opt_err_panic, | 226 | Opt_err_cont, Opt_err_ro, Opt_err_panic, |
| 224 | Opt_eas_no, Opt_eas_ro, Opt_eas_rw, | 227 | Opt_eas_no, Opt_eas_ro, Opt_eas_rw, |
| @@ -233,9 +236,6 @@ static const match_table_t tokens = { | |||
| 233 | {Opt_umask, "umask=%o"}, | 236 | {Opt_umask, "umask=%o"}, |
| 234 | {Opt_case_lower, "case=lower"}, | 237 | {Opt_case_lower, "case=lower"}, |
| 235 | {Opt_case_asis, "case=asis"}, | 238 | {Opt_case_asis, "case=asis"}, |
| 236 | {Opt_conv_binary, "conv=binary"}, | ||
| 237 | {Opt_conv_text, "conv=text"}, | ||
| 238 | {Opt_conv_auto, "conv=auto"}, | ||
| 239 | {Opt_check_none, "check=none"}, | 239 | {Opt_check_none, "check=none"}, |
| 240 | {Opt_check_normal, "check=normal"}, | 240 | {Opt_check_normal, "check=normal"}, |
| 241 | {Opt_check_strict, "check=strict"}, | 241 | {Opt_check_strict, "check=strict"}, |
| @@ -253,7 +253,7 @@ static const match_table_t tokens = { | |||
| 253 | }; | 253 | }; |
| 254 | 254 | ||
| 255 | static int parse_opts(char *opts, uid_t *uid, gid_t *gid, umode_t *umask, | 255 | static int parse_opts(char *opts, uid_t *uid, gid_t *gid, umode_t *umask, |
| 256 | int *lowercase, int *conv, int *eas, int *chk, int *errs, | 256 | int *lowercase, int *eas, int *chk, int *errs, |
| 257 | int *chkdsk, int *timeshift) | 257 | int *chkdsk, int *timeshift) |
| 258 | { | 258 | { |
| 259 | char *p; | 259 | char *p; |
| @@ -295,15 +295,6 @@ static int parse_opts(char *opts, uid_t *uid, gid_t *gid, umode_t *umask, | |||
| 295 | case Opt_case_asis: | 295 | case Opt_case_asis: |
| 296 | *lowercase = 0; | 296 | *lowercase = 0; |
| 297 | break; | 297 | break; |
| 298 | case Opt_conv_binary: | ||
| 299 | *conv = CONV_BINARY; | ||
| 300 | break; | ||
| 301 | case Opt_conv_text: | ||
| 302 | *conv = CONV_TEXT; | ||
| 303 | break; | ||
| 304 | case Opt_conv_auto: | ||
| 305 | *conv = CONV_AUTO; | ||
| 306 | break; | ||
| 307 | case Opt_check_none: | 298 | case Opt_check_none: |
| 308 | *chk = 0; | 299 | *chk = 0; |
| 309 | break; | 300 | break; |
| @@ -370,9 +361,6 @@ HPFS filesystem options:\n\ | |||
| 370 | umask=xxx set mode of files that don't have mode specified in eas\n\ | 361 | umask=xxx set mode of files that don't have mode specified in eas\n\ |
| 371 | case=lower lowercase all files\n\ | 362 | case=lower lowercase all files\n\ |
| 372 | case=asis do not lowercase files (default)\n\ | 363 | case=asis do not lowercase files (default)\n\ |
| 373 | conv=binary do not convert CR/LF -> LF (default)\n\ | ||
| 374 | conv=auto convert only files with known text extensions\n\ | ||
| 375 | conv=text convert all files\n\ | ||
| 376 | check=none no fs checks - kernel may crash on corrupted filesystem\n\ | 364 | check=none no fs checks - kernel may crash on corrupted filesystem\n\ |
| 377 | check=normal do some checks - it should not crash (default)\n\ | 365 | check=normal do some checks - it should not crash (default)\n\ |
| 378 | check=strict do extra time-consuming checks, used for debugging\n\ | 366 | check=strict do extra time-consuming checks, used for debugging\n\ |
| @@ -394,7 +382,7 @@ static int hpfs_remount_fs(struct super_block *s, int *flags, char *data) | |||
| 394 | uid_t uid; | 382 | uid_t uid; |
| 395 | gid_t gid; | 383 | gid_t gid; |
| 396 | umode_t umask; | 384 | umode_t umask; |
| 397 | int lowercase, conv, eas, chk, errs, chkdsk, timeshift; | 385 | int lowercase, eas, chk, errs, chkdsk, timeshift; |
| 398 | int o; | 386 | int o; |
| 399 | struct hpfs_sb_info *sbi = hpfs_sb(s); | 387 | struct hpfs_sb_info *sbi = hpfs_sb(s); |
| 400 | char *new_opts = kstrdup(data, GFP_KERNEL); | 388 | char *new_opts = kstrdup(data, GFP_KERNEL); |
| @@ -405,11 +393,11 @@ static int hpfs_remount_fs(struct super_block *s, int *flags, char *data) | |||
| 405 | lock_super(s); | 393 | lock_super(s); |
| 406 | uid = sbi->sb_uid; gid = sbi->sb_gid; | 394 | uid = sbi->sb_uid; gid = sbi->sb_gid; |
| 407 | umask = 0777 & ~sbi->sb_mode; | 395 | umask = 0777 & ~sbi->sb_mode; |
| 408 | lowercase = sbi->sb_lowercase; conv = sbi->sb_conv; | 396 | lowercase = sbi->sb_lowercase; |
| 409 | eas = sbi->sb_eas; chk = sbi->sb_chk; chkdsk = sbi->sb_chkdsk; | 397 | eas = sbi->sb_eas; chk = sbi->sb_chk; chkdsk = sbi->sb_chkdsk; |
| 410 | errs = sbi->sb_err; timeshift = sbi->sb_timeshift; | 398 | errs = sbi->sb_err; timeshift = sbi->sb_timeshift; |
| 411 | 399 | ||
| 412 | if (!(o = parse_opts(data, &uid, &gid, &umask, &lowercase, &conv, | 400 | if (!(o = parse_opts(data, &uid, &gid, &umask, &lowercase, |
| 413 | &eas, &chk, &errs, &chkdsk, ×hift))) { | 401 | &eas, &chk, &errs, &chkdsk, ×hift))) { |
| 414 | printk("HPFS: bad mount options.\n"); | 402 | printk("HPFS: bad mount options.\n"); |
| 415 | goto out_err; | 403 | goto out_err; |
| @@ -427,11 +415,11 @@ static int hpfs_remount_fs(struct super_block *s, int *flags, char *data) | |||
| 427 | 415 | ||
| 428 | sbi->sb_uid = uid; sbi->sb_gid = gid; | 416 | sbi->sb_uid = uid; sbi->sb_gid = gid; |
| 429 | sbi->sb_mode = 0777 & ~umask; | 417 | sbi->sb_mode = 0777 & ~umask; |
| 430 | sbi->sb_lowercase = lowercase; sbi->sb_conv = conv; | 418 | sbi->sb_lowercase = lowercase; |
| 431 | sbi->sb_eas = eas; sbi->sb_chk = chk; sbi->sb_chkdsk = chkdsk; | 419 | sbi->sb_eas = eas; sbi->sb_chk = chk; sbi->sb_chkdsk = chkdsk; |
| 432 | sbi->sb_err = errs; sbi->sb_timeshift = timeshift; | 420 | sbi->sb_err = errs; sbi->sb_timeshift = timeshift; |
| 433 | 421 | ||
| 434 | if (!(*flags & MS_RDONLY)) mark_dirty(s); | 422 | if (!(*flags & MS_RDONLY)) mark_dirty(s, 1); |
| 435 | 423 | ||
| 436 | replace_mount_options(s, new_opts); | 424 | replace_mount_options(s, new_opts); |
| 437 | 425 | ||
| @@ -471,7 +459,7 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent) | |||
| 471 | uid_t uid; | 459 | uid_t uid; |
| 472 | gid_t gid; | 460 | gid_t gid; |
| 473 | umode_t umask; | 461 | umode_t umask; |
| 474 | int lowercase, conv, eas, chk, errs, chkdsk, timeshift; | 462 | int lowercase, eas, chk, errs, chkdsk, timeshift; |
| 475 | 463 | ||
| 476 | dnode_secno root_dno; | 464 | dnode_secno root_dno; |
| 477 | struct hpfs_dirent *de = NULL; | 465 | struct hpfs_dirent *de = NULL; |
| @@ -479,11 +467,6 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent) | |||
| 479 | 467 | ||
| 480 | int o; | 468 | int o; |
| 481 | 469 | ||
| 482 | if (num_possible_cpus() > 1) { | ||
| 483 | printk(KERN_ERR "HPFS is not SMP safe\n"); | ||
| 484 | return -EINVAL; | ||
| 485 | } | ||
| 486 | |||
| 487 | save_mount_options(s, options); | 470 | save_mount_options(s, options); |
| 488 | 471 | ||
| 489 | sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); | 472 | sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); |
| @@ -495,20 +478,20 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent) | |||
| 495 | sbi->sb_bmp_dir = NULL; | 478 | sbi->sb_bmp_dir = NULL; |
| 496 | sbi->sb_cp_table = NULL; | 479 | sbi->sb_cp_table = NULL; |
| 497 | 480 | ||
| 498 | mutex_init(&sbi->hpfs_creation_de); | 481 | mutex_init(&sbi->hpfs_mutex); |
| 482 | hpfs_lock(s); | ||
| 499 | 483 | ||
| 500 | uid = current_uid(); | 484 | uid = current_uid(); |
| 501 | gid = current_gid(); | 485 | gid = current_gid(); |
| 502 | umask = current_umask(); | 486 | umask = current_umask(); |
| 503 | lowercase = 0; | 487 | lowercase = 0; |
| 504 | conv = CONV_BINARY; | ||
| 505 | eas = 2; | 488 | eas = 2; |
| 506 | chk = 1; | 489 | chk = 1; |
| 507 | errs = 1; | 490 | errs = 1; |
| 508 | chkdsk = 1; | 491 | chkdsk = 1; |
| 509 | timeshift = 0; | 492 | timeshift = 0; |
| 510 | 493 | ||
| 511 | if (!(o = parse_opts(options, &uid, &gid, &umask, &lowercase, &conv, | 494 | if (!(o = parse_opts(options, &uid, &gid, &umask, &lowercase, |
| 512 | &eas, &chk, &errs, &chkdsk, ×hift))) { | 495 | &eas, &chk, &errs, &chkdsk, ×hift))) { |
| 513 | printk("HPFS: bad mount options.\n"); | 496 | printk("HPFS: bad mount options.\n"); |
| 514 | goto bail0; | 497 | goto bail0; |
| @@ -526,9 +509,9 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent) | |||
| 526 | if (!(spareblock = hpfs_map_sector(s, 17, &bh2, 0))) goto bail3; | 509 | if (!(spareblock = hpfs_map_sector(s, 17, &bh2, 0))) goto bail3; |
| 527 | 510 | ||
| 528 | /* Check magics */ | 511 | /* Check magics */ |
| 529 | if (/*bootblock->magic != BB_MAGIC | 512 | if (/*le16_to_cpu(bootblock->magic) != BB_MAGIC |
| 530 | ||*/ superblock->magic != SB_MAGIC | 513 | ||*/ le32_to_cpu(superblock->magic) != SB_MAGIC |
| 531 | || spareblock->magic != SP_MAGIC) { | 514 | || le32_to_cpu(spareblock->magic) != SP_MAGIC) { |
| 532 | if (!silent) printk("HPFS: Bad magic ... probably not HPFS\n"); | 515 | if (!silent) printk("HPFS: Bad magic ... probably not HPFS\n"); |
| 533 | goto bail4; | 516 | goto bail4; |
| 534 | } | 517 | } |
| @@ -549,19 +532,18 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent) | |||
| 549 | s->s_op = &hpfs_sops; | 532 | s->s_op = &hpfs_sops; |
| 550 | s->s_d_op = &hpfs_dentry_operations; | 533 | s->s_d_op = &hpfs_dentry_operations; |
| 551 | 534 | ||
| 552 | sbi->sb_root = superblock->root; | 535 | sbi->sb_root = le32_to_cpu(superblock->root); |
| 553 | sbi->sb_fs_size = superblock->n_sectors; | 536 | sbi->sb_fs_size = le32_to_cpu(superblock->n_sectors); |
| 554 | sbi->sb_bitmaps = superblock->bitmaps; | 537 | sbi->sb_bitmaps = le32_to_cpu(superblock->bitmaps); |
| 555 | sbi->sb_dirband_start = superblock->dir_band_start; | 538 | sbi->sb_dirband_start = le32_to_cpu(superblock->dir_band_start); |
| 556 | sbi->sb_dirband_size = superblock->n_dir_band; | 539 | sbi->sb_dirband_size = le32_to_cpu(superblock->n_dir_band); |
| 557 | sbi->sb_dmap = superblock->dir_band_bitmap; | 540 | sbi->sb_dmap = le32_to_cpu(superblock->dir_band_bitmap); |
| 558 | sbi->sb_uid = uid; | 541 | sbi->sb_uid = uid; |
| 559 | sbi->sb_gid = gid; | 542 | sbi->sb_gid = gid; |
| 560 | sbi->sb_mode = 0777 & ~umask; | 543 | sbi->sb_mode = 0777 & ~umask; |
| 561 | sbi->sb_n_free = -1; | 544 | sbi->sb_n_free = -1; |
| 562 | sbi->sb_n_free_dnodes = -1; | 545 | sbi->sb_n_free_dnodes = -1; |
| 563 | sbi->sb_lowercase = lowercase; | 546 | sbi->sb_lowercase = lowercase; |
| 564 | sbi->sb_conv = conv; | ||
| 565 | sbi->sb_eas = eas; | 547 | sbi->sb_eas = eas; |
| 566 | sbi->sb_chk = chk; | 548 | sbi->sb_chk = chk; |
| 567 | sbi->sb_chkdsk = chkdsk; | 549 | sbi->sb_chkdsk = chkdsk; |
| @@ -573,7 +555,7 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent) | |||
| 573 | sbi->sb_max_fwd_alloc = 0xffffff; | 555 | sbi->sb_max_fwd_alloc = 0xffffff; |
| 574 | 556 | ||
| 575 | /* Load bitmap directory */ | 557 | /* Load bitmap directory */ |
| 576 | if (!(sbi->sb_bmp_dir = hpfs_load_bitmap_directory(s, superblock->bitmaps))) | 558 | if (!(sbi->sb_bmp_dir = hpfs_load_bitmap_directory(s, le32_to_cpu(superblock->bitmaps)))) |
| 577 | goto bail4; | 559 | goto bail4; |
| 578 | 560 | ||
| 579 | /* Check for general fs errors*/ | 561 | /* Check for general fs errors*/ |
| @@ -591,20 +573,20 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent) | |||
| 591 | mark_buffer_dirty(bh2); | 573 | mark_buffer_dirty(bh2); |
| 592 | } | 574 | } |
| 593 | 575 | ||
| 594 | if (spareblock->hotfixes_used || spareblock->n_spares_used) { | 576 | if (le32_to_cpu(spareblock->hotfixes_used) || le32_to_cpu(spareblock->n_spares_used)) { |
| 595 | if (errs >= 2) { | 577 | if (errs >= 2) { |
| 596 | printk("HPFS: Hotfixes not supported here, try chkdsk\n"); | 578 | printk("HPFS: Hotfixes not supported here, try chkdsk\n"); |
| 597 | mark_dirty(s); | 579 | mark_dirty(s, 0); |
| 598 | goto bail4; | 580 | goto bail4; |
| 599 | } | 581 | } |
| 600 | hpfs_error(s, "hotfixes not supported here, try chkdsk"); | 582 | hpfs_error(s, "hotfixes not supported here, try chkdsk"); |
| 601 | if (errs == 0) printk("HPFS: Proceeding, but your filesystem will be probably corrupted by this driver...\n"); | 583 | if (errs == 0) printk("HPFS: Proceeding, but your filesystem will be probably corrupted by this driver...\n"); |
| 602 | else printk("HPFS: This driver may read bad files or crash when operating on disk with hotfixes.\n"); | 584 | else printk("HPFS: This driver may read bad files or crash when operating on disk with hotfixes.\n"); |
| 603 | } | 585 | } |
| 604 | if (spareblock->n_dnode_spares != spareblock->n_dnode_spares_free) { | 586 | if (le32_to_cpu(spareblock->n_dnode_spares) != le32_to_cpu(spareblock->n_dnode_spares_free)) { |
| 605 | if (errs >= 2) { | 587 | if (errs >= 2) { |
| 606 | printk("HPFS: Spare dnodes used, try chkdsk\n"); | 588 | printk("HPFS: Spare dnodes used, try chkdsk\n"); |
| 607 | mark_dirty(s); | 589 | mark_dirty(s, 0); |
| 608 | goto bail4; | 590 | goto bail4; |
| 609 | } | 591 | } |
| 610 | hpfs_error(s, "warning: spare dnodes used, try chkdsk"); | 592 | hpfs_error(s, "warning: spare dnodes used, try chkdsk"); |
| @@ -612,26 +594,26 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent) | |||
| 612 | } | 594 | } |
| 613 | if (chk) { | 595 | if (chk) { |
| 614 | unsigned a; | 596 | unsigned a; |
| 615 | if (superblock->dir_band_end - superblock->dir_band_start + 1 != superblock->n_dir_band || | 597 | if (le32_to_cpu(superblock->dir_band_end) - le32_to_cpu(superblock->dir_band_start) + 1 != le32_to_cpu(superblock->n_dir_band) || |
| 616 | superblock->dir_band_end < superblock->dir_band_start || superblock->n_dir_band > 0x4000) { | 598 | le32_to_cpu(superblock->dir_band_end) < le32_to_cpu(superblock->dir_band_start) || le32_to_cpu(superblock->n_dir_band) > 0x4000) { |
| 617 | hpfs_error(s, "dir band size mismatch: dir_band_start==%08x, dir_band_end==%08x, n_dir_band==%08x", | 599 | hpfs_error(s, "dir band size mismatch: dir_band_start==%08x, dir_band_end==%08x, n_dir_band==%08x", |
| 618 | superblock->dir_band_start, superblock->dir_band_end, superblock->n_dir_band); | 600 | le32_to_cpu(superblock->dir_band_start), le32_to_cpu(superblock->dir_band_end), le32_to_cpu(superblock->n_dir_band)); |
| 619 | goto bail4; | 601 | goto bail4; |
| 620 | } | 602 | } |
| 621 | a = sbi->sb_dirband_size; | 603 | a = sbi->sb_dirband_size; |
| 622 | sbi->sb_dirband_size = 0; | 604 | sbi->sb_dirband_size = 0; |
| 623 | if (hpfs_chk_sectors(s, superblock->dir_band_start, superblock->n_dir_band, "dir_band") || | 605 | if (hpfs_chk_sectors(s, le32_to_cpu(superblock->dir_band_start), le32_to_cpu(superblock->n_dir_band), "dir_band") || |
| 624 | hpfs_chk_sectors(s, superblock->dir_band_bitmap, 4, "dir_band_bitmap") || | 606 | hpfs_chk_sectors(s, le32_to_cpu(superblock->dir_band_bitmap), 4, "dir_band_bitmap") || |
| 625 | hpfs_chk_sectors(s, superblock->bitmaps, 4, "bitmaps")) { | 607 | hpfs_chk_sectors(s, le32_to_cpu(superblock->bitmaps), 4, "bitmaps")) { |
| 626 | mark_dirty(s); | 608 | mark_dirty(s, 0); |
| 627 | goto bail4; | 609 | goto bail4; |
| 628 | } | 610 | } |
| 629 | sbi->sb_dirband_size = a; | 611 | sbi->sb_dirband_size = a; |
| 630 | } else printk("HPFS: You really don't want any checks? You are crazy...\n"); | 612 | } else printk("HPFS: You really don't want any checks? You are crazy...\n"); |
| 631 | 613 | ||
| 632 | /* Load code page table */ | 614 | /* Load code page table */ |
| 633 | if (spareblock->n_code_pages) | 615 | if (le32_to_cpu(spareblock->n_code_pages)) |
| 634 | if (!(sbi->sb_cp_table = hpfs_load_code_page(s, spareblock->code_page_dir))) | 616 | if (!(sbi->sb_cp_table = hpfs_load_code_page(s, le32_to_cpu(spareblock->code_page_dir)))) |
| 635 | printk("HPFS: Warning: code page support is disabled\n"); | 617 | printk("HPFS: Warning: code page support is disabled\n"); |
| 636 | 618 | ||
| 637 | brelse(bh2); | 619 | brelse(bh2); |
| @@ -660,13 +642,13 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent) | |||
| 660 | if (!de) | 642 | if (!de) |
| 661 | hpfs_error(s, "unable to find root dir"); | 643 | hpfs_error(s, "unable to find root dir"); |
| 662 | else { | 644 | else { |
| 663 | root->i_atime.tv_sec = local_to_gmt(s, de->read_date); | 645 | root->i_atime.tv_sec = local_to_gmt(s, le32_to_cpu(de->read_date)); |
| 664 | root->i_atime.tv_nsec = 0; | 646 | root->i_atime.tv_nsec = 0; |
| 665 | root->i_mtime.tv_sec = local_to_gmt(s, de->write_date); | 647 | root->i_mtime.tv_sec = local_to_gmt(s, le32_to_cpu(de->write_date)); |
| 666 | root->i_mtime.tv_nsec = 0; | 648 | root->i_mtime.tv_nsec = 0; |
| 667 | root->i_ctime.tv_sec = local_to_gmt(s, de->creation_date); | 649 | root->i_ctime.tv_sec = local_to_gmt(s, le32_to_cpu(de->creation_date)); |
| 668 | root->i_ctime.tv_nsec = 0; | 650 | root->i_ctime.tv_nsec = 0; |
| 669 | hpfs_i(root)->i_ea_size = de->ea_size; | 651 | hpfs_i(root)->i_ea_size = le16_to_cpu(de->ea_size); |
| 670 | hpfs_i(root)->i_parent_dir = root->i_ino; | 652 | hpfs_i(root)->i_parent_dir = root->i_ino; |
| 671 | if (root->i_size == -1) | 653 | if (root->i_size == -1) |
| 672 | root->i_size = 2048; | 654 | root->i_size = 2048; |
| @@ -674,6 +656,7 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent) | |||
| 674 | root->i_blocks = 5; | 656 | root->i_blocks = 5; |
| 675 | hpfs_brelse4(&qbh); | 657 | hpfs_brelse4(&qbh); |
| 676 | } | 658 | } |
| 659 | hpfs_unlock(s); | ||
| 677 | return 0; | 660 | return 0; |
| 678 | 661 | ||
| 679 | bail4: brelse(bh2); | 662 | bail4: brelse(bh2); |
| @@ -681,6 +664,7 @@ bail3: brelse(bh1); | |||
| 681 | bail2: brelse(bh0); | 664 | bail2: brelse(bh0); |
| 682 | bail1: | 665 | bail1: |
| 683 | bail0: | 666 | bail0: |
| 667 | hpfs_unlock(s); | ||
| 684 | kfree(sbi->sb_bmp_dir); | 668 | kfree(sbi->sb_bmp_dir); |
| 685 | kfree(sbi->sb_cp_table); | 669 | kfree(sbi->sb_cp_table); |
| 686 | s->s_fs_info = NULL; | 670 | s->s_fs_info = NULL; |
