diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2017-06-14 16:36:29 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2017-06-14 16:43:03 -0400 |
commit | c596961d1b4ccc6f15754fe5a49c37ac6da57145 (patch) | |
tree | 984ec943e69b3f61920bc4eda674216a49552108 | |
parent | b451cec4bbd913688f5381efad407762a64a92ce (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.c | 2 | ||||
-rw-r--r-- | fs/ufs/super.c | 23 | ||||
-rw-r--r-- | fs/ufs/ufs_fs.h | 7 | ||||
-rw-r--r-- | fs/ufs/util.h | 11 |
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 | /* | 353 | static inline u64 |
354 | * Determine the number of available frags given a | 354 | ufs_freefrags(struct ufs_sb_private_info *uspi) |
355 | * percentage to hold in reserve. | ||
356 | */ | ||
357 | static inline s64 | ||
358 | ufs_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 | /* |