Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 38763
b: refs/heads/master
c: f25ef0c
h: refs/heads/master
i:
  38761: 2bbbb0d
  38759: a449d4f
v: v3
  • Loading branch information
Steven Whitehouse committed Jul 26, 2006
1 parent b499188 commit 3bc8c24
Show file tree
Hide file tree
Showing 8 changed files with 67 additions and 78 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 81456807a33c2122e2f1f92acfbaaa77b3d06c3c
refs/heads/master: f25ef0c1b4e032b2641857ac4cff3315c6eb90e3
67 changes: 62 additions & 5 deletions trunk/fs/gfs2/bmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,65 @@ struct strip_mine {
unsigned int sm_height;
};

/**
* gfs2_unstuffer_page - unstuff a stuffed inode into a block cached by a page
* @ip: the inode
* @dibh: the dinode buffer
* @block: the block number that was allocated
* @private: any locked page held by the caller process
*
* Returns: errno
*/

static int gfs2_unstuffer_page(struct gfs2_inode *ip, struct buffer_head *dibh,
uint64_t block, struct page *page)
{
struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
struct inode *inode = &ip->i_inode;
struct buffer_head *bh;
int release = 0;

if (!page || page->index) {
page = grab_cache_page(inode->i_mapping, 0);
if (!page)
return -ENOMEM;
release = 1;
}

if (!PageUptodate(page)) {
void *kaddr = kmap(page);

memcpy(kaddr, dibh->b_data + sizeof(struct gfs2_dinode),
ip->i_di.di_size);
memset(kaddr + ip->i_di.di_size, 0,
PAGE_CACHE_SIZE - ip->i_di.di_size);
kunmap(page);

SetPageUptodate(page);
}

if (!page_has_buffers(page))
create_empty_buffers(page, 1 << inode->i_blkbits,
(1 << BH_Uptodate));

bh = page_buffers(page);

if (!buffer_mapped(bh))
map_bh(bh, inode->i_sb, block);

set_buffer_uptodate(bh);
if ((sdp->sd_args.ar_data == GFS2_DATA_ORDERED) || gfs2_is_jdata(ip))
gfs2_trans_add_bh(ip->i_gl, bh, 0);
mark_buffer_dirty(bh);

if (release) {
unlock_page(page);
page_cache_release(page);
}

return 0;
}

/**
* gfs2_unstuff_dinode - Unstuff a dinode when the data has grown too big
* @ip: The GFS2 inode to unstuff
Expand All @@ -59,8 +118,7 @@ struct strip_mine {
* Returns: errno
*/

