Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

+74 -71
+1 -3
fs/gfs2/aops.c
··· 183 183 struct inode *inode = page->mapping->host; 184 184 struct gfs2_inode *ip = GFS2_I(inode); 185 185 struct gfs2_sbd *sdp = GFS2_SB(inode); 186 - int ret; 187 186 188 187 if (gfs2_assert_withdraw(sdp, gfs2_glock_is_held_excl(ip->i_gl))) 189 188 goto out; 190 189 if (PageChecked(page) || current->journal_info) 191 190 goto out_ignore; 192 - ret = __gfs2_jdata_writepage(page, wbc); 193 - return ret; 191 + return __gfs2_jdata_writepage(page, wbc); 194 192 195 193 out_ignore: 196 194 redirty_page_for_writepage(wbc, page);
-3
fs/gfs2/dir.c
··· 73 73 #include "bmap.h" 74 74 #include "util.h" 75 75 76 - #define IS_LEAF 1 /* Hashed (leaf) directory */ 77 - #define IS_DINODE 2 /* Linear (stuffed dinode block) directory */ 78 - 79 76 #define MAX_RA_BLOCKS 32 /* max read-ahead blocks */ 80 77 81 78 #define gfs2_disk_hash2offset(h) (((u64)(h)) >> 1)
+1 -1
fs/gfs2/glock.c
··· 826 826 memset(&gl->gl_lksb, 0, sizeof(struct dlm_lksb)); 827 827 828 828 if (glops->go_flags & GLOF_LVB) { 829 - gl->gl_lksb.sb_lvbptr = kzalloc(GFS2_MIN_LVB_SIZE, GFP_NOFS); 829 + gl->gl_lksb.sb_lvbptr = kzalloc(GDLM_LVB_SIZE, GFP_NOFS); 830 830 if (!gl->gl_lksb.sb_lvbptr) { 831 831 kmem_cache_free(cachep, gl); 832 832 return -ENOMEM;
+1 -1
fs/gfs2/glops.c
··· 95 95 /* A shortened, inline version of gfs2_trans_begin() 96 96 * tr->alloced is not set since the transaction structure is 97 97 * on the stack */ 98 - tr.tr_reserved = 1 + gfs2_struct2blk(sdp, tr.tr_revokes, sizeof(u64)); 98 + tr.tr_reserved = 1 + gfs2_struct2blk(sdp, tr.tr_revokes); 99 99 tr.tr_ip = _RET_IP_; 100 100 if (gfs2_log_reserve(sdp, tr.tr_reserved) < 0) 101 101 return;
+3 -3
fs/gfs2/incore.h
··· 387 387 struct rhash_head gl_node; 388 388 }; 389 389 390 - #define GFS2_MIN_LVB_SIZE 32 /* Min size of LVB that gfs2 supports */ 391 - 392 390 enum { 393 391 GIF_INVALID = 0, 394 392 GIF_QD_LOCKED = 1, ··· 503 505 unsigned int tr_num_buf_rm; 504 506 unsigned int tr_num_databuf_rm; 505 507 unsigned int tr_num_revoke; 508 + unsigned int tr_num_revoke_rm; 506 509 507 510 struct list_head tr_list; 508 511 struct list_head tr_databuf; ··· 702 703 u32 sd_fsb2bb_shift; 703 704 u32 sd_diptrs; /* Number of pointers in a dinode */ 704 705 u32 sd_inptrs; /* Number of pointers in a indirect block */ 706 + u32 sd_ldptrs; /* Number of pointers in a log descriptor block */ 705 707 u32 sd_jbsize; /* Size of a journaled data block */ 706 708 u32 sd_hash_bsize; /* sizeof(exhash block) */ 707 709 u32 sd_hash_bsize_shift; ··· 803 803 804 804 struct gfs2_trans *sd_log_tr; 805 805 unsigned int sd_log_blks_reserved; 806 - int sd_log_commited_revoke; 806 + int sd_log_committed_revoke; 807 807 808 808 atomic_t sd_log_pinned; 809 809 unsigned int sd_log_num_revoke;
+5 -5
fs/gfs2/inode.c
··· 136 136 137 137 if (inode->i_state & I_NEW) { 138 138 struct gfs2_sbd *sdp = GFS2_SB(inode); 139 - ip->i_no_formal_ino = no_formal_ino; 140 139 141 140 error = gfs2_glock_get(sdp, no_addr, &gfs2_inode_glops, CREATE, &ip->i_gl); 142 141 if (unlikely(error)) ··· 174 175 gfs2_glock_put(io_gl); 175 176 io_gl = NULL; 176 177 178 + /* Lowest possible timestamp; will be overwritten in gfs2_dinode_in. */ 179 + inode->i_atime.tv_sec = 1LL << (8 * sizeof(inode->i_atime.tv_sec) - 1); 180 + inode->i_atime.tv_nsec = 0; 181 + 177 182 if (type == DT_UNKNOWN) { 178 183 /* Inode glock must be locked already */ 179 184 error = gfs2_inode_refresh(GFS2_I(inode)); 180 185 if (error) 181 186 goto fail_refresh; 182 187 } else { 188 + ip->i_no_formal_ino = no_formal_ino; 183 189 inode->i_mode = DT2IF(type); 184 190 } 185 191 186 192 gfs2_set_iop(inode); 187 - 188 - /* Lowest possible timestamp; will be overwritten in gfs2_dinode_in. */ 189 - inode->i_atime.tv_sec = 1LL << (8 * sizeof(inode->i_atime.tv_sec) - 1); 190 - inode->i_atime.tv_nsec = 0; 191 193 192 194 unlock_new_inode(inode); 193 195 }
+9 -12
fs/gfs2/log.c
··· 37 37 * gfs2_struct2blk - compute stuff 38 38 * @sdp: the filesystem 39 39 * @nstruct: the number of structures 40 - * @ssize: the size of the structures 41 40 * 42 41 * Compute the number of log descriptor blocks needed to hold a certain number 43 42 * of structures of a certain size. ··· 44 45 * Returns: the number of blocks needed (minimum is always 1) 45 46 */ 46 47 47 - unsigned int gfs2_struct2blk(struct gfs2_sbd *sdp, unsigned int nstruct, 48 - unsigned int ssize) 48 + unsigned int gfs2_struct2blk(struct gfs2_sbd *sdp, unsigned int nstruct) 49 49 { 50 50 unsigned int blks; 51 51 unsigned int first, second; 52 52 53 53 blks = 1; 54 - first = (sdp->sd_sb.sb_bsize - sizeof(struct gfs2_log_descriptor)) / ssize; 54 + first = sdp->sd_ldptrs; 55 55 56 56 if (nstruct > first) { 57 - second = (sdp->sd_sb.sb_bsize - 58 - sizeof(struct gfs2_meta_header)) / ssize; 57 + second = sdp->sd_inptrs; 59 58 blks += DIV_ROUND_UP(nstruct - first, second); 60 59 } 61 60 ··· 469 472 reserved += DIV_ROUND_UP(dbuf, databuf_limit(sdp)); 470 473 } 471 474 472 - if (sdp->sd_log_commited_revoke > 0) 473 - reserved += gfs2_struct2blk(sdp, sdp->sd_log_commited_revoke, 474 - sizeof(u64)); 475 + if (sdp->sd_log_committed_revoke > 0) 476 + reserved += gfs2_struct2blk(sdp, sdp->sd_log_committed_revoke); 475 477 /* One for the overall header */ 476 478 if (reserved) 477 479 reserved++; ··· 825 829 if (unlikely(state == SFS_FROZEN)) 826 830 gfs2_assert_withdraw(sdp, !sdp->sd_log_num_revoke); 827 831 gfs2_assert_withdraw(sdp, 828 - sdp->sd_log_num_revoke == sdp->sd_log_commited_revoke); 832 + sdp->sd_log_num_revoke == sdp->sd_log_committed_revoke); 829 833 830 834 gfs2_ordered_write(sdp); 831 835 lops_before_commit(sdp, tr); ··· 844 848 gfs2_log_lock(sdp); 845 849 sdp->sd_log_head = sdp->sd_log_flush_head; 846 850 sdp->sd_log_blks_reserved = 0; 847 - sdp->sd_log_commited_revoke = 0; 851 + sdp->sd_log_committed_revoke = 0; 848 852 849 853 spin_lock(&sdp->sd_ail_lock); 850 854 if (tr && !list_empty(&tr->tr_ail1_list)) { ··· 895 899 old->tr_num_buf_rm += new->tr_num_buf_rm; 896 900 old->tr_num_databuf_rm += new->tr_num_databuf_rm; 897 901 old->tr_num_revoke += new->tr_num_revoke; 902 + old->tr_num_revoke_rm += new->tr_num_revoke_rm; 898 903 899 904 list_splice_tail_init(&new->tr_databuf, &old->tr_databuf); 900 905 list_splice_tail_init(&new->tr_buf, &old->tr_buf); ··· 917 920 set_bit(TR_ATTACHED, &tr->tr_flags); 918 921 } 919 922 920 - sdp->sd_log_commited_revoke += tr->tr_num_revoke; 923 + sdp->sd_log_committed_revoke += tr->tr_num_revoke - tr->tr_num_revoke_rm; 921 924 reserved = calc_reserved(sdp); 922 925 maxres = sdp->sd_log_blks_reserved + tr->tr_reserved; 923 926 gfs2_assert_withdraw(sdp, maxres >= reserved);
+2 -2
fs/gfs2/log.h
··· 60 60 spin_unlock(&sdp->sd_ordered_lock); 61 61 } 62 62 } 63 + 63 64 extern void gfs2_ordered_del_inode(struct gfs2_inode *ip); 64 - extern unsigned int gfs2_struct2blk(struct gfs2_sbd *sdp, unsigned int nstruct, 65 - unsigned int ssize); 65 + extern unsigned int gfs2_struct2blk(struct gfs2_sbd *sdp, unsigned int nstruct); 66 66 67 67 extern void gfs2_log_release(struct gfs2_sbd *sdp, unsigned int blks); 68 68 extern int gfs2_log_reserve(struct gfs2_sbd *sdp, unsigned int blks);
+46 -26
fs/gfs2/lops.c
··· 259 259 struct super_block *sb = sdp->sd_vfs; 260 260 struct bio *bio = bio_alloc(GFP_NOIO, BIO_MAX_PAGES); 261 261 262 - bio->bi_iter.bi_sector = blkno * (sb->s_blocksize >> 9); 262 + bio->bi_iter.bi_sector = blkno << (sb->s_blocksize_bits - 9); 263 263 bio_set_dev(bio, sb->s_bdev); 264 264 bio->bi_end_io = end_io; 265 265 bio->bi_private = sdp; ··· 472 472 put_page(page); /* Once more for find_or_create_page */ 473 473 } 474 474 475 + static struct bio *gfs2_chain_bio(struct bio *prev, unsigned int nr_iovecs) 476 + { 477 + struct bio *new; 478 + 479 + new = bio_alloc(GFP_NOIO, nr_iovecs); 480 + bio_copy_dev(new, prev); 481 + new->bi_iter.bi_sector = bio_end_sector(prev); 482 + new->bi_opf = prev->bi_opf; 483 + new->bi_write_hint = prev->bi_write_hint; 484 + bio_chain(new, prev); 485 + submit_bio(prev); 486 + return new; 487 + } 488 + 475 489 /** 476 490 * gfs2_find_jhead - find the head of a log 477 491 * @jd: The journal descriptor ··· 502 488 struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode); 503 489 struct address_space *mapping = jd->jd_inode->i_mapping; 504 490 unsigned int block = 0, blocks_submitted = 0, blocks_read = 0; 505 - unsigned int bsize = sdp->sd_sb.sb_bsize; 491 + unsigned int bsize = sdp->sd_sb.sb_bsize, off; 506 492 unsigned int bsize_shift = sdp->sd_sb.sb_bsize_shift; 507 493 unsigned int shift = PAGE_SHIFT - bsize_shift; 508 - unsigned int readhead_blocks = BIO_MAX_PAGES << shift; 494 + unsigned int readahead_blocks = BIO_MAX_PAGES << shift; 509 495 struct gfs2_journal_extent *je; 510 496 int sz, ret = 0; 511 497 struct bio *bio = NULL; 512 498 struct page *page = NULL; 513 - bool done = false; 499 + bool bio_chained = false, done = false; 514 500 errseq_t since; 515 501 516 502 memset(head, 0, sizeof(*head)); ··· 519 505 520 506 since = filemap_sample_wb_err(mapping); 521 507 list_for_each_entry(je, &jd->extent_list, list) { 522 - for (; block < je->lblock + je->blocks; block++) { 523 - u64 dblock; 508 + u64 dblock = je->dblock; 524 509 510 + for (; block < je->lblock + je->blocks; block++, dblock++) { 525 511 if (!page) { 526 512 page = find_or_create_page(mapping, 527 513 block >> shift, GFP_NOFS); ··· 530 516 done = true; 531 517 goto out; 532 518 } 519 + off = 0; 520 + } 521 + 522 + if (!bio || (bio_chained && !off)) { 523 + /* start new bio */ 524 + } else { 525 + sz = bio_add_page(bio, page, bsize, off); 526 + if (sz == bsize) 527 + goto block_added; 528 + if (off) { 529 + unsigned int blocks = 530 + (PAGE_SIZE - off) >> bsize_shift; 531 + 532 + bio = gfs2_chain_bio(bio, blocks); 533 + bio_chained = true; 534 + goto add_block_to_new_bio; 535 + } 533 536 } 534 537 535 538 if (bio) { 536 - unsigned int off; 537 - 538 - off = (block << bsize_shift) & ~PAGE_MASK; 539 - sz = bio_add_page(bio, page, bsize, off); 540 - if (sz == bsize) { /* block added */ 541 - if (off + bsize == PAGE_SIZE) { 542 - page = NULL; 543 - goto page_added; 544 - } 545 - continue; 546 - } 547 539 blocks_submitted = block + 1; 548 540 submit_bio(bio); 549 - bio = NULL; 550 541 } 551 542 552 - dblock = je->dblock + (block - je->lblock); 553 543 bio = gfs2_log_alloc_bio(sdp, dblock, gfs2_end_log_read); 554 544 bio->bi_opf = REQ_OP_READ; 555 - sz = bio_add_page(bio, page, bsize, 0); 556 - gfs2_assert_warn(sdp, sz == bsize); 557 - if (bsize == PAGE_SIZE) 545 + bio_chained = false; 546 + add_block_to_new_bio: 547 + sz = bio_add_page(bio, page, bsize, off); 548 + BUG_ON(sz != bsize); 549 + block_added: 550 + off += bsize; 551 + if (off == PAGE_SIZE) 558 552 page = NULL; 559 - 560 - page_added: 561 - if (blocks_submitted < blocks_read + readhead_blocks) { 553 + if (blocks_submitted < blocks_read + readahead_blocks) { 562 554 /* Keep at least one bio in flight */ 563 555 continue; 564 556 } ··· 866 846 if (!sdp->sd_log_num_revoke) 867 847 return; 868 848 869 - length = gfs2_struct2blk(sdp, sdp->sd_log_num_revoke, sizeof(u64)); 849 + length = gfs2_struct2blk(sdp, sdp->sd_log_num_revoke); 870 850 page = gfs2_get_log_desc(sdp, GFS2_LOG_DESC_REVOKE, length, sdp->sd_log_num_revoke); 871 851 offset = sizeof(struct gfs2_log_descriptor); 872 852
+2
fs/gfs2/ops_fstype.c
··· 298 298 sizeof(struct gfs2_dinode)) / sizeof(u64); 299 299 sdp->sd_inptrs = (sdp->sd_sb.sb_bsize - 300 300 sizeof(struct gfs2_meta_header)) / sizeof(u64); 301 + sdp->sd_ldptrs = (sdp->sd_sb.sb_bsize - 302 + sizeof(struct gfs2_log_descriptor)) / sizeof(u64); 301 303 sdp->sd_jbsize = sdp->sd_sb.sb_bsize - sizeof(struct gfs2_meta_header); 302 304 sdp->sd_hash_bsize = sdp->sd_sb.sb_bsize / 2; 303 305 sdp->sd_hash_bsize_shift = sdp->sd_sb.sb_bsize_shift - 1;
-10
fs/gfs2/rgrp.c
··· 36 36 #define BFITNOENT ((u32)~0) 37 37 #define NO_BLOCK ((u64)~0) 38 38 39 - #if BITS_PER_LONG == 32 40 - #define LBITMASK (0x55555555UL) 41 - #define LBITSKIP55 (0x55555555UL) 42 - #define LBITSKIP00 (0x00000000UL) 43 - #else 44 - #define LBITMASK (0x5555555555555555UL) 45 - #define LBITSKIP55 (0x5555555555555555UL) 46 - #define LBITSKIP00 (0x0000000000000000UL) 47 - #endif 48 - 49 39 /* 50 40 * These routines are used by the resource group routines (rgrp.c) 51 41 * to keep track of block allocation. Each block is represented by two
+4 -5
fs/gfs2/trans.c
··· 49 49 if (blocks) 50 50 tr->tr_reserved += 6 + blocks; 51 51 if (revokes) 52 - tr->tr_reserved += gfs2_struct2blk(sdp, revokes, 53 - sizeof(u64)); 52 + tr->tr_reserved += gfs2_struct2blk(sdp, revokes); 54 53 INIT_LIST_HEAD(&tr->tr_databuf); 55 54 INIT_LIST_HEAD(&tr->tr_buf); 56 55 ··· 76 77 fs_warn(sdp, "blocks=%u revokes=%u reserved=%u touched=%u\n", 77 78 tr->tr_blocks, tr->tr_revokes, tr->tr_reserved, 78 79 test_bit(TR_TOUCHED, &tr->tr_flags)); 79 - fs_warn(sdp, "Buf %u/%u Databuf %u/%u Revoke %u\n", 80 + fs_warn(sdp, "Buf %u/%u Databuf %u/%u Revoke %u/%u\n", 80 81 tr->tr_num_buf_new, tr->tr_num_buf_rm, 81 82 tr->tr_num_databuf_new, tr->tr_num_databuf_rm, 82 - tr->tr_num_revoke); 83 + tr->tr_num_revoke, tr->tr_num_revoke_rm); 83 84 } 84 85 85 86 void gfs2_trans_end(struct gfs2_sbd *sdp) ··· 264 265 if (bd->bd_gl) 265 266 gfs2_glock_remove_revoke(bd->bd_gl); 266 267 kmem_cache_free(gfs2_bufdata_cachep, bd); 267 - tr->tr_num_revoke--; 268 + tr->tr_num_revoke_rm++; 268 269 if (--n == 0) 269 270 break; 270 271 }