diff options
-rw-r--r-- | fs/ufs/balloc.c | 22 | ||||
-rw-r--r-- | fs/ufs/inode.c | 27 | ||||
-rw-r--r-- | fs/ufs/super.c | 9 | ||||
-rw-r--r-- | fs/ufs/ufs_fs.h | 2 |
4 files changed, 28 insertions, 32 deletions
diff --git a/fs/ufs/balloc.c b/fs/ufs/balloc.c index 0315fea1d589..f80be4c5df9d 100644 --- a/fs/ufs/balloc.c +++ b/fs/ufs/balloc.c | |||
@@ -455,24 +455,14 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment, | |||
455 | /* | 455 | /* |
456 | * allocate new block and move data | 456 | * allocate new block and move data |
457 | */ | 457 | */ |
458 | switch (fs32_to_cpu(sb, usb1->fs_optim)) { | 458 | if (fs32_to_cpu(sb, usb1->fs_optim) == UFS_OPTSPACE) { |
459 | case UFS_OPTSPACE: | ||
460 | request = newcount; | 459 | request = newcount; |
461 | if (uspi->s_minfree < 5 || uspi->cs_total.cs_nffree | 460 | if (uspi->cs_total.cs_nffree < uspi->s_space_to_time) |
462 | > uspi->s_dsize * uspi->s_minfree / (2 * 100)) | 461 | usb1->fs_optim = cpu_to_fs32(sb, UFS_OPTTIME); |
463 | break; | 462 | } else { |
464 | usb1->fs_optim = cpu_to_fs32(sb, UFS_OPTTIME); | ||
465 | break; | ||
466 | default: | ||
467 | usb1->fs_optim = cpu_to_fs32(sb, UFS_OPTTIME); | ||
468 | |||
469 | case UFS_OPTTIME: | ||
470 | request = uspi->s_fpb; | 463 | request = uspi->s_fpb; |
471 | if (uspi->cs_total.cs_nffree < uspi->s_dsize * | 464 | if (uspi->cs_total.cs_nffree > uspi->s_time_to_space) |
472 | (uspi->s_minfree - 2) / 100) | 465 | usb1->fs_optim = cpu_to_fs32(sb, UFS_OPTSPACE); |
473 | break; | ||
474 | usb1->fs_optim = cpu_to_fs32(sb, UFS_OPTTIME); | ||
475 | break; | ||
476 | } | 466 | } |
477 | result = ufs_alloc_fragments (inode, cgno, goal, request, err); | 467 | result = ufs_alloc_fragments (inode, cgno, goal, request, err); |
478 | if (result) { | 468 | if (result) { |
diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c index 9f4590261134..f36d6a53687d 100644 --- a/fs/ufs/inode.c +++ b/fs/ufs/inode.c | |||
@@ -566,10 +566,8 @@ static int ufs1_read_inode(struct inode *inode, struct ufs_inode *ufs_inode) | |||
566 | */ | 566 | */ |
567 | inode->i_mode = mode = fs16_to_cpu(sb, ufs_inode->ui_mode); | 567 | inode->i_mode = mode = fs16_to_cpu(sb, ufs_inode->ui_mode); |
568 | set_nlink(inode, fs16_to_cpu(sb, ufs_inode->ui_nlink)); | 568 | set_nlink(inode, fs16_to_cpu(sb, ufs_inode->ui_nlink)); |
569 | if (inode->i_nlink == 0) { | 569 | if (inode->i_nlink == 0) |
570 | ufs_error (sb, "ufs_read_inode", "inode %lu has zero nlink\n", inode->i_ino); | 570 | return -ESTALE; |
571 | return -1; | ||
572 | } | ||
573 | 571 | ||
574 | /* | 572 | /* |
575 | * Linux now has 32-bit uid and gid, so we can support EFT. | 573 | * Linux now has 32-bit uid and gid, so we can support EFT. |
@@ -578,9 +576,9 @@ static int ufs1_read_inode(struct inode *inode, struct ufs_inode *ufs_inode) | |||
578 | i_gid_write(inode, ufs_get_inode_gid(sb, ufs_inode)); | 576 | i_gid_write(inode, ufs_get_inode_gid(sb, ufs_inode)); |
579 | 577 | ||
580 | inode->i_size = fs64_to_cpu(sb, ufs_inode->ui_size); | 578 | inode->i_size = fs64_to_cpu(sb, ufs_inode->ui_size); |
581 | inode->i_atime.tv_sec = fs32_to_cpu(sb, ufs_inode->ui_atime.tv_sec); | 579 | inode->i_atime.tv_sec = (signed)fs32_to_cpu(sb, ufs_inode->ui_atime.tv_sec); |
582 | inode->i_ctime.tv_sec = fs32_to_cpu(sb, ufs_inode->ui_ctime.tv_sec); | 580 | inode->i_ctime.tv_sec = (signed)fs32_to_cpu(sb, ufs_inode->ui_ctime.tv_sec); |
583 | inode->i_mtime.tv_sec = fs32_to_cpu(sb, ufs_inode->ui_mtime.tv_sec); | 581 | inode->i_mtime.tv_sec = (signed)fs32_to_cpu(sb, ufs_inode->ui_mtime.tv_sec); |
584 | inode->i_mtime.tv_nsec = 0; | 582 | inode->i_mtime.tv_nsec = 0; |
585 | inode->i_atime.tv_nsec = 0; | 583 | inode->i_atime.tv_nsec = 0; |
586 | inode->i_ctime.tv_nsec = 0; | 584 | inode->i_ctime.tv_nsec = 0; |
@@ -614,10 +612,8 @@ static int ufs2_read_inode(struct inode *inode, struct ufs2_inode *ufs2_inode) | |||
614 | */ | 612 | */ |
615 | inode->i_mode = mode = fs16_to_cpu(sb, ufs2_inode->ui_mode); | 613 | inode->i_mode = mode = fs16_to_cpu(sb, ufs2_inode->ui_mode); |
616 | set_nlink(inode, fs16_to_cpu(sb, ufs2_inode->ui_nlink)); | 614 | set_nlink(inode, fs16_to_cpu(sb, ufs2_inode->ui_nlink)); |
617 | if (inode->i_nlink == 0) { | 615 | if (inode->i_nlink == 0) |
618 | ufs_error (sb, "ufs_read_inode", "inode %lu has zero nlink\n", inode->i_ino); | 616 | return -ESTALE; |
619 | return -1; | ||
620 | } | ||
621 | 617 | ||
622 | /* | 618 | /* |
623 | * Linux now has 32-bit uid and gid, so we can support EFT. | 619 | * Linux now has 32-bit uid and gid, so we can support EFT. |
@@ -657,7 +653,7 @@ struct inode *ufs_iget(struct super_block *sb, unsigned long ino) | |||
657 | struct ufs_sb_private_info *uspi = UFS_SB(sb)->s_uspi; | 653 | struct ufs_sb_private_info *uspi = UFS_SB(sb)->s_uspi; |
658 | struct buffer_head * bh; | 654 | struct buffer_head * bh; |
659 | struct inode *inode; | 655 | struct inode *inode; |
660 | int err; | 656 | int err = -EIO; |
661 | 657 | ||
662 | UFSD("ENTER, ino %lu\n", ino); | 658 | UFSD("ENTER, ino %lu\n", ino); |
663 | 659 | ||
@@ -692,9 +688,10 @@ struct inode *ufs_iget(struct super_block *sb, unsigned long ino) | |||
692 | err = ufs1_read_inode(inode, | 688 | err = ufs1_read_inode(inode, |
693 | ufs_inode + ufs_inotofsbo(inode->i_ino)); | 689 | ufs_inode + ufs_inotofsbo(inode->i_ino)); |
694 | } | 690 | } |
695 | 691 | brelse(bh); | |
696 | if (err) | 692 | if (err) |
697 | goto bad_inode; | 693 | goto bad_inode; |
694 | |||
698 | inode->i_version++; | 695 | inode->i_version++; |
699 | ufsi->i_lastfrag = | 696 | ufsi->i_lastfrag = |
700 | (inode->i_size + uspi->s_fsize - 1) >> uspi->s_fshift; | 697 | (inode->i_size + uspi->s_fsize - 1) >> uspi->s_fshift; |
@@ -703,15 +700,13 @@ struct inode *ufs_iget(struct super_block *sb, unsigned long ino) | |||
703 | 700 | ||
704 | ufs_set_inode_ops(inode); | 701 | ufs_set_inode_ops(inode); |
705 | 702 | ||
706 | brelse(bh); | ||
707 | |||
708 | UFSD("EXIT\n"); | 703 | UFSD("EXIT\n"); |
709 | unlock_new_inode(inode); | 704 | unlock_new_inode(inode); |
710 | return inode; | 705 | return inode; |
711 | 706 | ||
712 | bad_inode: | 707 | bad_inode: |
713 | iget_failed(inode); | 708 | iget_failed(inode); |
714 | return ERR_PTR(-EIO); | 709 | return ERR_PTR(err); |
715 | } | 710 | } |
716 | 711 | ||
717 | static void ufs1_update_inode(struct inode *inode, struct ufs_inode *ufs_inode) | 712 | static void ufs1_update_inode(struct inode *inode, struct ufs_inode *ufs_inode) |
diff --git a/fs/ufs/super.c b/fs/ufs/super.c index d5300adbfd79..0a4f58a5073c 100644 --- a/fs/ufs/super.c +++ b/fs/ufs/super.c | |||
@@ -1210,6 +1210,15 @@ magic_found: | |||
1210 | 1210 | ||
1211 | uspi->s_root_blocks = mul_u64_u32_div(uspi->s_dsize, | 1211 | uspi->s_root_blocks = mul_u64_u32_div(uspi->s_dsize, |
1212 | uspi->s_minfree, 100); | 1212 | uspi->s_minfree, 100); |
1213 | if (uspi->s_minfree <= 5) { | ||
1214 | uspi->s_time_to_space = ~0ULL; | ||
1215 | uspi->s_space_to_time = 0; | ||
1216 | usb1->fs_optim = cpu_to_fs32(sb, UFS_OPTSPACE); | ||
1217 | } else { | ||
1218 | uspi->s_time_to_space = (uspi->s_root_blocks / 2) + 1; | ||
1219 | uspi->s_space_to_time = mul_u64_u32_div(uspi->s_dsize, | ||
1220 | uspi->s_minfree - 2, 100) - 1; | ||
1221 | } | ||
1213 | 1222 | ||
1214 | /* | 1223 | /* |
1215 | * Compute another frequently used values | 1224 | * Compute another frequently used values |
diff --git a/fs/ufs/ufs_fs.h b/fs/ufs/ufs_fs.h index 823d55a37586..150eef6f1233 100644 --- a/fs/ufs/ufs_fs.h +++ b/fs/ufs/ufs_fs.h | |||
@@ -792,6 +792,8 @@ struct ufs_sb_private_info { | |||
792 | __s32 fs_magic; /* filesystem magic */ | 792 | __s32 fs_magic; /* filesystem magic */ |
793 | unsigned int s_dirblksize; | 793 | unsigned int s_dirblksize; |
794 | __u64 s_root_blocks; | 794 | __u64 s_root_blocks; |
795 | __u64 s_time_to_space; | ||
796 | __u64 s_space_to_time; | ||
795 | }; | 797 | }; |
796 | 798 | ||
797 | /* | 799 | /* |