GFS2: Clean up dir hash table reading
Since there is now only a single caller to gfs2_dir_read_data() and it has a number of constant arguments, we can factor those out. Also some tests relating to the inode size were being done twice. Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
This commit is contained in:
parent
fd11e153b8
commit
4c28d33803
|
@ -240,16 +240,15 @@ fail:
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int gfs2_dir_read_stuffed(struct gfs2_inode *ip, char *buf,
|
static int gfs2_dir_read_stuffed(struct gfs2_inode *ip, __be64 *buf,
|
||||||
u64 offset, unsigned int size)
|
unsigned int size)
|
||||||
{
|
{
|
||||||
struct buffer_head *dibh;
|
struct buffer_head *dibh;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
error = gfs2_meta_inode_buffer(ip, &dibh);
|
error = gfs2_meta_inode_buffer(ip, &dibh);
|
||||||
if (!error) {
|
if (!error) {
|
||||||
offset += sizeof(struct gfs2_dinode);
|
memcpy(buf, dibh->b_data + sizeof(struct gfs2_dinode), size);
|
||||||
memcpy(buf, dibh->b_data + offset, size);
|
|
||||||
brelse(dibh);
|
brelse(dibh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -261,13 +260,12 @@ static int gfs2_dir_read_stuffed(struct gfs2_inode *ip, char *buf,
|
||||||
* gfs2_dir_read_data - Read a data from a directory inode
|
* gfs2_dir_read_data - Read a data from a directory inode
|
||||||
* @ip: The GFS2 Inode
|
* @ip: The GFS2 Inode
|
||||||
* @buf: The buffer to place result into
|
* @buf: The buffer to place result into
|
||||||
* @offset: File offset to begin jdata_readng from
|
|
||||||
* @size: Amount of data to transfer
|
* @size: Amount of data to transfer
|
||||||
*
|
*
|
||||||
* Returns: The amount of data actually copied or the error
|
* Returns: The amount of data actually copied or the error
|
||||||
*/
|
*/
|
||||||
static int gfs2_dir_read_data(struct gfs2_inode *ip, char *buf, u64 offset,
|
static int gfs2_dir_read_data(struct gfs2_inode *ip, __be64 *buf,
|
||||||
unsigned int size, unsigned ra)
|
unsigned int size)
|
||||||
{
|
{
|
||||||
struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
|
struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
|
||||||
u64 lblock, dblock;
|
u64 lblock, dblock;
|
||||||
|
@ -275,24 +273,14 @@ static int gfs2_dir_read_data(struct gfs2_inode *ip, char *buf, u64 offset,
|
||||||
unsigned int o;
|
unsigned int o;
|
||||||
int copied = 0;
|
int copied = 0;
|
||||||
int error = 0;
|
int error = 0;
|
||||||
u64 disksize = i_size_read(&ip->i_inode);
|
|
||||||
|
|
||||||
if (offset >= disksize)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (offset + size > disksize)
|
|
||||||
size = disksize - offset;
|
|
||||||
|
|
||||||
if (!size)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (gfs2_is_stuffed(ip))
|
if (gfs2_is_stuffed(ip))
|
||||||
return gfs2_dir_read_stuffed(ip, buf, offset, size);
|
return gfs2_dir_read_stuffed(ip, buf, size);
|
||||||
|
|
||||||
if (gfs2_assert_warn(sdp, gfs2_is_jdata(ip)))
|
if (gfs2_assert_warn(sdp, gfs2_is_jdata(ip)))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
lblock = offset;
|
lblock = 0;
|
||||||
o = do_div(lblock, sdp->sd_jbsize) + sizeof(struct gfs2_meta_header);
|
o = do_div(lblock, sdp->sd_jbsize) + sizeof(struct gfs2_meta_header);
|
||||||
|
|
||||||
while (copied < size) {
|
while (copied < size) {
|
||||||
|
@ -311,8 +299,6 @@ static int gfs2_dir_read_data(struct gfs2_inode *ip, char *buf, u64 offset,
|
||||||
if (error || !dblock)
|
if (error || !dblock)
|
||||||
goto fail;
|
goto fail;
|
||||||
BUG_ON(extlen < 1);
|
BUG_ON(extlen < 1);
|
||||||
if (!ra)
|
|
||||||
extlen = 1;
|
|
||||||
bh = gfs2_meta_ra(ip->i_gl, dblock, extlen);
|
bh = gfs2_meta_ra(ip->i_gl, dblock, extlen);
|
||||||
} else {
|
} else {
|
||||||
error = gfs2_meta_read(ip->i_gl, dblock, DIO_WAIT, &bh);
|
error = gfs2_meta_read(ip->i_gl, dblock, DIO_WAIT, &bh);
|
||||||
|
@ -328,7 +314,7 @@ static int gfs2_dir_read_data(struct gfs2_inode *ip, char *buf, u64 offset,
|
||||||
extlen--;
|
extlen--;
|
||||||
memcpy(buf, bh->b_data + o, amount);
|
memcpy(buf, bh->b_data + o, amount);
|
||||||
brelse(bh);
|
brelse(bh);
|
||||||
buf += amount;
|
buf += (amount/sizeof(__be64));
|
||||||
copied += amount;
|
copied += amount;
|
||||||
lblock++;
|
lblock++;
|
||||||
o = sizeof(struct gfs2_meta_header);
|
o = sizeof(struct gfs2_meta_header);
|
||||||
|
@ -371,7 +357,7 @@ static __be64 *gfs2_dir_get_hash_table(struct gfs2_inode *ip)
|
||||||
if (hc == NULL)
|
if (hc == NULL)
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
ret = gfs2_dir_read_data(ip, (char *)hc, 0, hsize, 1);
|
ret = gfs2_dir_read_data(ip, hc, hsize);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
kfree(hc);
|
kfree(hc);
|
||||||
return ERR_PTR(ret);
|
return ERR_PTR(ret);
|
||||||
|
|
Loading…
Reference in New Issue