aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2017-06-14 16:36:29 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2017-06-14 16:43:03 -0400
commitc596961d1b4ccc6f15754fe5a49c37ac6da57145 (patch)
tree984ec943e69b3f61920bc4eda674216a49552108
parentb451cec4bbd913688f5381efad407762a64a92ce (diff)
ufs: fix s_size/s_dsize users
For UFS2 we need 64bit variants; we even store them in uspi, but use 32bit ones instead. One wrinkle is in handling of reserved space - recalculating it every time had been stupid all along, but now it would become really ugly. Just calculate it once... Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--fs/ufs/balloc.c2
-rw-r--r--fs/ufs/super.c23
-rw-r--r--fs/ufs/ufs_fs.h7
-rw-r--r--fs/ufs/util.h11
4 files changed, 19 insertions, 24 deletions
diff --git a/fs/ufs/balloc.c b/fs/ufs/balloc.c
index 52d1ef415f6f..af0473a851af 100644
--- a/fs/ufs/balloc.c
+++ b/fs/ufs/balloc.c
@@ -400,7 +400,7 @@ 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 (unlikely(ufs_freespace(uspi, uspi->s_minfree) <= 0)) { 403 if (unlikely(ufs_freefrags(uspi) <= uspi->s_root_blocks)) {
404 if (!capable(CAP_SYS_RESOURCE)) { 404 if (!capable(CAP_SYS_RESOURCE)) {
405 mutex_unlock(&UFS_SB(sb)->s_lock); 405 mutex_unlock(&UFS_SB(sb)->s_lock);
406 UFSD("EXIT (FAILED)\n"); 406 UFSD("EXIT (FAILED)\n");
diff --git a/fs/ufs/super.c b/fs/ufs/super.c
index eca838a8b43e..34656c7a8e22 100644
--- a/fs/ufs/super.c
+++ b/fs/ufs/super.c
@@ -1159,8 +1159,8 @@ magic_found:
1159 uspi->s_cgmask = fs32_to_cpu(sb, usb1->fs_cgmask); 1159 uspi->s_cgmask = fs32_to_cpu(sb, usb1->fs_cgmask);
1160 1160
1161 if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) { 1161 if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) {
1162 uspi->s_u2_size = fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_size); 1162 uspi->s_size = fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_size);
1163 uspi->s_u2_dsize = fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_dsize); 1163 uspi->s_dsize = fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_dsize);
1164 } else { 1164 } else {
1165 uspi->s_size = fs32_to_cpu(sb, usb1->fs_size); 1165 uspi->s_size = fs32_to_cpu(sb, usb1->fs_size);
1166 uspi->s_dsize = fs32_to_cpu(sb, usb1->fs_dsize); 1166 uspi->s_dsize = fs32_to_cpu(sb, usb1->fs_dsize);
@@ -1209,6 +1209,9 @@ magic_found:
1209 uspi->s_postbloff = fs32_to_cpu(sb, usb3->fs_postbloff); 1209 uspi->s_postbloff = fs32_to_cpu(sb, usb3->fs_postbloff);
1210 uspi->s_rotbloff = fs32_to_cpu(sb, usb3->fs_rotbloff); 1210 uspi->s_rotbloff = fs32_to_cpu(sb, usb3->fs_rotbloff);
1211 1211
1212 uspi->s_root_blocks = mul_u64_u32_div(uspi->s_dsize,
1213 uspi->s_minfree, 100);
1214
1212 /* 1215 /*
1213 * Compute another frequently used values 1216 * Compute another frequently used values
1214 */ 1217 */
@@ -1398,19 +1401,17 @@ static int ufs_statfs(struct dentry *dentry, struct kstatfs *buf)
1398 mutex_lock(&UFS_SB(sb)->s_lock); 1401 mutex_lock(&UFS_SB(sb)->s_lock);
1399 usb3 = ubh_get_usb_third(uspi); 1402 usb3 = ubh_get_usb_third(uspi);
1400 1403
1401 if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) { 1404 if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2)
1402 buf->f_type = UFS2_MAGIC; 1405 buf->f_type = UFS2_MAGIC;
1403 buf->f_blocks = fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_dsize); 1406 else
1404 } else {
1405 buf->f_type = UFS_MAGIC; 1407 buf->f_type = UFS_MAGIC;
1406 buf->f_blocks = uspi->s_dsize; 1408
1407 } 1409 buf->f_blocks = uspi->s_dsize;
1408 buf->f_bfree = ufs_blkstofrags(uspi->cs_total.cs_nbfree) + 1410 buf->f_bfree = ufs_freefrags(uspi);
1409 uspi->cs_total.cs_nffree;
1410 buf->f_ffree = uspi->cs_total.cs_nifree; 1411 buf->f_ffree = uspi->cs_total.cs_nifree;
1411 buf->f_bsize = sb->s_blocksize; 1412 buf->f_bsize = sb->s_blocksize;
1412 buf->f_bavail = (buf->f_bfree > (((long)buf->f_blocks / 100) * uspi->s_minfree)) 1413 buf->f_bavail = (buf->f_bfree > uspi->s_root_blocks)
1413 ? (buf->f_bfree - (((long)buf->f_blocks / 100) * uspi->s_minfree)) : 0; 1414 ? (buf->f_bfree - uspi->s_root_blocks) : 0;
1414 buf->f_files = uspi->s_ncg * uspi->s_ipg; 1415 buf->f_files = uspi->s_ncg * uspi->s_ipg;
1415 buf->f_namelen = UFS_MAXNAMLEN; 1416 buf->f_namelen = UFS_MAXNAMLEN;
1416 buf->f_fsid.val[0] = (u32)id; 1417 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.h b/fs/ufs/util.h
index 1e1639f8a58b..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/* 353static inline u64
354 * Determine the number of available frags given a 354ufs_freefrags(struct ufs_sb_private_info *uspi)
355 * percentage to hold in reserve.
356 */
357static inline s64
358ufs_freespace(struct ufs_sb_private_info *uspi, int percentreserved)
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/*