aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/ufs/balloc.c22
-rw-r--r--fs/ufs/inode.c27
-rw-r--r--fs/ufs/super.c9
-rw-r--r--fs/ufs/ufs_fs.h2
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
712bad_inode: 707bad_inode:
713 iget_failed(inode); 708 iget_failed(inode);
714 return ERR_PTR(-EIO); 709 return ERR_PTR(err);
715} 710}
716 711
717static void ufs1_update_inode(struct inode *inode, struct ufs_inode *ufs_inode) 712static 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/*