diff options
-rw-r--r-- | fs/ufs/balloc.c | 22 | ||||
-rw-r--r-- | fs/ufs/inode.c | 47 | ||||
-rw-r--r-- | fs/ufs/super.c | 64 | ||||
-rw-r--r-- | fs/ufs/ufs_fs.h | 7 | ||||
-rw-r--r-- | fs/ufs/util.c | 17 | ||||
-rw-r--r-- | fs/ufs/util.h | 9 |
6 files changed, 98 insertions, 68 deletions
diff --git a/fs/ufs/balloc.c b/fs/ufs/balloc.c index d642cc0a8271..0315fea1d589 100644 --- a/fs/ufs/balloc.c +++ b/fs/ufs/balloc.c | |||
@@ -400,10 +400,12 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment, | |||
400 | /* | 400 | /* |
401 | * There is not enough space for user on the device | 401 | * There is not enough space for user on the device |
402 | */ | 402 | */ |
403 | if (!capable(CAP_SYS_RESOURCE) && ufs_freespace(uspi, UFS_MINFREE) <= 0) { | 403 | if (unlikely(ufs_freefrags(uspi) <= uspi->s_root_blocks)) { |
404 | mutex_unlock(&UFS_SB(sb)->s_lock); | 404 | if (!capable(CAP_SYS_RESOURCE)) { |
405 | UFSD("EXIT (FAILED)\n"); | 405 | mutex_unlock(&UFS_SB(sb)->s_lock); |
406 | return 0; | 406 | UFSD("EXIT (FAILED)\n"); |
407 | return 0; | ||
408 | } | ||
407 | } | 409 | } |
408 | 410 | ||
409 | if (goal >= uspi->s_size) | 411 | if (goal >= uspi->s_size) |
@@ -421,12 +423,12 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment, | |||
421 | if (result) { | 423 | if (result) { |
422 | ufs_clear_frags(inode, result + oldcount, | 424 | ufs_clear_frags(inode, result + oldcount, |
423 | newcount - oldcount, locked_page != NULL); | 425 | newcount - oldcount, locked_page != NULL); |
426 | *err = 0; | ||
424 | write_seqlock(&UFS_I(inode)->meta_lock); | 427 | write_seqlock(&UFS_I(inode)->meta_lock); |
425 | ufs_cpu_to_data_ptr(sb, p, result); | 428 | ufs_cpu_to_data_ptr(sb, p, result); |
426 | write_sequnlock(&UFS_I(inode)->meta_lock); | ||
427 | *err = 0; | ||
428 | UFS_I(inode)->i_lastfrag = | 429 | UFS_I(inode)->i_lastfrag = |
429 | max(UFS_I(inode)->i_lastfrag, fragment + count); | 430 | max(UFS_I(inode)->i_lastfrag, fragment + count); |
431 | write_sequnlock(&UFS_I(inode)->meta_lock); | ||
430 | } | 432 | } |
431 | mutex_unlock(&UFS_SB(sb)->s_lock); | 433 | mutex_unlock(&UFS_SB(sb)->s_lock); |
432 | UFSD("EXIT, result %llu\n", (unsigned long long)result); | 434 | UFSD("EXIT, result %llu\n", (unsigned long long)result); |
@@ -439,8 +441,10 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment, | |||
439 | result = ufs_add_fragments(inode, tmp, oldcount, newcount); | 441 | result = ufs_add_fragments(inode, tmp, oldcount, newcount); |
440 | if (result) { | 442 | if (result) { |
441 | *err = 0; | 443 | *err = 0; |
444 | read_seqlock_excl(&UFS_I(inode)->meta_lock); | ||
442 | UFS_I(inode)->i_lastfrag = max(UFS_I(inode)->i_lastfrag, | 445 | UFS_I(inode)->i_lastfrag = max(UFS_I(inode)->i_lastfrag, |
443 | fragment + count); | 446 | fragment + count); |
447 | read_sequnlock_excl(&UFS_I(inode)->meta_lock); | ||
444 | ufs_clear_frags(inode, result + oldcount, newcount - oldcount, | 448 | ufs_clear_frags(inode, result + oldcount, newcount - oldcount, |
445 | locked_page != NULL); | 449 | locked_page != NULL); |
446 | mutex_unlock(&UFS_SB(sb)->s_lock); | 450 | mutex_unlock(&UFS_SB(sb)->s_lock); |
@@ -474,16 +478,16 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment, | |||
474 | if (result) { | 478 | if (result) { |
475 | ufs_clear_frags(inode, result + oldcount, newcount - oldcount, | 479 | ufs_clear_frags(inode, result + oldcount, newcount - oldcount, |
476 | locked_page != NULL); | 480 | locked_page != NULL); |
481 | mutex_unlock(&UFS_SB(sb)->s_lock); | ||
477 | ufs_change_blocknr(inode, fragment - oldcount, oldcount, | 482 | ufs_change_blocknr(inode, fragment - oldcount, oldcount, |
478 | uspi->s_sbbase + tmp, | 483 | uspi->s_sbbase + tmp, |
479 | uspi->s_sbbase + result, locked_page); | 484 | uspi->s_sbbase + result, locked_page); |
485 | *err = 0; | ||
480 | write_seqlock(&UFS_I(inode)->meta_lock); | 486 | write_seqlock(&UFS_I(inode)->meta_lock); |
481 | ufs_cpu_to_data_ptr(sb, p, result); | 487 | ufs_cpu_to_data_ptr(sb, p, result); |
482 | write_sequnlock(&UFS_I(inode)->meta_lock); | ||
483 | *err = 0; | ||
484 | UFS_I(inode)->i_lastfrag = max(UFS_I(inode)->i_lastfrag, | 488 | UFS_I(inode)->i_lastfrag = max(UFS_I(inode)->i_lastfrag, |
485 | fragment + count); | 489 | fragment + count); |
486 | mutex_unlock(&UFS_SB(sb)->s_lock); | 490 | write_sequnlock(&UFS_I(inode)->meta_lock); |
487 | if (newcount < request) | 491 | if (newcount < request) |
488 | ufs_free_fragments (inode, result + newcount, request - newcount); | 492 | ufs_free_fragments (inode, result + newcount, request - newcount); |
489 | ufs_free_fragments (inode, tmp, oldcount); | 493 | ufs_free_fragments (inode, tmp, oldcount); |
diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c index da553ffec85b..9f4590261134 100644 --- a/fs/ufs/inode.c +++ b/fs/ufs/inode.c | |||
@@ -401,13 +401,20 @@ static int ufs_getfrag_block(struct inode *inode, sector_t fragment, struct buff | |||
401 | u64 phys64 = 0; | 401 | u64 phys64 = 0; |
402 | unsigned frag = fragment & uspi->s_fpbmask; | 402 | unsigned frag = fragment & uspi->s_fpbmask; |
403 | 403 | ||
404 | if (!create) { | 404 | phys64 = ufs_frag_map(inode, offsets, depth); |
405 | phys64 = ufs_frag_map(inode, offsets, depth); | 405 | if (!create) |
406 | if (phys64) | 406 | goto done; |
407 | map_bh(bh_result, sb, phys64 + frag); | ||
408 | return 0; | ||
409 | } | ||
410 | 407 | ||
408 | if (phys64) { | ||
409 | if (fragment >= UFS_NDIR_FRAGMENT) | ||
410 | goto done; | ||
411 | read_seqlock_excl(&UFS_I(inode)->meta_lock); | ||
412 | if (fragment < UFS_I(inode)->i_lastfrag) { | ||
413 | read_sequnlock_excl(&UFS_I(inode)->meta_lock); | ||
414 | goto done; | ||
415 | } | ||
416 | read_sequnlock_excl(&UFS_I(inode)->meta_lock); | ||
417 | } | ||
411 | /* This code entered only while writing ....? */ | 418 | /* This code entered only while writing ....? */ |
412 | 419 | ||
413 | mutex_lock(&UFS_I(inode)->truncate_mutex); | 420 | mutex_lock(&UFS_I(inode)->truncate_mutex); |
@@ -451,6 +458,11 @@ out: | |||
451 | } | 458 | } |
452 | mutex_unlock(&UFS_I(inode)->truncate_mutex); | 459 | mutex_unlock(&UFS_I(inode)->truncate_mutex); |
453 | return err; | 460 | return err; |
461 | |||
462 | done: | ||
463 | if (phys64) | ||
464 | map_bh(bh_result, sb, phys64 + frag); | ||
465 | return 0; | ||
454 | } | 466 | } |
455 | 467 | ||
456 | static int ufs_writepage(struct page *page, struct writeback_control *wbc) | 468 | static int ufs_writepage(struct page *page, struct writeback_control *wbc) |
@@ -874,7 +886,6 @@ static inline void free_data(struct to_free *ctx, u64 from, unsigned count) | |||
874 | ctx->to = from + count; | 886 | ctx->to = from + count; |
875 | } | 887 | } |
876 | 888 | ||
877 | #define DIRECT_BLOCK ((inode->i_size + uspi->s_bsize - 1) >> uspi->s_bshift) | ||
878 | #define DIRECT_FRAGMENT ((inode->i_size + uspi->s_fsize - 1) >> uspi->s_fshift) | 889 | #define DIRECT_FRAGMENT ((inode->i_size + uspi->s_fsize - 1) >> uspi->s_fshift) |
879 | 890 | ||
880 | static void ufs_trunc_direct(struct inode *inode) | 891 | static void ufs_trunc_direct(struct inode *inode) |
@@ -1112,19 +1123,24 @@ static void ufs_truncate_blocks(struct inode *inode) | |||
1112 | struct super_block *sb = inode->i_sb; | 1123 | struct super_block *sb = inode->i_sb; |
1113 | struct ufs_sb_private_info *uspi = UFS_SB(sb)->s_uspi; | 1124 | struct ufs_sb_private_info *uspi = UFS_SB(sb)->s_uspi; |
1114 | unsigned offsets[4]; | 1125 | unsigned offsets[4]; |
1115 | int depth = ufs_block_to_path(inode, DIRECT_BLOCK, offsets); | 1126 | int depth; |
1116 | int depth2; | 1127 | int depth2; |
1117 | unsigned i; | 1128 | unsigned i; |
1118 | struct ufs_buffer_head *ubh[3]; | 1129 | struct ufs_buffer_head *ubh[3]; |
1119 | void *p; | 1130 | void *p; |
1120 | u64 block; | 1131 | u64 block; |
1121 | 1132 | ||
1122 | if (!depth) | 1133 | if (inode->i_size) { |
1123 | return; | 1134 | sector_t last = (inode->i_size - 1) >> uspi->s_bshift; |
1135 | depth = ufs_block_to_path(inode, last, offsets); | ||
1136 | if (!depth) | ||
1137 | return; | ||
1138 | } else { | ||
1139 | depth = 1; | ||
1140 | } | ||
1124 | 1141 | ||
1125 | /* find the last non-zero in offsets[] */ | ||
1126 | for (depth2 = depth - 1; depth2; depth2--) | 1142 | for (depth2 = depth - 1; depth2; depth2--) |
1127 | if (offsets[depth2]) | 1143 | if (offsets[depth2] != uspi->s_apb - 1) |
1128 | break; | 1144 | break; |
1129 | 1145 | ||
1130 | mutex_lock(&ufsi->truncate_mutex); | 1146 | mutex_lock(&ufsi->truncate_mutex); |
@@ -1133,9 +1149,8 @@ static void ufs_truncate_blocks(struct inode *inode) | |||
1133 | offsets[0] = UFS_IND_BLOCK; | 1149 | offsets[0] = UFS_IND_BLOCK; |
1134 | } else { | 1150 | } else { |
1135 | /* get the blocks that should be partially emptied */ | 1151 | /* get the blocks that should be partially emptied */ |
1136 | p = ufs_get_direct_data_ptr(uspi, ufsi, offsets[0]); | 1152 | p = ufs_get_direct_data_ptr(uspi, ufsi, offsets[0]++); |
1137 | for (i = 0; i < depth2; i++) { | 1153 | for (i = 0; i < depth2; i++) { |
1138 | offsets[i]++; /* next branch is fully freed */ | ||
1139 | block = ufs_data_ptr_to_cpu(sb, p); | 1154 | block = ufs_data_ptr_to_cpu(sb, p); |
1140 | if (!block) | 1155 | if (!block) |
1141 | break; | 1156 | break; |
@@ -1146,7 +1161,7 @@ static void ufs_truncate_blocks(struct inode *inode) | |||
1146 | write_sequnlock(&ufsi->meta_lock); | 1161 | write_sequnlock(&ufsi->meta_lock); |
1147 | break; | 1162 | break; |
1148 | } | 1163 | } |
1149 | p = ubh_get_data_ptr(uspi, ubh[i], offsets[i + 1]); | 1164 | p = ubh_get_data_ptr(uspi, ubh[i], offsets[i + 1]++); |
1150 | } | 1165 | } |
1151 | while (i--) | 1166 | while (i--) |
1152 | free_branch_tail(inode, offsets[i + 1], ubh[i], depth - i - 1); | 1167 | free_branch_tail(inode, offsets[i + 1], ubh[i], depth - i - 1); |
@@ -1161,7 +1176,9 @@ static void ufs_truncate_blocks(struct inode *inode) | |||
1161 | free_full_branch(inode, block, i - UFS_IND_BLOCK + 1); | 1176 | free_full_branch(inode, block, i - UFS_IND_BLOCK + 1); |
1162 | } | 1177 | } |
1163 | } | 1178 | } |
1179 | read_seqlock_excl(&ufsi->meta_lock); | ||
1164 | ufsi->i_lastfrag = DIRECT_FRAGMENT; | 1180 | ufsi->i_lastfrag = DIRECT_FRAGMENT; |
1181 | read_sequnlock_excl(&ufsi->meta_lock); | ||
1165 | mark_inode_dirty(inode); | 1182 | mark_inode_dirty(inode); |
1166 | mutex_unlock(&ufsi->truncate_mutex); | 1183 | mutex_unlock(&ufsi->truncate_mutex); |
1167 | } | 1184 | } |
diff --git a/fs/ufs/super.c b/fs/ufs/super.c index 878cc6264f1a..d5300adbfd79 100644 --- a/fs/ufs/super.c +++ b/fs/ufs/super.c | |||
@@ -480,7 +480,7 @@ static void ufs_setup_cstotal(struct super_block *sb) | |||
480 | usb3 = ubh_get_usb_third(uspi); | 480 | usb3 = ubh_get_usb_third(uspi); |
481 | 481 | ||
482 | if ((mtype == UFS_MOUNT_UFSTYPE_44BSD && | 482 | if ((mtype == UFS_MOUNT_UFSTYPE_44BSD && |
483 | (usb1->fs_flags & UFS_FLAGS_UPDATED)) || | 483 | (usb2->fs_un.fs_u2.fs_maxbsize == usb1->fs_bsize)) || |
484 | mtype == UFS_MOUNT_UFSTYPE_UFS2) { | 484 | mtype == UFS_MOUNT_UFSTYPE_UFS2) { |
485 | /*we have statistic in different place, then usual*/ | 485 | /*we have statistic in different place, then usual*/ |
486 | uspi->cs_total.cs_ndir = fs64_to_cpu(sb, usb2->fs_un.fs_u2.cs_ndir); | 486 | uspi->cs_total.cs_ndir = fs64_to_cpu(sb, usb2->fs_un.fs_u2.cs_ndir); |
@@ -596,9 +596,7 @@ static void ufs_put_cstotal(struct super_block *sb) | |||
596 | usb2 = ubh_get_usb_second(uspi); | 596 | usb2 = ubh_get_usb_second(uspi); |
597 | usb3 = ubh_get_usb_third(uspi); | 597 | usb3 = ubh_get_usb_third(uspi); |
598 | 598 | ||
599 | if ((mtype == UFS_MOUNT_UFSTYPE_44BSD && | 599 | if (mtype == UFS_MOUNT_UFSTYPE_UFS2) { |
600 | (usb1->fs_flags & UFS_FLAGS_UPDATED)) || | ||
601 | mtype == UFS_MOUNT_UFSTYPE_UFS2) { | ||
602 | /*we have statistic in different place, then usual*/ | 600 | /*we have statistic in different place, then usual*/ |
603 | usb2->fs_un.fs_u2.cs_ndir = | 601 | usb2->fs_un.fs_u2.cs_ndir = |
604 | cpu_to_fs64(sb, uspi->cs_total.cs_ndir); | 602 | cpu_to_fs64(sb, uspi->cs_total.cs_ndir); |
@@ -608,16 +606,26 @@ static void ufs_put_cstotal(struct super_block *sb) | |||
608 | cpu_to_fs64(sb, uspi->cs_total.cs_nifree); | 606 | cpu_to_fs64(sb, uspi->cs_total.cs_nifree); |
609 | usb3->fs_un1.fs_u2.cs_nffree = | 607 | usb3->fs_un1.fs_u2.cs_nffree = |
610 | cpu_to_fs64(sb, uspi->cs_total.cs_nffree); | 608 | cpu_to_fs64(sb, uspi->cs_total.cs_nffree); |
611 | } else { | 609 | goto out; |
612 | usb1->fs_cstotal.cs_ndir = | 610 | } |
613 | cpu_to_fs32(sb, uspi->cs_total.cs_ndir); | 611 | |
614 | usb1->fs_cstotal.cs_nbfree = | 612 | if (mtype == UFS_MOUNT_UFSTYPE_44BSD && |
615 | cpu_to_fs32(sb, uspi->cs_total.cs_nbfree); | 613 | (usb2->fs_un.fs_u2.fs_maxbsize == usb1->fs_bsize)) { |
616 | usb1->fs_cstotal.cs_nifree = | 614 | /* store stats in both old and new places */ |
617 | cpu_to_fs32(sb, uspi->cs_total.cs_nifree); | 615 | usb2->fs_un.fs_u2.cs_ndir = |
618 | usb1->fs_cstotal.cs_nffree = | 616 | cpu_to_fs64(sb, uspi->cs_total.cs_ndir); |
619 | cpu_to_fs32(sb, uspi->cs_total.cs_nffree); | 617 | usb2->fs_un.fs_u2.cs_nbfree = |
618 | cpu_to_fs64(sb, uspi->cs_total.cs_nbfree); | ||
619 | usb3->fs_un1.fs_u2.cs_nifree = | ||
620 | cpu_to_fs64(sb, uspi->cs_total.cs_nifree); | ||
621 | usb3->fs_un1.fs_u2.cs_nffree = | ||
622 | cpu_to_fs64(sb, uspi->cs_total.cs_nffree); | ||
620 | } | 623 | } |
624 | usb1->fs_cstotal.cs_ndir = cpu_to_fs32(sb, uspi->cs_total.cs_ndir); | ||
625 | usb1->fs_cstotal.cs_nbfree = cpu_to_fs32(sb, uspi->cs_total.cs_nbfree); | ||
626 | usb1->fs_cstotal.cs_nifree = cpu_to_fs32(sb, uspi->cs_total.cs_nifree); | ||
627 | usb1->fs_cstotal.cs_nffree = cpu_to_fs32(sb, uspi->cs_total.cs_nffree); | ||
628 | out: | ||
621 | ubh_mark_buffer_dirty(USPI_UBH(uspi)); | 629 | ubh_mark_buffer_dirty(USPI_UBH(uspi)); |
622 | ufs_print_super_stuff(sb, usb1, usb2, usb3); | 630 | ufs_print_super_stuff(sb, usb1, usb2, usb3); |
623 | UFSD("EXIT\n"); | 631 | UFSD("EXIT\n"); |
@@ -996,6 +1004,13 @@ again: | |||
996 | flags |= UFS_ST_SUN; | 1004 | flags |= UFS_ST_SUN; |
997 | } | 1005 | } |
998 | 1006 | ||
1007 | if ((flags & UFS_ST_MASK) == UFS_ST_44BSD && | ||
1008 | uspi->s_postblformat == UFS_42POSTBLFMT) { | ||
1009 | if (!silent) | ||
1010 | pr_err("this is not a 44bsd filesystem"); | ||
1011 | goto failed; | ||
1012 | } | ||
1013 | |||
999 | /* | 1014 | /* |
1000 | * Check ufs magic number | 1015 | * Check ufs magic number |
1001 | */ | 1016 | */ |
@@ -1143,8 +1158,8 @@ magic_found: | |||
1143 | uspi->s_cgmask = fs32_to_cpu(sb, usb1->fs_cgmask); | 1158 | uspi->s_cgmask = fs32_to_cpu(sb, usb1->fs_cgmask); |
1144 | 1159 | ||
1145 | if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) { | 1160 | if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) { |
1146 | uspi->s_u2_size = fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_size); | 1161 | uspi->s_size = fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_size); |
1147 | uspi->s_u2_dsize = fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_dsize); | 1162 | uspi->s_dsize = fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_dsize); |
1148 | } else { | 1163 | } else { |
1149 | uspi->s_size = fs32_to_cpu(sb, usb1->fs_size); | 1164 | uspi->s_size = fs32_to_cpu(sb, usb1->fs_size); |
1150 | uspi->s_dsize = fs32_to_cpu(sb, usb1->fs_dsize); | 1165 | uspi->s_dsize = fs32_to_cpu(sb, usb1->fs_dsize); |
@@ -1193,6 +1208,9 @@ magic_found: | |||
1193 | uspi->s_postbloff = fs32_to_cpu(sb, usb3->fs_postbloff); | 1208 | uspi->s_postbloff = fs32_to_cpu(sb, usb3->fs_postbloff); |
1194 | uspi->s_rotbloff = fs32_to_cpu(sb, usb3->fs_rotbloff); | 1209 | uspi->s_rotbloff = fs32_to_cpu(sb, usb3->fs_rotbloff); |
1195 | 1210 | ||
1211 | uspi->s_root_blocks = mul_u64_u32_div(uspi->s_dsize, | ||
1212 | uspi->s_minfree, 100); | ||
1213 | |||
1196 | /* | 1214 | /* |
1197 | * Compute another frequently used values | 1215 | * Compute another frequently used values |
1198 | */ | 1216 | */ |
@@ -1382,19 +1400,17 @@ static int ufs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
1382 | mutex_lock(&UFS_SB(sb)->s_lock); | 1400 | mutex_lock(&UFS_SB(sb)->s_lock); |
1383 | usb3 = ubh_get_usb_third(uspi); | 1401 | usb3 = ubh_get_usb_third(uspi); |
1384 | 1402 | ||
1385 | if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) { | 1403 | if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) |
1386 | buf->f_type = UFS2_MAGIC; | 1404 | buf->f_type = UFS2_MAGIC; |
1387 | buf->f_blocks = fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_dsize); | 1405 | else |
1388 | } else { | ||
1389 | buf->f_type = UFS_MAGIC; | 1406 | buf->f_type = UFS_MAGIC; |
1390 | buf->f_blocks = uspi->s_dsize; | 1407 | |
1391 | } | 1408 | buf->f_blocks = uspi->s_dsize; |
1392 | buf->f_bfree = ufs_blkstofrags(uspi->cs_total.cs_nbfree) + | 1409 | buf->f_bfree = ufs_freefrags(uspi); |
1393 | uspi->cs_total.cs_nffree; | ||
1394 | buf->f_ffree = uspi->cs_total.cs_nifree; | 1410 | buf->f_ffree = uspi->cs_total.cs_nifree; |
1395 | buf->f_bsize = sb->s_blocksize; | 1411 | buf->f_bsize = sb->s_blocksize; |
1396 | buf->f_bavail = (buf->f_bfree > (((long)buf->f_blocks / 100) * uspi->s_minfree)) | 1412 | buf->f_bavail = (buf->f_bfree > uspi->s_root_blocks) |
1397 | ? (buf->f_bfree - (((long)buf->f_blocks / 100) * uspi->s_minfree)) : 0; | 1413 | ? (buf->f_bfree - uspi->s_root_blocks) : 0; |
1398 | buf->f_files = uspi->s_ncg * uspi->s_ipg; | 1414 | buf->f_files = uspi->s_ncg * uspi->s_ipg; |
1399 | buf->f_namelen = UFS_MAXNAMLEN; | 1415 | buf->f_namelen = UFS_MAXNAMLEN; |
1400 | buf->f_fsid.val[0] = (u32)id; | 1416 | buf->f_fsid.val[0] = (u32)id; |
diff --git a/fs/ufs/ufs_fs.h b/fs/ufs/ufs_fs.h index 0cbd5d340b67..823d55a37586 100644 --- a/fs/ufs/ufs_fs.h +++ b/fs/ufs/ufs_fs.h | |||
@@ -733,10 +733,8 @@ struct ufs_sb_private_info { | |||
733 | __u32 s_dblkno; /* offset of first data after cg */ | 733 | __u32 s_dblkno; /* offset of first data after cg */ |
734 | __u32 s_cgoffset; /* cylinder group offset in cylinder */ | 734 | __u32 s_cgoffset; /* cylinder group offset in cylinder */ |
735 | __u32 s_cgmask; /* used to calc mod fs_ntrak */ | 735 | __u32 s_cgmask; /* used to calc mod fs_ntrak */ |
736 | __u32 s_size; /* number of blocks (fragments) in fs */ | 736 | __u64 s_size; /* number of blocks (fragments) in fs */ |
737 | __u32 s_dsize; /* number of data blocks in fs */ | 737 | __u64 s_dsize; /* number of data blocks in fs */ |
738 | __u64 s_u2_size; /* ufs2: number of blocks (fragments) in fs */ | ||
739 | __u64 s_u2_dsize; /*ufs2: number of data blocks in fs */ | ||
740 | __u32 s_ncg; /* number of cylinder groups */ | 738 | __u32 s_ncg; /* number of cylinder groups */ |
741 | __u32 s_bsize; /* size of basic blocks */ | 739 | __u32 s_bsize; /* size of basic blocks */ |
742 | __u32 s_fsize; /* size of fragments */ | 740 | __u32 s_fsize; /* size of fragments */ |
@@ -793,6 +791,7 @@ struct ufs_sb_private_info { | |||
793 | __u32 s_maxsymlinklen;/* upper limit on fast symlinks' size */ | 791 | __u32 s_maxsymlinklen;/* upper limit on fast symlinks' size */ |
794 | __s32 fs_magic; /* filesystem magic */ | 792 | __s32 fs_magic; /* filesystem magic */ |
795 | unsigned int s_dirblksize; | 793 | unsigned int s_dirblksize; |
794 | __u64 s_root_blocks; | ||
796 | }; | 795 | }; |
797 | 796 | ||
798 | /* | 797 | /* |
diff --git a/fs/ufs/util.c b/fs/ufs/util.c index f41ad0a6106f..02497a492eb2 100644 --- a/fs/ufs/util.c +++ b/fs/ufs/util.c | |||
@@ -243,9 +243,8 @@ ufs_set_inode_dev(struct super_block *sb, struct ufs_inode_info *ufsi, dev_t dev | |||
243 | struct page *ufs_get_locked_page(struct address_space *mapping, | 243 | struct page *ufs_get_locked_page(struct address_space *mapping, |
244 | pgoff_t index) | 244 | pgoff_t index) |
245 | { | 245 | { |
246 | struct page *page; | 246 | struct inode *inode = mapping->host; |
247 | 247 | struct page *page = find_lock_page(mapping, index); | |
248 | page = find_lock_page(mapping, index); | ||
249 | if (!page) { | 248 | if (!page) { |
250 | page = read_mapping_page(mapping, index, NULL); | 249 | page = read_mapping_page(mapping, index, NULL); |
251 | 250 | ||
@@ -253,7 +252,7 @@ struct page *ufs_get_locked_page(struct address_space *mapping, | |||
253 | printk(KERN_ERR "ufs_change_blocknr: " | 252 | printk(KERN_ERR "ufs_change_blocknr: " |
254 | "read_mapping_page error: ino %lu, index: %lu\n", | 253 | "read_mapping_page error: ino %lu, index: %lu\n", |
255 | mapping->host->i_ino, index); | 254 | mapping->host->i_ino, index); |
256 | goto out; | 255 | return page; |
257 | } | 256 | } |
258 | 257 | ||
259 | lock_page(page); | 258 | lock_page(page); |
@@ -262,8 +261,7 @@ struct page *ufs_get_locked_page(struct address_space *mapping, | |||
262 | /* Truncate got there first */ | 261 | /* Truncate got there first */ |
263 | unlock_page(page); | 262 | unlock_page(page); |
264 | put_page(page); | 263 | put_page(page); |
265 | page = NULL; | 264 | return NULL; |
266 | goto out; | ||
267 | } | 265 | } |
268 | 266 | ||
269 | if (!PageUptodate(page) || PageError(page)) { | 267 | if (!PageUptodate(page) || PageError(page)) { |
@@ -272,11 +270,12 @@ struct page *ufs_get_locked_page(struct address_space *mapping, | |||
272 | 270 | ||
273 | printk(KERN_ERR "ufs_change_blocknr: " | 271 | printk(KERN_ERR "ufs_change_blocknr: " |
274 | "can not read page: ino %lu, index: %lu\n", | 272 | "can not read page: ino %lu, index: %lu\n", |
275 | mapping->host->i_ino, index); | 273 | inode->i_ino, index); |
276 | 274 | ||
277 | page = ERR_PTR(-EIO); | 275 | return ERR_PTR(-EIO); |
278 | } | 276 | } |
279 | } | 277 | } |
280 | out: | 278 | if (!page_has_buffers(page)) |
279 | create_empty_buffers(page, 1 << inode->i_blkbits, 0); | ||
281 | return page; | 280 | return page; |
282 | } | 281 | } |
diff --git a/fs/ufs/util.h b/fs/ufs/util.h index 398019fb1448..9fc7119a1551 100644 --- a/fs/ufs/util.h +++ b/fs/ufs/util.h | |||
@@ -350,16 +350,11 @@ static inline void *ubh_get_data_ptr(struct ufs_sb_private_info *uspi, | |||
350 | #define ubh_blkmap(ubh,begin,bit) \ | 350 | #define ubh_blkmap(ubh,begin,bit) \ |
351 | ((*ubh_get_addr(ubh, (begin) + ((bit) >> 3)) >> ((bit) & 7)) & (0xff >> (UFS_MAXFRAG - uspi->s_fpb))) | 351 | ((*ubh_get_addr(ubh, (begin) + ((bit) >> 3)) >> ((bit) & 7)) & (0xff >> (UFS_MAXFRAG - uspi->s_fpb))) |
352 | 352 | ||
353 | /* | ||
354 | * Determine the number of available frags given a | ||
355 | * percentage to hold in reserve. | ||
356 | */ | ||
357 | static inline u64 | 353 | static inline u64 |
358 | ufs_freespace(struct ufs_sb_private_info *uspi, int percentreserved) | 354 | ufs_freefrags(struct ufs_sb_private_info *uspi) |
359 | { | 355 | { |
360 | return ufs_blkstofrags(uspi->cs_total.cs_nbfree) + | 356 | return ufs_blkstofrags(uspi->cs_total.cs_nbfree) + |
361 | uspi->cs_total.cs_nffree - | 357 | uspi->cs_total.cs_nffree; |
362 | (uspi->s_dsize * (percentreserved) / 100); | ||
363 | } | 358 | } |
364 | 359 | ||
365 | /* | 360 | /* |