Commit bf36a713 authored by Steven Whitehouse's avatar Steven Whitehouse
Browse files

[GFS2] Add gfs2_is_writeback()



This adds a function "gfs2_is_writeback()" along the lines of the
existing "gfs2_is_jdata()" in order to clean up the code and make
the various tests for the inode mode more obvious. It also fixes
the PageChecked() logic where we were resetting the flag too early
in the case of an error path.
Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
parent e7e36f14
...@@ -59,7 +59,6 @@ struct strip_mine { ...@@ -59,7 +59,6 @@ struct strip_mine {
static int gfs2_unstuffer_page(struct gfs2_inode *ip, struct buffer_head *dibh, static int gfs2_unstuffer_page(struct gfs2_inode *ip, struct buffer_head *dibh,
u64 block, struct page *page) u64 block, struct page *page)
{ {
struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
struct inode *inode = &ip->i_inode; struct inode *inode = &ip->i_inode;
struct buffer_head *bh; struct buffer_head *bh;
int release = 0; int release = 0;
...@@ -95,7 +94,7 @@ static int gfs2_unstuffer_page(struct gfs2_inode *ip, struct buffer_head *dibh, ...@@ -95,7 +94,7 @@ static int gfs2_unstuffer_page(struct gfs2_inode *ip, struct buffer_head *dibh,
set_buffer_uptodate(bh); set_buffer_uptodate(bh);
if (!gfs2_is_jdata(ip)) if (!gfs2_is_jdata(ip))
mark_buffer_dirty(bh); mark_buffer_dirty(bh);
if (sdp->sd_args.ar_data == GFS2_DATA_ORDERED || gfs2_is_jdata(ip)) if (!gfs2_is_writeback(ip))
gfs2_trans_add_bh(ip->i_gl, bh, 0); gfs2_trans_add_bh(ip->i_gl, bh, 0);
if (release) { if (release) {
...@@ -879,7 +878,6 @@ static int gfs2_block_truncate_page(struct address_space *mapping) ...@@ -879,7 +878,6 @@ static int gfs2_block_truncate_page(struct address_space *mapping)
{ {
struct inode *inode = mapping->host; struct inode *inode = mapping->host;
struct gfs2_inode *ip = GFS2_I(inode); struct gfs2_inode *ip = GFS2_I(inode);
struct gfs2_sbd *sdp = GFS2_SB(inode);
loff_t from = inode->i_size; loff_t from = inode->i_size;
unsigned long index = from >> PAGE_CACHE_SHIFT; unsigned long index = from >> PAGE_CACHE_SHIFT;
unsigned offset = from & (PAGE_CACHE_SIZE-1); unsigned offset = from & (PAGE_CACHE_SIZE-1);
...@@ -931,7 +929,7 @@ static int gfs2_block_truncate_page(struct address_space *mapping) ...@@ -931,7 +929,7 @@ static int gfs2_block_truncate_page(struct address_space *mapping)
err = 0; err = 0;
} }
if (sdp->sd_args.ar_data == GFS2_DATA_ORDERED || gfs2_is_jdata(ip)) if (!gfs2_is_writeback(ip))
gfs2_trans_add_bh(ip->i_gl, bh, 0); gfs2_trans_add_bh(ip->i_gl, bh, 0);
zero_user_page(page, offset, length, KM_USER0); zero_user_page(page, offset, length, KM_USER0);
......
...@@ -285,7 +285,7 @@ static inline struct gfs2_inode *GFS2_I(struct inode *inode) ...@@ -285,7 +285,7 @@ static inline struct gfs2_inode *GFS2_I(struct inode *inode)
return container_of(inode, struct gfs2_inode, i_inode); return container_of(inode, struct gfs2_inode, i_inode);
} }
static inline struct gfs2_sbd *GFS2_SB(struct inode *inode) static inline struct gfs2_sbd *GFS2_SB(const struct inode *inode)
{ {
return inode->i_sb->s_fs_info; return inode->i_sb->s_fs_info;
} }
......
...@@ -20,6 +20,12 @@ static inline int gfs2_is_jdata(const struct gfs2_inode *ip) ...@@ -20,6 +20,12 @@ static inline int gfs2_is_jdata(const struct gfs2_inode *ip)
return ip->i_di.di_flags & GFS2_DIF_JDATA; return ip->i_di.di_flags & GFS2_DIF_JDATA;
} }
static inline int gfs2_is_writeback(const struct gfs2_inode *ip)
{
const struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
return (sdp->sd_args.ar_data == GFS2_DATA_WRITEBACK) && !gfs2_is_jdata(ip);
}
static inline int gfs2_is_dir(const struct gfs2_inode *ip) static inline int gfs2_is_dir(const struct gfs2_inode *ip)
{ {
return S_ISDIR(ip->i_inode.i_mode); return S_ISDIR(ip->i_inode.i_mode);
......
...@@ -138,12 +138,11 @@ static int gfs2_writepage(struct page *page, struct writeback_control *wbc) ...@@ -138,12 +138,11 @@ static int gfs2_writepage(struct page *page, struct writeback_control *wbc)
return 0; /* don't care */ return 0; /* don't care */
} }
if ((sdp->sd_args.ar_data == GFS2_DATA_ORDERED || gfs2_is_jdata(ip)) && if (PageChecked(page)) {
PageChecked(page)) {
ClearPageChecked(page);
error = gfs2_trans_begin(sdp, RES_DINODE + 1, 0); error = gfs2_trans_begin(sdp, RES_DINODE + 1, 0);
if (error) if (error)
goto out_ignore; goto out_ignore;
ClearPageChecked(page);
if (!page_has_buffers(page)) { if (!page_has_buffers(page)) {
create_empty_buffers(page, inode->i_sb->s_blocksize, create_empty_buffers(page, inode->i_sb->s_blocksize,
(1 << BH_Dirty)|(1 << BH_Uptodate)); (1 << BH_Dirty)|(1 << BH_Uptodate));
...@@ -180,9 +179,8 @@ static int gfs2_writepages(struct address_space *mapping, ...@@ -180,9 +179,8 @@ static int gfs2_writepages(struct address_space *mapping,
{ {
struct inode *inode = mapping->host; struct inode *inode = mapping->host;
struct gfs2_inode *ip = GFS2_I(inode); struct gfs2_inode *ip = GFS2_I(inode);
struct gfs2_sbd *sdp = GFS2_SB(inode);
if (sdp->sd_args.ar_data == GFS2_DATA_WRITEBACK && !gfs2_is_jdata(ip)) if (gfs2_is_writeback(ip))
return mpage_writepages(mapping, wbc, gfs2_get_block_noalloc); return mpage_writepages(mapping, wbc, gfs2_get_block_noalloc);
return generic_writepages(mapping, wbc); return generic_writepages(mapping, wbc);
...@@ -606,7 +604,7 @@ static int gfs2_write_end(struct file *file, struct address_space *mapping, ...@@ -606,7 +604,7 @@ static int gfs2_write_end(struct file *file, struct address_space *mapping,
if (gfs2_is_stuffed(ip)) if (gfs2_is_stuffed(ip))
return gfs2_stuffed_write_end(inode, dibh, pos, len, copied, page); return gfs2_stuffed_write_end(inode, dibh, pos, len, copied, page);
if (sdp->sd_args.ar_data == GFS2_DATA_ORDERED || gfs2_is_jdata(ip)) if (!gfs2_is_writeback(ip))
gfs2_page_add_databufs(ip, page, from, to); gfs2_page_add_databufs(ip, page, from, to);
ret = generic_write_end(file, mapping, pos, len, copied, page, fsdata); ret = generic_write_end(file, mapping, pos, len, copied, page, fsdata);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment