ufs: beginning of __ufs_truncate_block() massage
Use ufs_block_to_path() to find the cutoff path in the block pointers' tree. For now just use the information about the depth (to bypass the fully preserved subtrees); subsequent commits will use the information about actual path. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
4e3911f3d7
commit
31cd043e1a
@ -1336,14 +1336,22 @@ static void __ufs_truncate_blocks(struct inode *inode)
|
|||||||
struct ufs_inode_info *ufsi = UFS_I(inode);
|
struct ufs_inode_info *ufsi = UFS_I(inode);
|
||||||
struct super_block *sb = inode->i_sb;
|
struct super_block *sb = inode->i_sb;
|
||||||
struct ufs_sb_private_info *uspi = UFS_SB(sb)->s_uspi;
|
struct ufs_sb_private_info *uspi = UFS_SB(sb)->s_uspi;
|
||||||
|
unsigned offsets[4];
|
||||||
|
int depth = ufs_block_to_path(inode, DIRECT_BLOCK, offsets);
|
||||||
|
|
||||||
mutex_lock(&ufsi->truncate_mutex);
|
mutex_lock(&ufsi->truncate_mutex);
|
||||||
ufs_trunc_direct(inode);
|
switch (depth) {
|
||||||
ufs_trunc_indirect(inode, UFS_IND_BLOCK,
|
case 1:
|
||||||
|
ufs_trunc_direct(inode);
|
||||||
|
case 2:
|
||||||
|
ufs_trunc_indirect(inode, UFS_IND_BLOCK,
|
||||||
ufs_get_direct_data_ptr(uspi, ufsi, UFS_IND_BLOCK));
|
ufs_get_direct_data_ptr(uspi, ufsi, UFS_IND_BLOCK));
|
||||||
ufs_trunc_dindirect(inode, UFS_IND_BLOCK + uspi->s_apb,
|
case 3:
|
||||||
|
ufs_trunc_dindirect(inode, UFS_IND_BLOCK + uspi->s_apb,
|
||||||
ufs_get_direct_data_ptr(uspi, ufsi, UFS_DIND_BLOCK));
|
ufs_get_direct_data_ptr(uspi, ufsi, UFS_DIND_BLOCK));
|
||||||
ufs_trunc_tindirect(inode);
|
case 4:
|
||||||
|
ufs_trunc_tindirect(inode);
|
||||||
|
}
|
||||||
ufsi->i_lastfrag = DIRECT_FRAGMENT;
|
ufsi->i_lastfrag = DIRECT_FRAGMENT;
|
||||||
mutex_unlock(&ufsi->truncate_mutex);
|
mutex_unlock(&ufsi->truncate_mutex);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user