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

ufs: get rid of ubh_{ubhcpymem,memcpyubh}()

used only in ufs_read_cylinder_structures()/ufs_put_super_internal()
and there we can just as well avoid bothering with ufs_buffer_head
and just deal with it fragment-by-fragment.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

+16 -78
+16 -27
fs/ufs/super.c
··· 505 505 { 506 506 struct ufs_sb_info *sbi = UFS_SB(sb); 507 507 struct ufs_sb_private_info *uspi = sbi->s_uspi; 508 - struct ufs_buffer_head * ubh; 509 508 unsigned char * base, * space; 510 509 unsigned size, blks, i; 511 510 ··· 520 521 if (!base) 521 522 goto failed; 522 523 sbi->s_csp = (struct ufs_csum *)space; 523 - for (i = 0; i < blks; i += uspi->s_fpb) { 524 - size = uspi->s_bsize; 525 - if (i + uspi->s_fpb > blks) 526 - size = (blks - i) * uspi->s_fsize; 527 - 528 - ubh = ubh_bread(sb, uspi->s_csaddr + i, size); 529 - 530 - if (!ubh) 524 + for (i = 0; i < blks; i++) { 525 + struct buffer_head *bh = sb_bread(sb, uspi->s_csaddr + i); 526 + if (!bh) 531 527 goto failed; 532 - 533 - ubh_ubhcpymem (space, ubh, size); 534 - 535 - space += size; 536 - ubh_brelse (ubh); 537 - ubh = NULL; 528 + memcpy(space, bh->b_data, uspi->s_fsize); 529 + space += uspi->s_fsize; 530 + brelse (bh); 538 531 } 539 532 540 533 /* ··· 636 645 { 637 646 struct ufs_sb_info *sbi = UFS_SB(sb); 638 647 struct ufs_sb_private_info *uspi = sbi->s_uspi; 639 - struct ufs_buffer_head * ubh; 640 648 unsigned char * base, * space; 641 649 unsigned blks, size, i; 642 650 ··· 646 656 size = uspi->s_cssize; 647 657 blks = (size + uspi->s_fsize - 1) >> uspi->s_fshift; 648 658 base = space = (char*) sbi->s_csp; 649 - for (i = 0; i < blks; i += uspi->s_fpb) { 650 - size = uspi->s_bsize; 651 - if (i + uspi->s_fpb > blks) 652 - size = (blks - i) * uspi->s_fsize; 659 + for (i = 0; i < blks; i++, space += uspi->s_fsize) { 660 + struct buffer_head *bh = sb_bread(sb, uspi->s_csaddr + i); 653 661 654 - ubh = ubh_bread(sb, uspi->s_csaddr + i, size); 655 - 656 - ubh_memcpyubh (ubh, space, size); 657 - space += size; 658 - ubh_mark_buffer_uptodate (ubh, 1); 659 - ubh_mark_buffer_dirty (ubh); 660 - ubh_brelse (ubh); 662 + if (unlikely(!bh)) { // better than an oops... 663 + ufs_panic(sb, __func__, 664 + "can't write part of cylinder group summary"); 665 + continue; 666 + } 667 + memcpy(bh->b_data, space, uspi->s_fsize); 668 + mark_buffer_dirty(bh); 669 + brelse(bh); 661 670 } 662 671 for (i = 0; i < sbi->s_cg_loaded; i++) { 663 672 ufs_put_cylinder (sb, i);
-46
fs/ufs/util.c
··· 99 99 mark_buffer_dirty (ubh->bh[i]); 100 100 } 101 101 102 - void ubh_mark_buffer_uptodate (struct ufs_buffer_head * ubh, int flag) 103 - { 104 - unsigned i; 105 - if (!ubh) 106 - return; 107 - if (flag) { 108 - for ( i = 0; i < ubh->count; i++ ) 109 - set_buffer_uptodate (ubh->bh[i]); 110 - } else { 111 - for ( i = 0; i < ubh->count; i++ ) 112 - clear_buffer_uptodate (ubh->bh[i]); 113 - } 114 - } 115 - 116 102 void ubh_sync_block(struct ufs_buffer_head *ubh) 117 103 { 118 104 if (ubh) { ··· 130 144 for ( i = 0; i < ubh->count; i++ ) 131 145 result |= buffer_dirty(ubh->bh[i]); 132 146 return result; 133 - } 134 - 135 - void _ubh_ubhcpymem_(struct ufs_sb_private_info * uspi, 136 - unsigned char * mem, struct ufs_buffer_head * ubh, unsigned size) 137 - { 138 - unsigned len, bhno; 139 - if (size > (ubh->count << uspi->s_fshift)) 140 - size = ubh->count << uspi->s_fshift; 141 - bhno = 0; 142 - while (size) { 143 - len = min_t(unsigned int, size, uspi->s_fsize); 144 - memcpy (mem, ubh->bh[bhno]->b_data, len); 145 - mem += uspi->s_fsize; 146 - size -= len; 147 - bhno++; 148 - } 149 - } 150 - 151 - void _ubh_memcpyubh_(struct ufs_sb_private_info * uspi, 152 - struct ufs_buffer_head * ubh, unsigned char * mem, unsigned size) 153 - { 154 - unsigned len, bhno; 155 - if (size > (ubh->count << uspi->s_fshift)) 156 - size = ubh->count << uspi->s_fshift; 157 - bhno = 0; 158 - while (size) { 159 - len = min_t(unsigned int, size, uspi->s_fsize); 160 - memcpy (ubh->bh[bhno]->b_data, mem, len); 161 - mem += uspi->s_fsize; 162 - size -= len; 163 - bhno++; 164 - } 165 147 } 166 148 167 149 dev_t
-5
fs/ufs/util.h
··· 263 263 extern void ubh_brelse (struct ufs_buffer_head *); 264 264 extern void ubh_brelse_uspi (struct ufs_sb_private_info *); 265 265 extern void ubh_mark_buffer_dirty (struct ufs_buffer_head *); 266 - extern void ubh_mark_buffer_uptodate (struct ufs_buffer_head *, int); 267 266 extern void ubh_sync_block(struct ufs_buffer_head *); 268 267 extern void ubh_bforget (struct ufs_buffer_head *); 269 268 extern int ubh_buffer_dirty (struct ufs_buffer_head *); 270 - #define ubh_ubhcpymem(mem,ubh,size) _ubh_ubhcpymem_(uspi,mem,ubh,size) 271 - extern void _ubh_ubhcpymem_(struct ufs_sb_private_info *, unsigned char *, struct ufs_buffer_head *, unsigned); 272 - #define ubh_memcpyubh(ubh,mem,size) _ubh_memcpyubh_(uspi,ubh,mem,size) 273 - extern void _ubh_memcpyubh_(struct ufs_sb_private_info *, struct ufs_buffer_head *, unsigned char *, unsigned); 274 269 275 270 /* This functions works with cache pages*/ 276 271 struct folio *ufs_get_locked_folio(struct address_space *mapping, pgoff_t index);