forked from luck/tmp_suning_uos_patched
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>
This commit is contained in:
parent
b451cec4bb
commit
c596961d1b
|
@ -400,7 +400,7 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment,
|
|||
/*
|
||||
* There is not enough space for user on the device
|
||||
*/
|
||||
if (unlikely(ufs_freespace(uspi, uspi->s_minfree) <= 0)) {
|
||||
if (unlikely(ufs_freefrags(uspi) <= uspi->s_root_blocks)) {
|
||||
if (!capable(CAP_SYS_RESOURCE)) {
|
||||
mutex_unlock(&UFS_SB(sb)->s_lock);
|
||||
UFSD("EXIT (FAILED)\n");
|
||||
|
|
|
@ -1159,8 +1159,8 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
|
|||
uspi->s_cgmask = fs32_to_cpu(sb, usb1->fs_cgmask);
|
||||
|
||||
if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) {
|
||||
uspi->s_u2_size = fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_size);
|
||||
uspi->s_u2_dsize = fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_dsize);
|
||||
uspi->s_size = fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_size);
|
||||
uspi->s_dsize = fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_dsize);
|
||||
} else {
|
||||
uspi->s_size = fs32_to_cpu(sb, usb1->fs_size);
|
||||
uspi->s_dsize = fs32_to_cpu(sb, usb1->fs_dsize);
|
||||
|
@ -1209,6 +1209,9 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
|
|||
uspi->s_postbloff = fs32_to_cpu(sb, usb3->fs_postbloff);
|
||||
uspi->s_rotbloff = fs32_to_cpu(sb, usb3->fs_rotbloff);
|
||||
|
||||
uspi->s_root_blocks = mul_u64_u32_div(uspi->s_dsize,
|
||||
uspi->s_minfree, 100);
|
||||
|
||||
/*
|
||||
* Compute another frequently used values
|
||||
*/
|
||||
|
@ -1398,19 +1401,17 @@ static int ufs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
|||
mutex_lock(&UFS_SB(sb)->s_lock);
|
||||
usb3 = ubh_get_usb_third(uspi);
|
||||
|
||||
if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) {
|
||||
if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2)
|
||||
buf->f_type = UFS2_MAGIC;
|
||||
buf->f_blocks = fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_dsize);
|
||||
} else {
|
||||
else
|
||||
buf->f_type = UFS_MAGIC;
|
||||
buf->f_blocks = uspi->s_dsize;
|
||||
}
|
||||
buf->f_bfree = ufs_blkstofrags(uspi->cs_total.cs_nbfree) +
|
||||
uspi->cs_total.cs_nffree;
|
||||
|
||||
buf->f_blocks = uspi->s_dsize;
|
||||
buf->f_bfree = ufs_freefrags(uspi);
|
||||
buf->f_ffree = uspi->cs_total.cs_nifree;
|
||||
buf->f_bsize = sb->s_blocksize;
|
||||
buf->f_bavail = (buf->f_bfree > (((long)buf->f_blocks / 100) * uspi->s_minfree))
|
||||
? (buf->f_bfree - (((long)buf->f_blocks / 100) * uspi->s_minfree)) : 0;
|
||||
buf->f_bavail = (buf->f_bfree > uspi->s_root_blocks)
|
||||
? (buf->f_bfree - uspi->s_root_blocks) : 0;
|
||||
buf->f_files = uspi->s_ncg * uspi->s_ipg;
|
||||
buf->f_namelen = UFS_MAXNAMLEN;
|
||||
buf->f_fsid.val[0] = (u32)id;
|
||||
|
|
|
@ -733,10 +733,8 @@ struct ufs_sb_private_info {
|
|||
__u32 s_dblkno; /* offset of first data after cg */
|
||||
__u32 s_cgoffset; /* cylinder group offset in cylinder */
|
||||
__u32 s_cgmask; /* used to calc mod fs_ntrak */
|
||||
__u32 s_size; /* number of blocks (fragments) in fs */
|
||||
__u32 s_dsize; /* number of data blocks in fs */
|
||||
__u64 s_u2_size; /* ufs2: number of blocks (fragments) in fs */
|
||||
__u64 s_u2_dsize; /*ufs2: number of data blocks in fs */
|
||||
__u64 s_size; /* number of blocks (fragments) in fs */
|
||||
__u64 s_dsize; /* number of data blocks in fs */
|
||||
__u32 s_ncg; /* number of cylinder groups */
|
||||
__u32 s_bsize; /* size of basic blocks */
|
||||
__u32 s_fsize; /* size of fragments */
|
||||
|
@ -793,6 +791,7 @@ struct ufs_sb_private_info {
|
|||
__u32 s_maxsymlinklen;/* upper limit on fast symlinks' size */
|
||||
__s32 fs_magic; /* filesystem magic */
|
||||
unsigned int s_dirblksize;
|
||||
__u64 s_root_blocks;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -350,16 +350,11 @@ static inline void *ubh_get_data_ptr(struct ufs_sb_private_info *uspi,
|
|||
#define ubh_blkmap(ubh,begin,bit) \
|
||||
((*ubh_get_addr(ubh, (begin) + ((bit) >> 3)) >> ((bit) & 7)) & (0xff >> (UFS_MAXFRAG - uspi->s_fpb)))
|
||||
|
||||
/*
|
||||
* Determine the number of available frags given a
|
||||
* percentage to hold in reserve.
|
||||
*/
|
||||
static inline s64
|
||||
ufs_freespace(struct ufs_sb_private_info *uspi, int percentreserved)
|
||||
static inline u64
|
||||
ufs_freefrags(struct ufs_sb_private_info *uspi)
|
||||
{
|
||||
return ufs_blkstofrags(uspi->cs_total.cs_nbfree) +
|
||||
uspi->cs_total.cs_nffree -
|
||||
(uspi->s_dsize * percentreserved) / 100;
|
||||
uspi->cs_total.cs_nffree;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue
Block a user