mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00
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>
This commit is contained in:
parent
ae79ce9d06
commit
db57044217
@ -505,7 +505,6 @@ static int ufs_read_cylinder_structures(struct super_block *sb)
|
|||||||
{
|
{
|
||||||
struct ufs_sb_info *sbi = UFS_SB(sb);
|
struct ufs_sb_info *sbi = UFS_SB(sb);
|
||||||
struct ufs_sb_private_info *uspi = sbi->s_uspi;
|
struct ufs_sb_private_info *uspi = sbi->s_uspi;
|
||||||
struct ufs_buffer_head * ubh;
|
|
||||||
unsigned char * base, * space;
|
unsigned char * base, * space;
|
||||||
unsigned size, blks, i;
|
unsigned size, blks, i;
|
||||||
|
|
||||||
@ -521,21 +520,13 @@ static int ufs_read_cylinder_structures(struct super_block *sb)
|
|||||||
if (!base)
|
if (!base)
|
||||||
goto failed;
|
goto failed;
|
||||||
sbi->s_csp = (struct ufs_csum *)space;
|
sbi->s_csp = (struct ufs_csum *)space;
|
||||||
for (i = 0; i < blks; i += uspi->s_fpb) {
|
for (i = 0; i < blks; i++) {
|
||||||
size = uspi->s_bsize;
|
struct buffer_head *bh = sb_bread(sb, uspi->s_csaddr + i);
|
||||||
if (i + uspi->s_fpb > blks)
|
if (!bh)
|
||||||
size = (blks - i) * uspi->s_fsize;
|
|
||||||
|
|
||||||
ubh = ubh_bread(sb, uspi->s_csaddr + i, size);
|
|
||||||
|
|
||||||
if (!ubh)
|
|
||||||
goto failed;
|
goto failed;
|
||||||
|
memcpy(space, bh->b_data, uspi->s_fsize);
|
||||||
ubh_ubhcpymem (space, ubh, size);
|
space += uspi->s_fsize;
|
||||||
|
brelse (bh);
|
||||||
space += size;
|
|
||||||
ubh_brelse (ubh);
|
|
||||||
ubh = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -645,7 +636,6 @@ static void ufs_put_super_internal(struct super_block *sb)
|
|||||||
{
|
{
|
||||||
struct ufs_sb_info *sbi = UFS_SB(sb);
|
struct ufs_sb_info *sbi = UFS_SB(sb);
|
||||||
struct ufs_sb_private_info *uspi = sbi->s_uspi;
|
struct ufs_sb_private_info *uspi = sbi->s_uspi;
|
||||||
struct ufs_buffer_head * ubh;
|
|
||||||
unsigned char * base, * space;
|
unsigned char * base, * space;
|
||||||
unsigned blks, size, i;
|
unsigned blks, size, i;
|
||||||
|
|
||||||
@ -656,18 +646,17 @@ static void ufs_put_super_internal(struct super_block *sb)
|
|||||||
size = uspi->s_cssize;
|
size = uspi->s_cssize;
|
||||||
blks = (size + uspi->s_fsize - 1) >> uspi->s_fshift;
|
blks = (size + uspi->s_fsize - 1) >> uspi->s_fshift;
|
||||||
base = space = (char*) sbi->s_csp;
|
base = space = (char*) sbi->s_csp;
|
||||||
for (i = 0; i < blks; i += uspi->s_fpb) {
|
for (i = 0; i < blks; i++, space += uspi->s_fsize) {
|
||||||
size = uspi->s_bsize;
|
struct buffer_head *bh = sb_bread(sb, uspi->s_csaddr + i);
|
||||||
if (i + uspi->s_fpb > blks)
|
|
||||||
size = (blks - i) * uspi->s_fsize;
|
|
||||||
|
|
||||||
ubh = ubh_bread(sb, uspi->s_csaddr + i, size);
|
if (unlikely(!bh)) { // better than an oops...
|
||||||
|
ufs_panic(sb, __func__,
|
||||||
ubh_memcpyubh (ubh, space, size);
|
"can't write part of cylinder group summary");
|
||||||
space += size;
|
continue;
|
||||||
ubh_mark_buffer_uptodate (ubh, 1);
|
}
|
||||||
ubh_mark_buffer_dirty (ubh);
|
memcpy(bh->b_data, space, uspi->s_fsize);
|
||||||
ubh_brelse (ubh);
|
mark_buffer_dirty(bh);
|
||||||
|
brelse(bh);
|
||||||
}
|
}
|
||||||
for (i = 0; i < sbi->s_cg_loaded; i++) {
|
for (i = 0; i < sbi->s_cg_loaded; i++) {
|
||||||
ufs_put_cylinder (sb, i);
|
ufs_put_cylinder (sb, i);
|
||||||
|
@ -99,20 +99,6 @@ void ubh_mark_buffer_dirty (struct ufs_buffer_head * ubh)
|
|||||||
mark_buffer_dirty (ubh->bh[i]);
|
mark_buffer_dirty (ubh->bh[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ubh_mark_buffer_uptodate (struct ufs_buffer_head * ubh, int flag)
|
|
||||||
{
|
|
||||||
unsigned i;
|
|
||||||
if (!ubh)
|
|
||||||
return;
|
|
||||||
if (flag) {
|
|
||||||
for ( i = 0; i < ubh->count; i++ )
|
|
||||||
set_buffer_uptodate (ubh->bh[i]);
|
|
||||||
} else {
|
|
||||||
for ( i = 0; i < ubh->count; i++ )
|
|
||||||
clear_buffer_uptodate (ubh->bh[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ubh_sync_block(struct ufs_buffer_head *ubh)
|
void ubh_sync_block(struct ufs_buffer_head *ubh)
|
||||||
{
|
{
|
||||||
if (ubh) {
|
if (ubh) {
|
||||||
@ -146,38 +132,6 @@ int ubh_buffer_dirty (struct ufs_buffer_head * ubh)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _ubh_ubhcpymem_(struct ufs_sb_private_info * uspi,
|
|
||||||
unsigned char * mem, struct ufs_buffer_head * ubh, unsigned size)
|
|
||||||
{
|
|
||||||
unsigned len, bhno;
|
|
||||||
if (size > (ubh->count << uspi->s_fshift))
|
|
||||||
size = ubh->count << uspi->s_fshift;
|
|
||||||
bhno = 0;
|
|
||||||
while (size) {
|
|
||||||
len = min_t(unsigned int, size, uspi->s_fsize);
|
|
||||||
memcpy (mem, ubh->bh[bhno]->b_data, len);
|
|
||||||
mem += uspi->s_fsize;
|
|
||||||
size -= len;
|
|
||||||
bhno++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void _ubh_memcpyubh_(struct ufs_sb_private_info * uspi,
|
|
||||||
struct ufs_buffer_head * ubh, unsigned char * mem, unsigned size)
|
|
||||||
{
|
|
||||||
unsigned len, bhno;
|
|
||||||
if (size > (ubh->count << uspi->s_fshift))
|
|
||||||
size = ubh->count << uspi->s_fshift;
|
|
||||||
bhno = 0;
|
|
||||||
while (size) {
|
|
||||||
len = min_t(unsigned int, size, uspi->s_fsize);
|
|
||||||
memcpy (ubh->bh[bhno]->b_data, mem, len);
|
|
||||||
mem += uspi->s_fsize;
|
|
||||||
size -= len;
|
|
||||||
bhno++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dev_t
|
dev_t
|
||||||
ufs_get_inode_dev(struct super_block *sb, struct ufs_inode_info *ufsi)
|
ufs_get_inode_dev(struct super_block *sb, struct ufs_inode_info *ufsi)
|
||||||
{
|
{
|
||||||
|
@ -263,14 +263,9 @@ extern struct ufs_buffer_head * ubh_bread_uspi(struct ufs_sb_private_info *, str
|
|||||||
extern void ubh_brelse (struct ufs_buffer_head *);
|
extern void ubh_brelse (struct ufs_buffer_head *);
|
||||||
extern void ubh_brelse_uspi (struct ufs_sb_private_info *);
|
extern void ubh_brelse_uspi (struct ufs_sb_private_info *);
|
||||||
extern void ubh_mark_buffer_dirty (struct ufs_buffer_head *);
|
extern void ubh_mark_buffer_dirty (struct ufs_buffer_head *);
|
||||||
extern void ubh_mark_buffer_uptodate (struct ufs_buffer_head *, int);
|
|
||||||
extern void ubh_sync_block(struct ufs_buffer_head *);
|
extern void ubh_sync_block(struct ufs_buffer_head *);
|
||||||
extern void ubh_bforget (struct ufs_buffer_head *);
|
extern void ubh_bforget (struct ufs_buffer_head *);
|
||||||
extern int ubh_buffer_dirty (struct ufs_buffer_head *);
|
extern int ubh_buffer_dirty (struct ufs_buffer_head *);
|
||||||
#define ubh_ubhcpymem(mem,ubh,size) _ubh_ubhcpymem_(uspi,mem,ubh,size)
|
|
||||||
extern void _ubh_ubhcpymem_(struct ufs_sb_private_info *, unsigned char *, struct ufs_buffer_head *, unsigned);
|
|
||||||
#define ubh_memcpyubh(ubh,mem,size) _ubh_memcpyubh_(uspi,ubh,mem,size)
|
|
||||||
extern void _ubh_memcpyubh_(struct ufs_sb_private_info *, struct ufs_buffer_head *, unsigned char *, unsigned);
|
|
||||||
|
|
||||||
/* This functions works with cache pages*/
|
/* This functions works with cache pages*/
|
||||||
struct folio *ufs_get_locked_folio(struct address_space *mapping, pgoff_t index);
|
struct folio *ufs_get_locked_folio(struct address_space *mapping, pgoff_t index);
|
||||||
|
Loading…
Reference in New Issue
Block a user