aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/ufs/balloc.c22
-rw-r--r--fs/ufs/inode.c47
-rw-r--r--fs/ufs/super.c64
-rw-r--r--fs/ufs/ufs_fs.h7
-rw-r--r--fs/ufs/util.c17
-rw-r--r--fs/ufs/util.h9
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
462done:
463 if (phys64)
464 map_bh(bh_result, sb, phys64 + frag);
465 return 0;
454} 466}
455 467
456static int ufs_writepage(struct page *page, struct writeback_control *wbc) 468static 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
880static void ufs_trunc_direct(struct inode *inode) 891static 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);
628out:
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
243struct page *ufs_get_locked_page(struct address_space *mapping, 243struct 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 }
280out: 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 */
357static inline u64 353static inline u64
358ufs_freespace(struct ufs_sb_private_info *uspi, int percentreserved) 354ufs_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/*