int gfs2_unstuff_dinode(struct gfs2_inode *ip, gfs2_unstuffer_t unstuffer,
void *private)
int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page)
{
struct buffer_head *bh, *dibh;
uint64_t block = 0;
Expand Down Expand Up @@ -90,7 +148,7 @@ int gfs2_unstuff_dinode(struct gfs2_inode *ip, gfs2_unstuffer_t unstuffer,
} else {
block = gfs2_alloc_data(ip);

error = unstuffer(ip, dibh, block, private);
error = gfs2_unstuffer_page(ip, dibh, block, page);
if (error)
goto out_brelse;
}
Expand Down Expand Up @@ -786,8 +844,7 @@ static int do_grow(struct gfs2_inode *ip, uint64_t size)

if (size > sdp->sd_sb.sb_bsize - sizeof(struct gfs2_dinode)) {
if (gfs2_is_stuffed(ip)) {
error = gfs2_unstuff_dinode(ip, gfs2_unstuffer_page,
NULL);
error = gfs2_unstuff_dinode(ip, NULL);
if (error)
goto out_end_trans;
}
Expand Down
7 changes: 1 addition & 6 deletions trunk/fs/gfs2/bmap.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,7 @@
#ifndef __BMAP_DOT_H__
#define __BMAP_DOT_H__

typedef int (*gfs2_unstuffer_t) (struct gfs2_inode * ip,
struct buffer_head * dibh, uint64_t block,
void *private);
int gfs2_unstuff_dinode(struct gfs2_inode *ip, gfs2_unstuffer_t unstuffer,
void *private);

int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page);
int gfs2_block_map(struct inode *inode, u64 lblock, int *new, u64 *dblock, int *boundary);
int gfs2_extent_map(struct inode *inode, u64 lblock, int *new, u64 *dblock, unsigned *extlen);

Expand Down
2 changes: 1 addition & 1 deletion trunk/fs/gfs2/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ static int gfs2_dir_write_data(struct gfs2_inode *ip, const char *buf,
return -EINVAL;

if (gfs2_is_stuffed(ip)) {
error = gfs2_unstuff_dinode(ip, NULL, NULL);
error = gfs2_unstuff_dinode(ip, NULL);
if (error)
return error;
}
Expand Down
3 changes: 1 addition & 2 deletions trunk/fs/gfs2/ops_address.c
Original file line number Diff line number Diff line change
Expand Up @@ -395,8 +395,7 @@ static int gfs2_prepare_write(struct file *file, struct page *page,

if (gfs2_is_stuffed(ip)) {
if (end > sdp->sd_sb.sb_bsize - sizeof(struct gfs2_dinode)) {
error = gfs2_unstuff_dinode(ip, gfs2_unstuffer_page,
page);
error = gfs2_unstuff_dinode(ip, page);
if (error == 0)
goto prepare_write;
} else if (!PageUptodate(page))
Expand Down
2 changes: 1 addition & 1 deletion trunk/fs/gfs2/ops_vm.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ static int alloc_page_backing(struct gfs2_inode *ip, struct page *page)
goto out_ipres;

if (gfs2_is_stuffed(ip)) {
error = gfs2_unstuff_dinode(ip, gfs2_unstuffer_page, NULL);
error = gfs2_unstuff_dinode(ip, NULL);
if (error)
goto out_trans;
}
Expand Down
60 changes: 0 additions & 60 deletions trunk/fs/gfs2/page.c
Original file line number Diff line number Diff line change
Expand Up @@ -113,66 +113,6 @@ void gfs2_page_sync(struct gfs2_glock *gl, int flags)

}

/**
* gfs2_unstuffer_page - unstuff a stuffed inode into a block cached by a page
* @ip: the inode
* @dibh: the dinode buffer
* @block: the block number that was allocated
* @private: any locked page held by the caller process
*
* Returns: errno
*/

int gfs2_unstuffer_page(struct gfs2_inode *ip, struct buffer_head *dibh,
uint64_t block, void *private)
{
struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
struct inode *inode = &ip->i_inode;
struct page *page = (struct page *)private;
struct buffer_head *bh;
int release = 0;

if (!page || page->index) {
page = grab_cache_page(inode->i_mapping, 0);
if (!page)
return -ENOMEM;
release = 1;
}

if (!PageUptodate(page)) {
void *kaddr = kmap(page);

memcpy(kaddr, dibh->b_data + sizeof(struct gfs2_dinode),
ip->i_di.di_size);
memset(kaddr + ip->i_di.di_size, 0,
PAGE_CACHE_SIZE - ip->i_di.di_size);
kunmap(page);

SetPageUptodate(page);
}

if (!page_has_buffers(page))
create_empty_buffers(page, 1 << inode->i_blkbits,
(1 << BH_Uptodate));

bh = page_buffers(page);

if (!buffer_mapped(bh))
map_bh(bh, inode->i_sb, block);

set_buffer_uptodate(bh);
if ((sdp->sd_args.ar_data == GFS2_DATA_ORDERED) || gfs2_is_jdata(ip))
gfs2_trans_add_bh(ip->i_gl, bh, 0);
mark_buffer_dirty(bh);

if (release) {
unlock_page(page);
page_cache_release(page);
}

return 0;
}

/**
* gfs2_block_truncate_page - Deal with zeroing out data for truncate
*
Expand Down
2 changes: 0 additions & 2 deletions trunk/fs/gfs2/page.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ void gfs2_pte_inval(struct gfs2_glock *gl);
void gfs2_page_inval(struct gfs2_glock *gl);
void gfs2_page_sync(struct gfs2_glock *gl, int flags);

int gfs2_unstuffer_page(struct gfs2_inode *ip, struct buffer_head *dibh,
uint64_t block, void *private);
int gfs2_block_truncate_page(struct address_space *mapping);
void gfs2_page_add_databufs(struct gfs2_inode *ip, struct page *page,
unsigned int from, unsigned int to);
Expand Down

0 comments on commit 3bc8c24

Please sign in to comment.