提交 5336970b 编写于 作者: A Al Viro

ufs_inode_getfrag(): pass index instead of 'fragment'

same story as with ufs_inode_getblock()
Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
上级 0f3c1294
...@@ -242,10 +242,8 @@ ufs_extend_tail(struct inode *inode, u64 writes_to, ...@@ -242,10 +242,8 @@ ufs_extend_tail(struct inode *inode, u64 writes_to,
/** /**
* ufs_inode_getfrag() - allocate new fragment(s) * ufs_inode_getfrag() - allocate new fragment(s)
* @inode: pointer to inode * @inode: pointer to inode
* @fragment: number of `fragment' which hold pointer * @index: number of block pointer within the inode's array.
* to new allocated fragment(s)
* @new_fragment: number of new allocated fragment(s) * @new_fragment: number of new allocated fragment(s)
* @required: how many fragment(s) we require
* @err: we set it if something wrong * @err: we set it if something wrong
* @phys: pointer to where we save physical number of new allocated fragments, * @phys: pointer to where we save physical number of new allocated fragments,
* NULL if we allocate not data(indirect blocks for example). * NULL if we allocate not data(indirect blocks for example).
...@@ -253,15 +251,14 @@ ufs_extend_tail(struct inode *inode, u64 writes_to, ...@@ -253,15 +251,14 @@ ufs_extend_tail(struct inode *inode, u64 writes_to,
* @locked_page: for ufs_new_fragments() * @locked_page: for ufs_new_fragments()
*/ */
static u64 static u64
ufs_inode_getfrag(struct inode *inode, u64 fragment, ufs_inode_getfrag(struct inode *inode, unsigned index,
sector_t new_fragment, unsigned int required, int *err, sector_t new_fragment, int *err,
long *phys, int *new, struct page *locked_page) long *phys, int *new, struct page *locked_page)
{ {
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 blockoff; u64 tmp, goal, lastfrag;
u64 tmp, goal, lastfrag, block;
unsigned nfrags = uspi->s_fpb; unsigned nfrags = uspi->s_fpb;
void *p; void *p;
...@@ -270,9 +267,7 @@ ufs_inode_getfrag(struct inode *inode, u64 fragment, ...@@ -270,9 +267,7 @@ ufs_inode_getfrag(struct inode *inode, u64 fragment,
goto ufs2; goto ufs2;
*/ */
block = ufs_fragstoblks (fragment); p = ufs_get_direct_data_ptr(uspi, ufsi, index);
blockoff = ufs_fragnum (fragment);
p = ufs_get_direct_data_ptr(uspi, ufsi, block);
tmp = ufs_data_ptr_to_cpu(sb, p); tmp = ufs_data_ptr_to_cpu(sb, p);
if (tmp) if (tmp)
goto out; goto out;
...@@ -284,13 +279,13 @@ ufs_inode_getfrag(struct inode *inode, u64 fragment, ...@@ -284,13 +279,13 @@ ufs_inode_getfrag(struct inode *inode, u64 fragment,
nfrags = (new_fragment & uspi->s_fpbmask) + 1; nfrags = (new_fragment & uspi->s_fpbmask) + 1;
goal = 0; goal = 0;
if (block) { if (index) {
goal = ufs_data_ptr_to_cpu(sb, goal = ufs_data_ptr_to_cpu(sb,
ufs_get_direct_data_ptr(uspi, ufsi, block - 1)); ufs_get_direct_data_ptr(uspi, ufsi, index - 1));
if (goal) if (goal)
goal += uspi->s_fpb; goal += uspi->s_fpb;
} }
tmp = ufs_new_fragments(inode, p, fragment - blockoff, tmp = ufs_new_fragments(inode, p, ufs_blknum(new_fragment),
goal, uspi->s_fpb, err, goal, uspi->s_fpb, err,
phys != NULL ? locked_page : NULL); phys != NULL ? locked_page : NULL);
...@@ -408,7 +403,7 @@ static int ufs_getfrag_block(struct inode *inode, sector_t fragment, struct buff ...@@ -408,7 +403,7 @@ static int ufs_getfrag_block(struct inode *inode, sector_t fragment, struct buff
int ret, err, new; int ret, err, new;
unsigned offsets[4]; unsigned offsets[4];
int depth = ufs_block_to_path(inode, fragment >> uspi->s_fpbshift, offsets); int depth = ufs_block_to_path(inode, fragment >> uspi->s_fpbshift, offsets);
unsigned long ptr,phys; unsigned long phys;
u64 phys64 = 0; u64 phys64 = 0;
unsigned frag = fragment & uspi->s_fpbmask; unsigned frag = fragment & uspi->s_fpbmask;
...@@ -446,38 +441,27 @@ static int ufs_getfrag_block(struct inode *inode, sector_t fragment, struct buff ...@@ -446,38 +441,27 @@ static int ufs_getfrag_block(struct inode *inode, sector_t fragment, struct buff
} }
} }
ptr = fragment;
if (depth == 1) { if (depth == 1) {
phys64 = ufs_inode_getfrag(inode, ptr, fragment, 1, &err, &phys, phys64 = ufs_inode_getfrag(inode, offsets[0], fragment,
&new, bh_result->b_page); &err, &phys, &new, bh_result->b_page);
if (phys64) { if (phys64) {
phys64 += frag; phys64 += frag;
phys = phys64; phys = phys64;
} }
goto out; goto out;
} }
ptr -= UFS_NDIR_FRAGMENT;
if (depth == 2) { if (depth == 2) {
phys64 = ufs_inode_getfrag(inode, phys64 = ufs_inode_getfrag(inode, offsets[0], fragment,
UFS_IND_FRAGMENT + (ptr >> uspi->s_apbshift), &err, NULL, NULL, bh_result->b_page);
fragment, uspi->s_fpb, &err, NULL, NULL,
bh_result->b_page);
goto get_indirect; goto get_indirect;
} }
ptr -= 1 << (uspi->s_apbshift + uspi->s_fpbshift);
if (depth == 3) { if (depth == 3) {
phys64 = ufs_inode_getfrag(inode, phys64 = ufs_inode_getfrag(inode, offsets[0], fragment,
UFS_DIND_FRAGMENT + (ptr >> uspi->s_2apbshift), &err, NULL, NULL, bh_result->b_page);
fragment, uspi->s_fpb, &err, NULL, NULL,
bh_result->b_page);
goto get_double; goto get_double;
} }
ptr -= 1 << (uspi->s_2apbshift + uspi->s_fpbshift); phys64 = ufs_inode_getfrag(inode, offsets[0], fragment,
phys64 = ufs_inode_getfrag(inode, &err, NULL, NULL, bh_result->b_page);
UFS_TIND_FRAGMENT + (ptr >> uspi->s_3apbshift),
fragment, uspi->s_fpb, &err, NULL, NULL,
bh_result->b_page);
phys64 = ufs_inode_getblock(inode, phys64, offsets[1], phys64 = ufs_inode_getblock(inode, phys64, offsets[1],
fragment, &err, NULL, NULL, NULL); fragment, &err, NULL, NULL, NULL);
get_double: get_double:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册