if (gfs2_assert_withdraw(sdp, gfs2_glock_is_held_excl(ip->i_gl)))
goto out;
- if (current->journal_info)
+ if (current_trans())
goto redirty;
return iomap_writepage(page, wbc, &wpc, &gfs2_writeback_ops);
if (gfs2_assert_withdraw(sdp, gfs2_glock_is_held_excl(ip->i_gl)))
goto out;
- if (PageChecked(page) || current->journal_info)
+ if (PageChecked(page) || current_trans())
goto out_ignore;
return __gfs2_jdata_writepage(page, wbc);
static int jdata_set_page_dirty(struct page *page)
{
- if (current->journal_info)
+ if (current_trans())
SetPageChecked(page);
return __set_page_dirty_buffers(page);
}
unsigned copied, struct page *page,
struct iomap *iomap)
{
- struct gfs2_trans *tr = current->journal_info;
+ struct gfs2_trans *tr = current_trans();
struct gfs2_inode *ip = GFS2_I(inode);
struct gfs2_sbd *sdp = GFS2_SB(inode);
}
}
- tr = current->journal_info;
+ tr = current_trans();
if (tr->tr_num_buf_new)
__mark_inode_dirty(inode, I_DIRTY_DATASYNC);
static int gfs2_block_zero_range(struct inode *inode, loff_t from,
unsigned int length)
{
- BUG_ON(current->journal_info);
+ BUG_ON(current_trans());
return iomap_zero_range(inode, from, length, NULL, &gfs2_iomap_ops);
}
truncate_pagecache(inode, oldsize - chunk);
oldsize -= chunk;
- tr = current->journal_info;
+ tr = current_trans();
if (!test_bit(TR_TOUCHED, &tr->tr_flags))
continue;
out:
brelse(dibh);
- if (current->journal_info)
+ if (current_trans())
gfs2_trans_end(sdp);
return error;
}
the rgrp. So we estimate. We know it can't be more than
the dinode's i_blocks and we don't want to exceed the
journal flush threshold, sd_log_thresh2. */
- if (current->journal_info == NULL) {
+ if (!current_trans()) {
unsigned int jblocks_rqsted, revokes;
jblocks_rqsted = rgd->rd_length + RES_DINODE +
down_write(&ip->i_rw_mutex);
}
/* check if we will exceed the transaction blocks requested */
- tr = current->journal_info;
+ tr = current_trans();
if (tr->tr_num_buf_new + RES_STATFS +
RES_QUOTA >= atomic_read(&sdp->sd_log_thresh2)) {
/* We set blks_outside_rgrp to ensure the loop will
if (!ret && blks_outside_rgrp) { /* If buffer still has non-zero blocks
outside the rgrp we just processed,
do it all over again. */
- if (current->journal_info) {
+ if (current_trans()) {
struct buffer_head *dibh;
ret = gfs2_meta_inode_buffer(ip, &dibh);
}
if (btotal) {
- if (current->journal_info == NULL) {
+ if (!current_trans()) {
ret = gfs2_trans_begin(sdp, RES_DINODE + RES_STATFS +
RES_QUOTA, 0);
if (ret)
out:
if (gfs2_holder_initialized(&rd_gh))
gfs2_glock_dq_uninit(&rd_gh);
- if (current->journal_info) {
+ if (current_trans()) {
up_write(&ip->i_rw_mutex);
gfs2_trans_end(sdp);
cond_resched();
offset += chunk;
length -= chunk;
- tr = current->journal_info;
+ tr = current_trans();
if (!test_bit(TR_TOUCHED, &tr->tr_flags))
continue;
}
if (gfs2_is_jdata(ip)) {
- BUG_ON(!current->journal_info);
+ BUG_ON(!current_trans());
gfs2_journaled_truncate_range(inode, offset, length);
} else
truncate_pagecache_range(inode, offset, offset + length - 1);
file_update_time(file);
mark_inode_dirty(inode);
- if (current->journal_info)
+ if (current_trans())
gfs2_trans_end(sdp);
if (!gfs2_is_stuffed(ip))
error = punch_hole(ip, offset, length);
out:
- if (current->journal_info)
+ if (current_trans())
gfs2_trans_end(sdp);
return error;
}
return GFS2_SB(&ip->i_inode)->sd_sb.sb_bsize - sizeof(struct gfs2_dinode);
}
+static inline struct gfs2_trans *current_trans(void)
+{
+ return current->journal_info;
+}
+
+static inline void set_current_trans(struct gfs2_trans *tr)
+{
+ current->journal_info = tr;
+}
+
#endif /* __INCORE_DOT_H__ */
{
int error;
- if (current->journal_info)
+ if (current_trans())
return __gfs2_setattr_simple(inode, attr);
error = gfs2_trans_begin(GFS2_SB(inode), RES_DINODE, 0);
ret = 0;
if (time_after(jiffies, flush_start + (HZ * 600))) {
fs_err(sdp, "Error: In %s for ten minutes! t=%d\n",
- __func__, current->journal_info ? 1 : 0);
+ __func__, current_trans() ? 1 : 0);
dump_ail_list(sdp);
goto out;
}
for (;;) {
if (time_after(jiffies, start + (HZ * 600))) {
fs_err(sdp, "Error: In %s for 10 minutes! t=%d\n",
- __func__, current->journal_info ? 1 : 0);
+ __func__, current_trans() ? 1 : 0);
dump_ail_list(sdp);
return;
}
{
struct gfs2_bufdata *bd;
- BUG_ON(!current->journal_info);
+ BUG_ON(!current_trans());
clear_buffer_dirty(bh);
if (test_set_buffer_pinned(bh))
bh = *bhp;
wait_on_buffer(bh);
if (unlikely(!buffer_uptodate(bh))) {
- struct gfs2_trans *tr = current->journal_info;
+ struct gfs2_trans *tr = current_trans();
if (tr && test_bit(TR_TOUCHED, &tr->tr_flags))
gfs2_io_error_bh_wd(sdp, bh);
brelse(bh);
wait_on_buffer(bh);
if (!buffer_uptodate(bh)) {
- struct gfs2_trans *tr = current->journal_info;
+ struct gfs2_trans *tr = current_trans();
if (tr && test_bit(TR_TOUCHED, &tr->tr_flags))
gfs2_io_error_bh_wd(sdp, bh);
return -EIO;
struct address_space *mapping = bh->b_page->mapping;
struct gfs2_sbd *sdp = gfs2_mapping2sbd(mapping);
struct gfs2_bufdata *bd = bh->b_private;
- struct gfs2_trans *tr = current->journal_info;
+ struct gfs2_trans *tr = current_trans();
int was_pinned = 0;
if (test_clear_buffer_pinned(bh)) {
} else if (WARN_ON_ONCE(ip->i_gl->gl_state != LM_ST_EXCLUSIVE))
return;
- if (current->journal_info == NULL) {
+ if (!current_trans()) {
ret = gfs2_trans_begin(sdp, RES_DINODE, 0);
if (ret) {
fs_err(sdp, "dirty_inode: gfs2_trans_begin %d\n", ret);
{
unsigned int extra_revokes;
- if (current->journal_info) {
- gfs2_print_trans(sdp, current->journal_info);
+ if (current_trans()) {
+ gfs2_print_trans(sdp, current_trans());
BUG();
}
BUG_ON(blocks == 0 && revokes == 0);
return -EROFS;
}
- current->journal_info = tr;
+ set_current_trans(tr);
return 0;
}
void gfs2_trans_end(struct gfs2_sbd *sdp)
{
- struct gfs2_trans *tr = current->journal_info;
+ struct gfs2_trans *tr = current_trans();
s64 nbuf;
- current->journal_info = NULL;
+ set_current_trans(NULL);
if (!test_bit(TR_TOUCHED, &tr->tr_flags)) {
gfs2_log_release_revokes(sdp, tr->tr_revokes);
*/
void gfs2_trans_add_data(struct gfs2_glock *gl, struct buffer_head *bh)
{
- struct gfs2_trans *tr = current->journal_info;
+ struct gfs2_trans *tr = current_trans();
struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
struct gfs2_bufdata *bd;
struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
struct gfs2_bufdata *bd;
struct gfs2_meta_header *mh;
- struct gfs2_trans *tr = current->journal_info;
+ struct gfs2_trans *tr = current_trans();
enum gfs2_freeze_state state = atomic_read(&sdp->sd_freeze_state);
lock_buffer(bh);
void gfs2_trans_add_revoke(struct gfs2_sbd *sdp, struct gfs2_bufdata *bd)
{
- struct gfs2_trans *tr = current->journal_info;
+ struct gfs2_trans *tr = current_trans();
BUG_ON(!list_empty(&bd->bd_list));
gfs2_add_revoke(sdp, bd);