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 | /* |
