Changes in gfs2:
- Fix some corner cases on filesystems with a block size < page size. - Fix a corner case that could expose incorrect access times over nfs. - Revert an otherwise sensible revoke accounting cleanup that causes assertion failures. The revoke accounting is whacky and needs to be fixed properly before we can add back this cleanup. - Various other minor cleanups. -----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJeNEWRAAoJENW/n+sDE2U6EBIP/1OMCdASk1ykAzhoO3UsI8Fa 9ktBZ7/tnmixHvPbAkPi+FLXFqfAOXRnY8tcWKdpJ5Mdesfhdm9HbSr8BtRf8l9r LqdQvd4F2lVemtpPIiU8MojSpmoJXs6shZvIxrLzUS5JaDVUxmoLc066otdTFya8 FASuOzPxpCE6Rfdk+f+tBYF+UsBXY8w3w/hOiITKcLkqbCO8xnMuJzspPSs64qDN LtYJqJLe7THan2wEW20gtqpkZDX+WWYuBhdTWqZYs1Rfg17/ohcBYSB2kuvonLlq C4P/aS56U4stD+BefvI11iMnKlv6QQ+4KD1A7QWayvIPv9Lu1kvb/L7F/gamlUMM 5LPI/3J0GSgK1fh3nDULYUXGvJqqBp2klabNAOCRA7lhZUBjU/wGTTDll6OM+K2O 0K6HgyVp92xAyWhi/0LVRb3cA7xru5kZK+vzzdloTweCuPFMiF3IlYI4MMr3I1V1 +/4DvpzqMjHx6t9sXb2oDjnvljedB4n3fH9YCVpl6wD/PnJ60gXm4tonrfLzkSII axfc5bEXaKXp43PuH9wbHsuNeOEGvEY7PG+FYbH5cV2BNGWviXYEGrNHop4gOQp9 2bDZQJGEYvrvnjGe82ne7gmtDwRjp3+ovx/EBNp72G4mMb4igDnAAuSd0uzumatM 9zGAa5+le4ZlpjNrJbWO =oo06 -----END PGP SIGNATURE----- Merge tag 'gfs2-for-5.6' of git://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2 Pull gfs2 updates from Andreas Gruenbacher: - Fix some corner cases on filesystems with a block size < page size. - Fix a corner case that could expose incorrect access times over nfs. - Revert an otherwise sensible revoke accounting cleanup that causes assertion failures. The revoke accounting is whacky and needs to be fixed properly before we can add back this cleanup. - Various other minor cleanups. In addition, please expect to see another pull request from Bob Peterson about his gfs2 recovery patch queue shortly. * tag 'gfs2-for-5.6' of git://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2: Revert "gfs2: eliminate tr_num_revoke_rm" gfs2: remove unused LBIT macros fs/gfs2: remove unused IS_DINODE and IS_LEAF macros gfs2: Remove GFS2_MIN_LVB_SIZE define gfs2: Fix incorrect variable name gfs2: Avoid access time thrashing in gfs2_inode_lookup gfs2: minor cleanup: remove unneeded variable ret in gfs2_jdata_writepage gfs2: eliminate ssize parameter from gfs2_struct2blk gfs2: Another gfs2_find_jhead fix
This commit is contained in:
commit
a62aa6f7f5
|
@ -183,14 +183,12 @@ static int gfs2_jdata_writepage(struct page *page, struct writeback_control *wbc
|
|||
struct inode *inode = page->mapping->host;
|
||||
struct gfs2_inode *ip = GFS2_I(inode);
|
||||
struct gfs2_sbd *sdp = GFS2_SB(inode);
|
||||
int ret;
|
||||
|
||||
if (gfs2_assert_withdraw(sdp, gfs2_glock_is_held_excl(ip->i_gl)))
|
||||
goto out;
|
||||
if (PageChecked(page) || current->journal_info)
|
||||
goto out_ignore;
|
||||
ret = __gfs2_jdata_writepage(page, wbc);
|
||||
return ret;
|
||||
return __gfs2_jdata_writepage(page, wbc);
|
||||
|
||||
out_ignore:
|
||||
redirty_page_for_writepage(wbc, page);
|
||||
|
|
|
@ -73,9 +73,6 @@
|
|||
#include "bmap.h"
|
||||
#include "util.h"
|
||||
|
||||
#define IS_LEAF 1 /* Hashed (leaf) directory */
|
||||
#define IS_DINODE 2 /* Linear (stuffed dinode block) directory */
|
||||
|
||||
#define MAX_RA_BLOCKS 32 /* max read-ahead blocks */
|
||||
|
||||
#define gfs2_disk_hash2offset(h) (((u64)(h)) >> 1)
|
||||
|
|
|
@ -826,7 +826,7 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
|
|||
memset(&gl->gl_lksb, 0, sizeof(struct dlm_lksb));
|
||||
|
||||
if (glops->go_flags & GLOF_LVB) {
|
||||
gl->gl_lksb.sb_lvbptr = kzalloc(GFS2_MIN_LVB_SIZE, GFP_NOFS);
|
||||
gl->gl_lksb.sb_lvbptr = kzalloc(GDLM_LVB_SIZE, GFP_NOFS);
|
||||
if (!gl->gl_lksb.sb_lvbptr) {
|
||||
kmem_cache_free(cachep, gl);
|
||||
return -ENOMEM;
|
||||
|
|
|
@ -95,7 +95,7 @@ static void gfs2_ail_empty_gl(struct gfs2_glock *gl)
|
|||
/* A shortened, inline version of gfs2_trans_begin()
|
||||
* tr->alloced is not set since the transaction structure is
|
||||
* on the stack */
|
||||
tr.tr_reserved = 1 + gfs2_struct2blk(sdp, tr.tr_revokes, sizeof(u64));
|
||||
tr.tr_reserved = 1 + gfs2_struct2blk(sdp, tr.tr_revokes);
|
||||
tr.tr_ip = _RET_IP_;
|
||||
if (gfs2_log_reserve(sdp, tr.tr_reserved) < 0)
|
||||
return;
|
||||
|
|
|
@ -387,8 +387,6 @@ struct gfs2_glock {
|
|||
struct rhash_head gl_node;
|
||||
};
|
||||
|
||||
#define GFS2_MIN_LVB_SIZE 32 /* Min size of LVB that gfs2 supports */
|
||||
|
||||
enum {
|
||||
GIF_INVALID = 0,
|
||||
GIF_QD_LOCKED = 1,
|
||||
|
@ -505,6 +503,7 @@ struct gfs2_trans {
|
|||
unsigned int tr_num_buf_rm;
|
||||
unsigned int tr_num_databuf_rm;
|
||||
unsigned int tr_num_revoke;
|
||||
unsigned int tr_num_revoke_rm;
|
||||
|
||||
struct list_head tr_list;
|
||||
struct list_head tr_databuf;
|
||||
|
@ -703,6 +702,7 @@ struct gfs2_sbd {
|
|||
u32 sd_fsb2bb_shift;
|
||||
u32 sd_diptrs; /* Number of pointers in a dinode */
|
||||
u32 sd_inptrs; /* Number of pointers in a indirect block */
|
||||
u32 sd_ldptrs; /* Number of pointers in a log descriptor block */
|
||||
u32 sd_jbsize; /* Size of a journaled data block */
|
||||
u32 sd_hash_bsize; /* sizeof(exhash block) */
|
||||
u32 sd_hash_bsize_shift;
|
||||
|
@ -803,7 +803,7 @@ struct gfs2_sbd {
|
|||
|
||||
struct gfs2_trans *sd_log_tr;
|
||||
unsigned int sd_log_blks_reserved;
|
||||
int sd_log_commited_revoke;
|
||||
int sd_log_committed_revoke;
|
||||
|
||||
atomic_t sd_log_pinned;
|
||||
unsigned int sd_log_num_revoke;
|
||||
|
|
|
@ -136,7 +136,6 @@ struct inode *gfs2_inode_lookup(struct super_block *sb, unsigned int type,
|
|||
|
||||
if (inode->i_state & I_NEW) {
|
||||
struct gfs2_sbd *sdp = GFS2_SB(inode);
|
||||
ip->i_no_formal_ino = no_formal_ino;
|
||||
|
||||
error = gfs2_glock_get(sdp, no_addr, &gfs2_inode_glops, CREATE, &ip->i_gl);
|
||||
if (unlikely(error))
|
||||
|
@ -175,21 +174,22 @@ struct inode *gfs2_inode_lookup(struct super_block *sb, unsigned int type,
|
|||
gfs2_glock_put(io_gl);
|
||||
io_gl = NULL;
|
||||
|
||||
/* Lowest possible timestamp; will be overwritten in gfs2_dinode_in. */
|
||||
inode->i_atime.tv_sec = 1LL << (8 * sizeof(inode->i_atime.tv_sec) - 1);
|
||||
inode->i_atime.tv_nsec = 0;
|
||||
|
||||
if (type == DT_UNKNOWN) {
|
||||
/* Inode glock must be locked already */
|
||||
error = gfs2_inode_refresh(GFS2_I(inode));
|
||||
if (error)
|
||||
goto fail_refresh;
|
||||
} else {
|
||||
ip->i_no_formal_ino = no_formal_ino;
|
||||
inode->i_mode = DT2IF(type);
|
||||
}
|
||||
|
||||
gfs2_set_iop(inode);
|
||||
|
||||
/* Lowest possible timestamp; will be overwritten in gfs2_dinode_in. */
|
||||
inode->i_atime.tv_sec = 1LL << (8 * sizeof(inode->i_atime.tv_sec) - 1);
|
||||
inode->i_atime.tv_nsec = 0;
|
||||
|
||||
unlock_new_inode(inode);
|
||||
}
|
||||
|
||||
|
|
|
@ -37,7 +37,6 @@ static void gfs2_log_shutdown(struct gfs2_sbd *sdp);
|
|||
* gfs2_struct2blk - compute stuff
|
||||
* @sdp: the filesystem
|
||||
* @nstruct: the number of structures
|
||||
* @ssize: the size of the structures
|
||||
*
|
||||
* Compute the number of log descriptor blocks needed to hold a certain number
|
||||
* of structures of a certain size.
|
||||
|
@ -45,18 +44,16 @@ static void gfs2_log_shutdown(struct gfs2_sbd *sdp);
|
|||
* Returns: the number of blocks needed (minimum is always 1)
|
||||
*/
|
||||
|
||||
unsigned int gfs2_struct2blk(struct gfs2_sbd *sdp, unsigned int nstruct,
|
||||
unsigned int ssize)
|
||||
unsigned int gfs2_struct2blk(struct gfs2_sbd *sdp, unsigned int nstruct)
|
||||
{
|
||||
unsigned int blks;
|
||||
unsigned int first, second;
|
||||
|
||||
blks = 1;
|
||||
first = (sdp->sd_sb.sb_bsize - sizeof(struct gfs2_log_descriptor)) / ssize;
|
||||
first = sdp->sd_ldptrs;
|
||||
|
||||
if (nstruct > first) {
|
||||
second = (sdp->sd_sb.sb_bsize -
|
||||
sizeof(struct gfs2_meta_header)) / ssize;
|
||||
second = sdp->sd_inptrs;
|
||||
blks += DIV_ROUND_UP(nstruct - first, second);
|
||||
}
|
||||
|
||||
|
@ -472,9 +469,8 @@ static unsigned int calc_reserved(struct gfs2_sbd *sdp)
|
|||
reserved += DIV_ROUND_UP(dbuf, databuf_limit(sdp));
|
||||
}
|
||||
|
||||
if (sdp->sd_log_commited_revoke > 0)
|
||||
reserved += gfs2_struct2blk(sdp, sdp->sd_log_commited_revoke,
|
||||
sizeof(u64));
|
||||
if (sdp->sd_log_committed_revoke > 0)
|
||||
reserved += gfs2_struct2blk(sdp, sdp->sd_log_committed_revoke);
|
||||
/* One for the overall header */
|
||||
if (reserved)
|
||||
reserved++;
|
||||
|
@ -829,7 +825,7 @@ void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl, u32 flags)
|
|||
if (unlikely(state == SFS_FROZEN))
|
||||
gfs2_assert_withdraw(sdp, !sdp->sd_log_num_revoke);
|
||||
gfs2_assert_withdraw(sdp,
|
||||
sdp->sd_log_num_revoke == sdp->sd_log_commited_revoke);
|
||||
sdp->sd_log_num_revoke == sdp->sd_log_committed_revoke);
|
||||
|
||||
gfs2_ordered_write(sdp);
|
||||
lops_before_commit(sdp, tr);
|
||||
|
@ -848,7 +844,7 @@ void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl, u32 flags)
|
|||
gfs2_log_lock(sdp);
|
||||
sdp->sd_log_head = sdp->sd_log_flush_head;
|
||||
sdp->sd_log_blks_reserved = 0;
|
||||
sdp->sd_log_commited_revoke = 0;
|
||||
sdp->sd_log_committed_revoke = 0;
|
||||
|
||||
spin_lock(&sdp->sd_ail_lock);
|
||||
if (tr && !list_empty(&tr->tr_ail1_list)) {
|
||||
|
@ -899,6 +895,7 @@ static void gfs2_merge_trans(struct gfs2_trans *old, struct gfs2_trans *new)
|
|||
old->tr_num_buf_rm += new->tr_num_buf_rm;
|
||||
old->tr_num_databuf_rm += new->tr_num_databuf_rm;
|
||||
old->tr_num_revoke += new->tr_num_revoke;
|
||||
old->tr_num_revoke_rm += new->tr_num_revoke_rm;
|
||||
|
||||
list_splice_tail_init(&new->tr_databuf, &old->tr_databuf);
|
||||
list_splice_tail_init(&new->tr_buf, &old->tr_buf);
|
||||
|
@ -920,7 +917,7 @@ static void log_refund(struct gfs2_sbd *sdp, struct gfs2_trans *tr)
|
|||
set_bit(TR_ATTACHED, &tr->tr_flags);
|
||||
}
|
||||
|
||||
sdp->sd_log_commited_revoke += tr->tr_num_revoke;
|
||||
sdp->sd_log_committed_revoke += tr->tr_num_revoke - tr->tr_num_revoke_rm;
|
||||
reserved = calc_reserved(sdp);
|
||||
maxres = sdp->sd_log_blks_reserved + tr->tr_reserved;
|
||||
gfs2_assert_withdraw(sdp, maxres >= reserved);
|
||||
|
|
|
@ -60,9 +60,9 @@ static inline void gfs2_ordered_add_inode(struct gfs2_inode *ip)
|
|||
spin_unlock(&sdp->sd_ordered_lock);
|
||||
}
|
||||
}
|
||||
|
||||
extern void gfs2_ordered_del_inode(struct gfs2_inode *ip);
|
||||
extern unsigned int gfs2_struct2blk(struct gfs2_sbd *sdp, unsigned int nstruct,
|
||||
unsigned int ssize);
|
||||
extern unsigned int gfs2_struct2blk(struct gfs2_sbd *sdp, unsigned int nstruct);
|
||||
|
||||
extern void gfs2_log_release(struct gfs2_sbd *sdp, unsigned int blks);
|
||||
extern int gfs2_log_reserve(struct gfs2_sbd *sdp, unsigned int blks);
|
||||
|
|
|
@ -259,7 +259,7 @@ static struct bio *gfs2_log_alloc_bio(struct gfs2_sbd *sdp, u64 blkno,
|
|||
struct super_block *sb = sdp->sd_vfs;
|
||||
struct bio *bio = bio_alloc(GFP_NOIO, BIO_MAX_PAGES);
|
||||
|
||||
bio->bi_iter.bi_sector = blkno * (sb->s_blocksize >> 9);
|
||||
bio->bi_iter.bi_sector = blkno << (sb->s_blocksize_bits - 9);
|
||||
bio_set_dev(bio, sb->s_bdev);
|
||||
bio->bi_end_io = end_io;
|
||||
bio->bi_private = sdp;
|
||||
|
@ -472,6 +472,20 @@ static void gfs2_jhead_process_page(struct gfs2_jdesc *jd, unsigned long index,
|
|||
put_page(page); /* Once more for find_or_create_page */
|
||||
}
|
||||
|
||||
static struct bio *gfs2_chain_bio(struct bio *prev, unsigned int nr_iovecs)
|
||||
{
|
||||
struct bio *new;
|
||||
|
||||
new = bio_alloc(GFP_NOIO, nr_iovecs);
|
||||
bio_copy_dev(new, prev);
|
||||
new->bi_iter.bi_sector = bio_end_sector(prev);
|
||||
new->bi_opf = prev->bi_opf;
|
||||
new->bi_write_hint = prev->bi_write_hint;
|
||||
bio_chain(new, prev);
|
||||
submit_bio(prev);
|
||||
return new;
|
||||
}
|
||||
|
||||
/**
|
||||
* gfs2_find_jhead - find the head of a log
|
||||
* @jd: The journal descriptor
|
||||
|
@ -488,15 +502,15 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct gfs2_log_header_host *head,
|
|||
struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
|
||||
struct address_space *mapping = jd->jd_inode->i_mapping;
|
||||
unsigned int block = 0, blocks_submitted = 0, blocks_read = 0;
|
||||
unsigned int bsize = sdp->sd_sb.sb_bsize;
|
||||
unsigned int bsize = sdp->sd_sb.sb_bsize, off;
|
||||
unsigned int bsize_shift = sdp->sd_sb.sb_bsize_shift;
|
||||
unsigned int shift = PAGE_SHIFT - bsize_shift;
|
||||
unsigned int readhead_blocks = BIO_MAX_PAGES << shift;
|
||||
unsigned int readahead_blocks = BIO_MAX_PAGES << shift;
|
||||
struct gfs2_journal_extent *je;
|
||||
int sz, ret = 0;
|
||||
struct bio *bio = NULL;
|
||||
struct page *page = NULL;
|
||||
bool done = false;
|
||||
bool bio_chained = false, done = false;
|
||||
errseq_t since;
|
||||
|
||||
memset(head, 0, sizeof(*head));
|
||||
|
@ -505,9 +519,9 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct gfs2_log_header_host *head,
|
|||
|
||||
since = filemap_sample_wb_err(mapping);
|
||||
list_for_each_entry(je, &jd->extent_list, list) {
|
||||
for (; block < je->lblock + je->blocks; block++) {
|
||||
u64 dblock;
|
||||
u64 dblock = je->dblock;
|
||||
|
||||
for (; block < je->lblock + je->blocks; block++, dblock++) {
|
||||
if (!page) {
|
||||
page = find_or_create_page(mapping,
|
||||
block >> shift, GFP_NOFS);
|
||||
|
@ -516,35 +530,41 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct gfs2_log_header_host *head,
|
|||
done = true;
|
||||
goto out;
|
||||
}
|
||||
off = 0;
|
||||
}
|
||||
|
||||
if (!bio || (bio_chained && !off)) {
|
||||
/* start new bio */
|
||||
} else {
|
||||
sz = bio_add_page(bio, page, bsize, off);
|
||||
if (sz == bsize)
|
||||
goto block_added;
|
||||
if (off) {
|
||||
unsigned int blocks =
|
||||
(PAGE_SIZE - off) >> bsize_shift;
|
||||
|
||||
bio = gfs2_chain_bio(bio, blocks);
|
||||
bio_chained = true;
|
||||
goto add_block_to_new_bio;
|
||||
}
|
||||
}
|
||||
|
||||
if (bio) {
|
||||
unsigned int off;
|
||||
|
||||
off = (block << bsize_shift) & ~PAGE_MASK;
|
||||
sz = bio_add_page(bio, page, bsize, off);
|
||||
if (sz == bsize) { /* block added */
|
||||
if (off + bsize == PAGE_SIZE) {
|
||||
page = NULL;
|
||||
goto page_added;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
blocks_submitted = block + 1;
|
||||
submit_bio(bio);
|
||||
bio = NULL;
|
||||
}
|
||||
|
||||
dblock = je->dblock + (block - je->lblock);
|
||||
bio = gfs2_log_alloc_bio(sdp, dblock, gfs2_end_log_read);
|
||||
bio->bi_opf = REQ_OP_READ;
|
||||
sz = bio_add_page(bio, page, bsize, 0);
|
||||
gfs2_assert_warn(sdp, sz == bsize);
|
||||
if (bsize == PAGE_SIZE)
|
||||
bio_chained = false;
|
||||
add_block_to_new_bio:
|
||||
sz = bio_add_page(bio, page, bsize, off);
|
||||
BUG_ON(sz != bsize);
|
||||
block_added:
|
||||
off += bsize;
|
||||
if (off == PAGE_SIZE)
|
||||
page = NULL;
|
||||
|
||||
page_added:
|
||||
if (blocks_submitted < blocks_read + readhead_blocks) {
|
||||
if (blocks_submitted < blocks_read + readahead_blocks) {
|
||||
/* Keep at least one bio in flight */
|
||||
continue;
|
||||
}
|
||||
|
@ -846,7 +866,7 @@ static void revoke_lo_before_commit(struct gfs2_sbd *sdp, struct gfs2_trans *tr)
|
|||
if (!sdp->sd_log_num_revoke)
|
||||
return;
|
||||
|
||||
length = gfs2_struct2blk(sdp, sdp->sd_log_num_revoke, sizeof(u64));
|
||||
length = gfs2_struct2blk(sdp, sdp->sd_log_num_revoke);
|
||||
page = gfs2_get_log_desc(sdp, GFS2_LOG_DESC_REVOKE, length, sdp->sd_log_num_revoke);
|
||||
offset = sizeof(struct gfs2_log_descriptor);
|
||||
|
||||
|
|
|
@ -298,6 +298,8 @@ static int gfs2_read_sb(struct gfs2_sbd *sdp, int silent)
|
|||
sizeof(struct gfs2_dinode)) / sizeof(u64);
|
||||
sdp->sd_inptrs = (sdp->sd_sb.sb_bsize -
|
||||
sizeof(struct gfs2_meta_header)) / sizeof(u64);
|
||||
sdp->sd_ldptrs = (sdp->sd_sb.sb_bsize -
|
||||
sizeof(struct gfs2_log_descriptor)) / sizeof(u64);
|
||||
sdp->sd_jbsize = sdp->sd_sb.sb_bsize - sizeof(struct gfs2_meta_header);
|
||||
sdp->sd_hash_bsize = sdp->sd_sb.sb_bsize / 2;
|
||||
sdp->sd_hash_bsize_shift = sdp->sd_sb.sb_bsize_shift - 1;
|
||||
|
|
|
@ -36,16 +36,6 @@
|
|||
#define BFITNOENT ((u32)~0)
|
||||
#define NO_BLOCK ((u64)~0)
|
||||
|
||||
#if BITS_PER_LONG == 32
|
||||
#define LBITMASK (0x55555555UL)
|
||||
#define LBITSKIP55 (0x55555555UL)
|
||||
#define LBITSKIP00 (0x00000000UL)
|
||||
#else
|
||||
#define LBITMASK (0x5555555555555555UL)
|
||||
#define LBITSKIP55 (0x5555555555555555UL)
|
||||
#define LBITSKIP00 (0x0000000000000000UL)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* These routines are used by the resource group routines (rgrp.c)
|
||||
* to keep track of block allocation. Each block is represented by two
|
||||
|
|
|
@ -49,8 +49,7 @@ int gfs2_trans_begin(struct gfs2_sbd *sdp, unsigned int blocks,
|
|||
if (blocks)
|
||||
tr->tr_reserved += 6 + blocks;
|
||||
if (revokes)
|
||||
tr->tr_reserved += gfs2_struct2blk(sdp, revokes,
|
||||
sizeof(u64));
|
||||
tr->tr_reserved += gfs2_struct2blk(sdp, revokes);
|
||||
INIT_LIST_HEAD(&tr->tr_databuf);
|
||||
INIT_LIST_HEAD(&tr->tr_buf);
|
||||
|
||||
|
@ -77,10 +76,10 @@ static void gfs2_print_trans(struct gfs2_sbd *sdp, const struct gfs2_trans *tr)
|
|||
fs_warn(sdp, "blocks=%u revokes=%u reserved=%u touched=%u\n",
|
||||
tr->tr_blocks, tr->tr_revokes, tr->tr_reserved,
|
||||
test_bit(TR_TOUCHED, &tr->tr_flags));
|
||||
fs_warn(sdp, "Buf %u/%u Databuf %u/%u Revoke %u\n",
|
||||
fs_warn(sdp, "Buf %u/%u Databuf %u/%u Revoke %u/%u\n",
|
||||
tr->tr_num_buf_new, tr->tr_num_buf_rm,
|
||||
tr->tr_num_databuf_new, tr->tr_num_databuf_rm,
|
||||
tr->tr_num_revoke);
|
||||
tr->tr_num_revoke, tr->tr_num_revoke_rm);
|
||||
}
|
||||
|
||||
void gfs2_trans_end(struct gfs2_sbd *sdp)
|
||||
|
@ -265,7 +264,7 @@ void gfs2_trans_remove_revoke(struct gfs2_sbd *sdp, u64 blkno, unsigned int len)
|
|||
if (bd->bd_gl)
|
||||
gfs2_glock_remove_revoke(bd->bd_gl);
|
||||
kmem_cache_free(gfs2_bufdata_cachep, bd);
|
||||
tr->tr_num_revoke--;
|
||||
tr->tr_num_revoke_rm++;
|
||||
if (--n == 0)
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue