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:
Steven Whitehouse 2011-07-26 09:17:28 +01:00
parent fd11e153b8
commit 4c28d33803

View file

@ -240,16 +240,15 @@ static int gfs2_dir_write_data(struct gfs2_inode *ip, const char *buf,
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);