diff options
Diffstat (limited to 'fs/ntfs/super.c')
-rw-r--r-- | fs/ntfs/super.c | 60 |
1 files changed, 25 insertions, 35 deletions
diff --git a/fs/ntfs/super.c b/fs/ntfs/super.c index f76951dcd4a6..abaaa1cbf8de 100644 --- a/fs/ntfs/super.c +++ b/fs/ntfs/super.c | |||
@@ -25,7 +25,7 @@ | |||
25 | #include <linux/slab.h> | 25 | #include <linux/slab.h> |
26 | #include <linux/string.h> | 26 | #include <linux/string.h> |
27 | #include <linux/spinlock.h> | 27 | #include <linux/spinlock.h> |
28 | #include <linux/blkdev.h> /* For bdev_hardsect_size(). */ | 28 | #include <linux/blkdev.h> /* For bdev_logical_block_size(). */ |
29 | #include <linux/backing-dev.h> | 29 | #include <linux/backing-dev.h> |
30 | #include <linux/buffer_head.h> | 30 | #include <linux/buffer_head.h> |
31 | #include <linux/vfs.h> | 31 | #include <linux/vfs.h> |
@@ -443,6 +443,8 @@ static int ntfs_remount(struct super_block *sb, int *flags, char *opt) | |||
443 | ntfs_volume *vol = NTFS_SB(sb); | 443 | ntfs_volume *vol = NTFS_SB(sb); |
444 | 444 | ||
445 | ntfs_debug("Entering with remount options string: %s", opt); | 445 | ntfs_debug("Entering with remount options string: %s", opt); |
446 | |||
447 | lock_kernel(); | ||
446 | #ifndef NTFS_RW | 448 | #ifndef NTFS_RW |
447 | /* For read-only compiled driver, enforce read-only flag. */ | 449 | /* For read-only compiled driver, enforce read-only flag. */ |
448 | *flags |= MS_RDONLY; | 450 | *flags |= MS_RDONLY; |
@@ -466,15 +468,18 @@ static int ntfs_remount(struct super_block *sb, int *flags, char *opt) | |||
466 | if (NVolErrors(vol)) { | 468 | if (NVolErrors(vol)) { |
467 | ntfs_error(sb, "Volume has errors and is read-only%s", | 469 | ntfs_error(sb, "Volume has errors and is read-only%s", |
468 | es); | 470 | es); |
471 | unlock_kernel(); | ||
469 | return -EROFS; | 472 | return -EROFS; |
470 | } | 473 | } |
471 | if (vol->vol_flags & VOLUME_IS_DIRTY) { | 474 | if (vol->vol_flags & VOLUME_IS_DIRTY) { |
472 | ntfs_error(sb, "Volume is dirty and read-only%s", es); | 475 | ntfs_error(sb, "Volume is dirty and read-only%s", es); |
476 | unlock_kernel(); | ||
473 | return -EROFS; | 477 | return -EROFS; |
474 | } | 478 | } |
475 | if (vol->vol_flags & VOLUME_MODIFIED_BY_CHKDSK) { | 479 | if (vol->vol_flags & VOLUME_MODIFIED_BY_CHKDSK) { |
476 | ntfs_error(sb, "Volume has been modified by chkdsk " | 480 | ntfs_error(sb, "Volume has been modified by chkdsk " |
477 | "and is read-only%s", es); | 481 | "and is read-only%s", es); |
482 | unlock_kernel(); | ||
478 | return -EROFS; | 483 | return -EROFS; |
479 | } | 484 | } |
480 | if (vol->vol_flags & VOLUME_MUST_MOUNT_RO_MASK) { | 485 | if (vol->vol_flags & VOLUME_MUST_MOUNT_RO_MASK) { |
@@ -482,11 +487,13 @@ static int ntfs_remount(struct super_block *sb, int *flags, char *opt) | |||
482 | "(0x%x) and is read-only%s", | 487 | "(0x%x) and is read-only%s", |
483 | (unsigned)le16_to_cpu(vol->vol_flags), | 488 | (unsigned)le16_to_cpu(vol->vol_flags), |
484 | es); | 489 | es); |
490 | unlock_kernel(); | ||
485 | return -EROFS; | 491 | return -EROFS; |
486 | } | 492 | } |
487 | if (ntfs_set_volume_flags(vol, VOLUME_IS_DIRTY)) { | 493 | if (ntfs_set_volume_flags(vol, VOLUME_IS_DIRTY)) { |
488 | ntfs_error(sb, "Failed to set dirty bit in volume " | 494 | ntfs_error(sb, "Failed to set dirty bit in volume " |
489 | "information flags%s", es); | 495 | "information flags%s", es); |
496 | unlock_kernel(); | ||
490 | return -EROFS; | 497 | return -EROFS; |
491 | } | 498 | } |
492 | #if 0 | 499 | #if 0 |
@@ -506,18 +513,21 @@ static int ntfs_remount(struct super_block *sb, int *flags, char *opt) | |||
506 | ntfs_error(sb, "Failed to empty journal $LogFile%s", | 513 | ntfs_error(sb, "Failed to empty journal $LogFile%s", |
507 | es); | 514 | es); |
508 | NVolSetErrors(vol); | 515 | NVolSetErrors(vol); |
516 | unlock_kernel(); | ||
509 | return -EROFS; | 517 | return -EROFS; |
510 | } | 518 | } |
511 | if (!ntfs_mark_quotas_out_of_date(vol)) { | 519 | if (!ntfs_mark_quotas_out_of_date(vol)) { |
512 | ntfs_error(sb, "Failed to mark quotas out of date%s", | 520 | ntfs_error(sb, "Failed to mark quotas out of date%s", |
513 | es); | 521 | es); |
514 | NVolSetErrors(vol); | 522 | NVolSetErrors(vol); |
523 | unlock_kernel(); | ||
515 | return -EROFS; | 524 | return -EROFS; |
516 | } | 525 | } |
517 | if (!ntfs_stamp_usnjrnl(vol)) { | 526 | if (!ntfs_stamp_usnjrnl(vol)) { |
518 | ntfs_error(sb, "Failed to stamp transation log " | 527 | ntfs_error(sb, "Failed to stamp transation log " |
519 | "($UsnJrnl)%s", es); | 528 | "($UsnJrnl)%s", es); |
520 | NVolSetErrors(vol); | 529 | NVolSetErrors(vol); |
530 | unlock_kernel(); | ||
521 | return -EROFS; | 531 | return -EROFS; |
522 | } | 532 | } |
523 | } else if (!(sb->s_flags & MS_RDONLY) && (*flags & MS_RDONLY)) { | 533 | } else if (!(sb->s_flags & MS_RDONLY) && (*flags & MS_RDONLY)) { |
@@ -533,8 +543,11 @@ static int ntfs_remount(struct super_block *sb, int *flags, char *opt) | |||
533 | 543 | ||
534 | // TODO: Deal with *flags. | 544 | // TODO: Deal with *flags. |
535 | 545 | ||
536 | if (!parse_options(vol, opt)) | 546 | if (!parse_options(vol, opt)) { |
547 | unlock_kernel(); | ||
537 | return -EINVAL; | 548 | return -EINVAL; |
549 | } | ||
550 | unlock_kernel(); | ||
538 | ntfs_debug("Done."); | 551 | ntfs_debug("Done."); |
539 | return 0; | 552 | return 0; |
540 | } | 553 | } |
@@ -2246,6 +2259,9 @@ static void ntfs_put_super(struct super_block *sb) | |||
2246 | ntfs_volume *vol = NTFS_SB(sb); | 2259 | ntfs_volume *vol = NTFS_SB(sb); |
2247 | 2260 | ||
2248 | ntfs_debug("Entering."); | 2261 | ntfs_debug("Entering."); |
2262 | |||
2263 | lock_kernel(); | ||
2264 | |||
2249 | #ifdef NTFS_RW | 2265 | #ifdef NTFS_RW |
2250 | /* | 2266 | /* |
2251 | * Commit all inodes while they are still open in case some of them | 2267 | * Commit all inodes while they are still open in case some of them |
@@ -2373,39 +2389,12 @@ static void ntfs_put_super(struct super_block *sb) | |||
2373 | vol->mftmirr_ino = NULL; | 2389 | vol->mftmirr_ino = NULL; |
2374 | } | 2390 | } |
2375 | /* | 2391 | /* |
2376 | * If any dirty inodes are left, throw away all mft data page cache | 2392 | * We should have no dirty inodes left, due to |
2377 | * pages to allow a clean umount. This should never happen any more | 2393 | * mft.c::ntfs_mft_writepage() cleaning all the dirty pages as |
2378 | * due to mft.c::ntfs_mft_writepage() cleaning all the dirty pages as | 2394 | * the underlying mft records are written out and cleaned. |
2379 | * the underlying mft records are written out and cleaned. If it does, | ||
2380 | * happen anyway, we want to know... | ||
2381 | */ | 2395 | */ |
2382 | ntfs_commit_inode(vol->mft_ino); | 2396 | ntfs_commit_inode(vol->mft_ino); |
2383 | write_inode_now(vol->mft_ino, 1); | 2397 | write_inode_now(vol->mft_ino, 1); |
2384 | if (sb_has_dirty_inodes(sb)) { | ||
2385 | const char *s1, *s2; | ||
2386 | |||
2387 | mutex_lock(&vol->mft_ino->i_mutex); | ||
2388 | truncate_inode_pages(vol->mft_ino->i_mapping, 0); | ||
2389 | mutex_unlock(&vol->mft_ino->i_mutex); | ||
2390 | write_inode_now(vol->mft_ino, 1); | ||
2391 | if (sb_has_dirty_inodes(sb)) { | ||
2392 | static const char *_s1 = "inodes"; | ||
2393 | static const char *_s2 = ""; | ||
2394 | s1 = _s1; | ||
2395 | s2 = _s2; | ||
2396 | } else { | ||
2397 | static const char *_s1 = "mft pages"; | ||
2398 | static const char *_s2 = "They have been thrown " | ||
2399 | "away. "; | ||
2400 | s1 = _s1; | ||
2401 | s2 = _s2; | ||
2402 | } | ||
2403 | ntfs_error(sb, "Dirty %s found at umount time. %sYou should " | ||
2404 | "run chkdsk. Please email " | ||
2405 | "linux-ntfs-dev@lists.sourceforge.net and say " | ||
2406 | "that you saw this message. Thank you.", s1, | ||
2407 | s2); | ||
2408 | } | ||
2409 | #endif /* NTFS_RW */ | 2398 | #endif /* NTFS_RW */ |
2410 | 2399 | ||
2411 | iput(vol->mft_ino); | 2400 | iput(vol->mft_ino); |
@@ -2444,7 +2433,8 @@ static void ntfs_put_super(struct super_block *sb) | |||
2444 | } | 2433 | } |
2445 | sb->s_fs_info = NULL; | 2434 | sb->s_fs_info = NULL; |
2446 | kfree(vol); | 2435 | kfree(vol); |
2447 | return; | 2436 | |
2437 | unlock_kernel(); | ||
2448 | } | 2438 | } |
2449 | 2439 | ||
2450 | /** | 2440 | /** |
@@ -2785,13 +2775,13 @@ static int ntfs_fill_super(struct super_block *sb, void *opt, const int silent) | |||
2785 | goto err_out_now; | 2775 | goto err_out_now; |
2786 | 2776 | ||
2787 | /* We support sector sizes up to the PAGE_CACHE_SIZE. */ | 2777 | /* We support sector sizes up to the PAGE_CACHE_SIZE. */ |
2788 | if (bdev_hardsect_size(sb->s_bdev) > PAGE_CACHE_SIZE) { | 2778 | if (bdev_logical_block_size(sb->s_bdev) > PAGE_CACHE_SIZE) { |
2789 | if (!silent) | 2779 | if (!silent) |
2790 | ntfs_error(sb, "Device has unsupported sector size " | 2780 | ntfs_error(sb, "Device has unsupported sector size " |
2791 | "(%i). The maximum supported sector " | 2781 | "(%i). The maximum supported sector " |
2792 | "size on this architecture is %lu " | 2782 | "size on this architecture is %lu " |
2793 | "bytes.", | 2783 | "bytes.", |
2794 | bdev_hardsect_size(sb->s_bdev), | 2784 | bdev_logical_block_size(sb->s_bdev), |
2795 | PAGE_CACHE_SIZE); | 2785 | PAGE_CACHE_SIZE); |
2796 | goto err_out_now; | 2786 | goto err_out_now; |
2797 | } | 2787 | } |