Commit 7b4ee73e authored by Evgeniy's avatar Evgeniy Committed by Linus Torvalds

[PATCH] ufs cleanup

Here is update of ufs cleanup patch, brought on by the recently fixed
ubh_get_usb_second() bug that made some ugly code rather painfully
obvious.  It also includes

 - fix compilation warnings which appears if debug mode turn on
 - remove unnecessary duplication of code to support UFS2

I tested it on ufs1 and ufs2 file-systems.
Signed-off-by: default avatarEvgeniy Dushistov <dushistov@mail.ru>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 59af7038
...@@ -49,7 +49,7 @@ void ufs_free_fragments (struct inode * inode, unsigned fragment, unsigned count ...@@ -49,7 +49,7 @@ void ufs_free_fragments (struct inode * inode, unsigned fragment, unsigned count
sb = inode->i_sb; sb = inode->i_sb;
uspi = UFS_SB(sb)->s_uspi; uspi = UFS_SB(sb)->s_uspi;
usb1 = ubh_get_usb_first(USPI_UBH); usb1 = ubh_get_usb_first(uspi);
UFSD(("ENTER, fragment %u, count %u\n", fragment, count)) UFSD(("ENTER, fragment %u, count %u\n", fragment, count))
...@@ -81,7 +81,8 @@ void ufs_free_fragments (struct inode * inode, unsigned fragment, unsigned count ...@@ -81,7 +81,8 @@ void ufs_free_fragments (struct inode * inode, unsigned fragment, unsigned count
for (i = bit; i < end_bit; i++) { for (i = bit; i < end_bit; i++) {
if (ubh_isclr (UCPI_UBH, ucpi->c_freeoff, i)) if (ubh_isclr (UCPI_UBH, ucpi->c_freeoff, i))
ubh_setbit (UCPI_UBH, ucpi->c_freeoff, i); ubh_setbit (UCPI_UBH, ucpi->c_freeoff, i);
else ufs_error (sb, "ufs_free_fragments", else
ufs_error (sb, "ufs_free_fragments",
"bit already cleared for fragment %u", i); "bit already cleared for fragment %u", i);
} }
...@@ -143,7 +144,7 @@ void ufs_free_blocks (struct inode * inode, unsigned fragment, unsigned count) { ...@@ -143,7 +144,7 @@ void ufs_free_blocks (struct inode * inode, unsigned fragment, unsigned count) {
sb = inode->i_sb; sb = inode->i_sb;
uspi = UFS_SB(sb)->s_uspi; uspi = UFS_SB(sb)->s_uspi;
usb1 = ubh_get_usb_first(USPI_UBH); usb1 = ubh_get_usb_first(uspi);
UFSD(("ENTER, fragment %u, count %u\n", fragment, count)) UFSD(("ENTER, fragment %u, count %u\n", fragment, count))
...@@ -247,7 +248,7 @@ unsigned ufs_new_fragments (struct inode * inode, __fs32 * p, unsigned fragment, ...@@ -247,7 +248,7 @@ unsigned ufs_new_fragments (struct inode * inode, __fs32 * p, unsigned fragment,
sb = inode->i_sb; sb = inode->i_sb;
uspi = UFS_SB(sb)->s_uspi; uspi = UFS_SB(sb)->s_uspi;
usb1 = ubh_get_usb_first(USPI_UBH); usb1 = ubh_get_usb_first(uspi);
*err = -ENOSPC; *err = -ENOSPC;
lock_super (sb); lock_super (sb);
...@@ -407,7 +408,7 @@ ufs_add_fragments (struct inode * inode, unsigned fragment, ...@@ -407,7 +408,7 @@ ufs_add_fragments (struct inode * inode, unsigned fragment,
sb = inode->i_sb; sb = inode->i_sb;
uspi = UFS_SB(sb)->s_uspi; uspi = UFS_SB(sb)->s_uspi;
usb1 = ubh_get_usb_first (USPI_UBH); usb1 = ubh_get_usb_first (uspi);
count = newcount - oldcount; count = newcount - oldcount;
cgno = ufs_dtog(fragment); cgno = ufs_dtog(fragment);
...@@ -490,7 +491,7 @@ static unsigned ufs_alloc_fragments (struct inode * inode, unsigned cgno, ...@@ -490,7 +491,7 @@ static unsigned ufs_alloc_fragments (struct inode * inode, unsigned cgno,
sb = inode->i_sb; sb = inode->i_sb;
uspi = UFS_SB(sb)->s_uspi; uspi = UFS_SB(sb)->s_uspi;
usb1 = ubh_get_usb_first(USPI_UBH); usb1 = ubh_get_usb_first(uspi);
oldcg = cgno; oldcg = cgno;
/* /*
...@@ -606,7 +607,7 @@ static unsigned ufs_alloccg_block (struct inode * inode, ...@@ -606,7 +607,7 @@ static unsigned ufs_alloccg_block (struct inode * inode,
sb = inode->i_sb; sb = inode->i_sb;
uspi = UFS_SB(sb)->s_uspi; uspi = UFS_SB(sb)->s_uspi;
usb1 = ubh_get_usb_first(USPI_UBH); usb1 = ubh_get_usb_first(uspi);
ucg = ubh_get_ucg(UCPI_UBH); ucg = ubh_get_ucg(UCPI_UBH);
if (goal == 0) { if (goal == 0) {
...@@ -663,7 +664,7 @@ static unsigned ufs_bitmap_search (struct super_block * sb, ...@@ -663,7 +664,7 @@ static unsigned ufs_bitmap_search (struct super_block * sb,
UFSD(("ENTER, cg %u, goal %u, count %u\n", ucpi->c_cgx, goal, count)) UFSD(("ENTER, cg %u, goal %u, count %u\n", ucpi->c_cgx, goal, count))
uspi = UFS_SB(sb)->s_uspi; uspi = UFS_SB(sb)->s_uspi;
usb1 = ubh_get_usb_first (USPI_UBH); usb1 = ubh_get_usb_first (uspi);
ucg = ubh_get_ucg(UCPI_UBH); ucg = ubh_get_ucg(UCPI_UBH);
if (goal) if (goal)
......
...@@ -72,7 +72,7 @@ void ufs_free_inode (struct inode * inode) ...@@ -72,7 +72,7 @@ void ufs_free_inode (struct inode * inode)
sb = inode->i_sb; sb = inode->i_sb;
uspi = UFS_SB(sb)->s_uspi; uspi = UFS_SB(sb)->s_uspi;
usb1 = ubh_get_usb_first(USPI_UBH); usb1 = ubh_get_usb_first(uspi);
ino = inode->i_ino; ino = inode->i_ino;
...@@ -167,7 +167,7 @@ struct inode * ufs_new_inode(struct inode * dir, int mode) ...@@ -167,7 +167,7 @@ struct inode * ufs_new_inode(struct inode * dir, int mode)
ufsi = UFS_I(inode); ufsi = UFS_I(inode);
sbi = UFS_SB(sb); sbi = UFS_SB(sb);
uspi = sbi->s_uspi; uspi = sbi->s_uspi;
usb1 = ubh_get_usb_first(USPI_UBH); usb1 = ubh_get_usb_first(uspi);
lock_super (sb); lock_super (sb);
......
...@@ -61,7 +61,7 @@ static int ufs_block_to_path(struct inode *inode, sector_t i_block, sector_t off ...@@ -61,7 +61,7 @@ static int ufs_block_to_path(struct inode *inode, sector_t i_block, sector_t off
int n = 0; int n = 0;
UFSD(("ptrs=uspi->s_apb = %d,double_blocks=%d \n",ptrs,double_blocks)); UFSD(("ptrs=uspi->s_apb = %d,double_blocks=%ld \n",ptrs,double_blocks));
if (i_block < 0) { if (i_block < 0) {
ufs_warning(inode->i_sb, "ufs_block_to_path", "block < 0"); ufs_warning(inode->i_sb, "ufs_block_to_path", "block < 0");
} else if (i_block < direct_blocks) { } else if (i_block < direct_blocks) {
...@@ -104,7 +104,7 @@ u64 ufs_frag_map(struct inode *inode, sector_t frag) ...@@ -104,7 +104,7 @@ u64 ufs_frag_map(struct inode *inode, sector_t frag)
unsigned flags = UFS_SB(sb)->s_flags; unsigned flags = UFS_SB(sb)->s_flags;
u64 temp = 0L; u64 temp = 0L;
UFSD((": frag = %lu depth = %d\n",frag,depth)); UFSD((": frag = %llu depth = %d\n", (unsigned long long)frag, depth));
UFSD((": uspi->s_fpbshift = %d ,uspi->s_apbmask = %x, mask=%llx\n",uspi->s_fpbshift,uspi->s_apbmask,mask)); UFSD((": uspi->s_fpbshift = %d ,uspi->s_apbmask = %x, mask=%llx\n",uspi->s_fpbshift,uspi->s_apbmask,mask));
if (depth == 0) if (depth == 0)
...@@ -365,9 +365,10 @@ static struct buffer_head * ufs_block_getfrag (struct inode *inode, ...@@ -365,9 +365,10 @@ static struct buffer_head * ufs_block_getfrag (struct inode *inode,
sync_dirty_buffer(bh); sync_dirty_buffer(bh);
inode->i_ctime = CURRENT_TIME_SEC; inode->i_ctime = CURRENT_TIME_SEC;
mark_inode_dirty(inode); mark_inode_dirty(inode);
UFSD(("result %u\n", tmp + blockoff));
out: out:
brelse (bh); brelse (bh);
UFSD(("EXIT, result %u\n", tmp + blockoff)) UFSD(("EXIT\n"));
return result; return result;
} }
...@@ -386,7 +387,7 @@ static int ufs_getfrag_block (struct inode *inode, sector_t fragment, struct buf ...@@ -386,7 +387,7 @@ static int ufs_getfrag_block (struct inode *inode, sector_t fragment, struct buf
if (!create) { if (!create) {
phys64 = ufs_frag_map(inode, fragment); phys64 = ufs_frag_map(inode, fragment);
UFSD(("phys64 = %lu \n",phys64)); UFSD(("phys64 = %llu \n",phys64));
if (phys64) if (phys64)
map_bh(bh_result, sb, phys64); map_bh(bh_result, sb, phys64);
return 0; return 0;
...@@ -401,7 +402,7 @@ static int ufs_getfrag_block (struct inode *inode, sector_t fragment, struct buf ...@@ -401,7 +402,7 @@ static int ufs_getfrag_block (struct inode *inode, sector_t fragment, struct buf
lock_kernel(); lock_kernel();
UFSD(("ENTER, ino %lu, fragment %u\n", inode->i_ino, fragment)) UFSD(("ENTER, ino %lu, fragment %llu\n", inode->i_ino, (unsigned long long)fragment))
if (fragment < 0) if (fragment < 0)
goto abort_negative; goto abort_negative;
if (fragment > if (fragment >
......
...@@ -221,7 +221,7 @@ void ufs_error (struct super_block * sb, const char * function, ...@@ -221,7 +221,7 @@ void ufs_error (struct super_block * sb, const char * function,
va_list args; va_list args;
uspi = UFS_SB(sb)->s_uspi; uspi = UFS_SB(sb)->s_uspi;
usb1 = ubh_get_usb_first(USPI_UBH); usb1 = ubh_get_usb_first(uspi);
if (!(sb->s_flags & MS_RDONLY)) { if (!(sb->s_flags & MS_RDONLY)) {
usb1->fs_clean = UFS_FSBAD; usb1->fs_clean = UFS_FSBAD;
...@@ -253,7 +253,7 @@ void ufs_panic (struct super_block * sb, const char * function, ...@@ -253,7 +253,7 @@ void ufs_panic (struct super_block * sb, const char * function,
va_list args; va_list args;
uspi = UFS_SB(sb)->s_uspi; uspi = UFS_SB(sb)->s_uspi;
usb1 = ubh_get_usb_first(USPI_UBH); usb1 = ubh_get_usb_first(uspi);
if (!(sb->s_flags & MS_RDONLY)) { if (!(sb->s_flags & MS_RDONLY)) {
usb1->fs_clean = UFS_FSBAD; usb1->fs_clean = UFS_FSBAD;
...@@ -420,21 +420,18 @@ static int ufs_read_cylinder_structures (struct super_block *sb) { ...@@ -420,21 +420,18 @@ static int ufs_read_cylinder_structures (struct super_block *sb) {
if (i + uspi->s_fpb > blks) if (i + uspi->s_fpb > blks)
size = (blks - i) * uspi->s_fsize; size = (blks - i) * uspi->s_fsize;
if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) { if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2)
ubh = ubh_bread(sb, ubh = ubh_bread(sb,
fs64_to_cpu(sb, usb->fs_u11.fs_u2.fs_csaddr) + i, size); fs64_to_cpu(sb, usb->fs_u11.fs_u2.fs_csaddr) + i, size);
if (!ubh) else
goto failed;
ubh_ubhcpymem (space, ubh, size);
sbi->s_csp[ufs_fragstoblks(i)]=(struct ufs_csum *)space;
}
else {
ubh = ubh_bread(sb, uspi->s_csaddr + i, size); ubh = ubh_bread(sb, uspi->s_csaddr + i, size);
if (!ubh) if (!ubh)
goto failed; goto failed;
ubh_ubhcpymem(space, ubh, size);
ubh_ubhcpymem (space, ubh, size);
sbi->s_csp[ufs_fragstoblks(i)]=(struct ufs_csum *)space; sbi->s_csp[ufs_fragstoblks(i)]=(struct ufs_csum *)space;
}
space += size; space += size;
ubh_brelse (ubh); ubh_brelse (ubh);
ubh = NULL; ubh = NULL;
...@@ -539,6 +536,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -539,6 +536,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
struct inode *inode; struct inode *inode;
unsigned block_size, super_block_size; unsigned block_size, super_block_size;
unsigned flags; unsigned flags;
unsigned super_block_offset;
uspi = NULL; uspi = NULL;
ubh = NULL; ubh = NULL;
...@@ -586,10 +584,11 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -586,10 +584,11 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
if (!uspi) if (!uspi)
goto failed; goto failed;
super_block_offset=UFS_SBLOCK;
/* Keep 2Gig file limit. Some UFS variants need to override /* Keep 2Gig file limit. Some UFS variants need to override
this but as I don't know which I'll let those in the know loosen this but as I don't know which I'll let those in the know loosen
the rules */ the rules */
switch (sbi->s_mount_opt & UFS_MOUNT_UFSTYPE) { switch (sbi->s_mount_opt & UFS_MOUNT_UFSTYPE) {
case UFS_MOUNT_UFSTYPE_44BSD: case UFS_MOUNT_UFSTYPE_44BSD:
UFSD(("ufstype=44bsd\n")) UFSD(("ufstype=44bsd\n"))
...@@ -601,7 +600,8 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -601,7 +600,8 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
flags |= UFS_DE_44BSD | UFS_UID_44BSD | UFS_ST_44BSD | UFS_CG_44BSD; flags |= UFS_DE_44BSD | UFS_UID_44BSD | UFS_ST_44BSD | UFS_CG_44BSD;
break; break;
case UFS_MOUNT_UFSTYPE_UFS2: case UFS_MOUNT_UFSTYPE_UFS2:
UFSD(("ufstype=ufs2\n")) UFSD(("ufstype=ufs2\n"));
super_block_offset=SBLOCK_UFS2;
uspi->s_fsize = block_size = 512; uspi->s_fsize = block_size = 512;
uspi->s_fmask = ~(512 - 1); uspi->s_fmask = ~(512 - 1);
uspi->s_fshift = 9; uspi->s_fshift = 9;
...@@ -725,19 +725,16 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -725,19 +725,16 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
/* /*
* read ufs super block from device * read ufs super block from device
*/ */
if ( (flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) {
ubh = ubh_bread_uspi(uspi, sb, uspi->s_sbbase + SBLOCK_UFS2/block_size, super_block_size); ubh = ubh_bread_uspi(uspi, sb, uspi->s_sbbase + super_block_offset/block_size, super_block_size);
}
else {
ubh = ubh_bread_uspi(uspi, sb, uspi->s_sbbase + UFS_SBLOCK/block_size, super_block_size);
}
if (!ubh) if (!ubh)
goto failed; goto failed;
usb1 = ubh_get_usb_first(USPI_UBH); usb1 = ubh_get_usb_first(uspi);
usb2 = ubh_get_usb_second(USPI_UBH); usb2 = ubh_get_usb_second(uspi);
usb3 = ubh_get_usb_third(USPI_UBH); usb3 = ubh_get_usb_third(uspi);
usb = (struct ufs_super_block *) usb = (struct ufs_super_block *)
((struct ufs_buffer_head *)uspi)->bh[0]->b_data ; ((struct ufs_buffer_head *)uspi)->bh[0]->b_data ;
...@@ -1006,8 +1003,8 @@ static void ufs_write_super (struct super_block *sb) { ...@@ -1006,8 +1003,8 @@ static void ufs_write_super (struct super_block *sb) {
UFSD(("ENTER\n")) UFSD(("ENTER\n"))
flags = UFS_SB(sb)->s_flags; flags = UFS_SB(sb)->s_flags;
uspi = UFS_SB(sb)->s_uspi; uspi = UFS_SB(sb)->s_uspi;
usb1 = ubh_get_usb_first(USPI_UBH); usb1 = ubh_get_usb_first(uspi);
usb3 = ubh_get_usb_third(USPI_UBH); usb3 = ubh_get_usb_third(uspi);
if (!(sb->s_flags & MS_RDONLY)) { if (!(sb->s_flags & MS_RDONLY)) {
usb1->fs_time = cpu_to_fs32(sb, get_seconds()); usb1->fs_time = cpu_to_fs32(sb, get_seconds());
...@@ -1049,8 +1046,8 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) ...@@ -1049,8 +1046,8 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data)
uspi = UFS_SB(sb)->s_uspi; uspi = UFS_SB(sb)->s_uspi;
flags = UFS_SB(sb)->s_flags; flags = UFS_SB(sb)->s_flags;
usb1 = ubh_get_usb_first(USPI_UBH); usb1 = ubh_get_usb_first(uspi);
usb3 = ubh_get_usb_third(USPI_UBH); usb3 = ubh_get_usb_third(uspi);
/* /*
* Allow the "check" option to be passed as a remount option. * Allow the "check" option to be passed as a remount option.
...@@ -1124,7 +1121,7 @@ static int ufs_statfs (struct super_block *sb, struct kstatfs *buf) ...@@ -1124,7 +1121,7 @@ static int ufs_statfs (struct super_block *sb, struct kstatfs *buf)
lock_kernel(); lock_kernel();
uspi = UFS_SB(sb)->s_uspi; uspi = UFS_SB(sb)->s_uspi;
usb1 = ubh_get_usb_first (USPI_UBH); usb1 = ubh_get_usb_first (uspi);
usb = (struct ufs_super_block *) usb = (struct ufs_super_block *)
((struct ufs_buffer_head *)uspi)->bh[0]->b_data ; ((struct ufs_buffer_head *)uspi)->bh[0]->b_data ;
......
...@@ -249,18 +249,28 @@ extern void _ubh_memcpyubh_(struct ufs_sb_private_info *, struct ufs_buffer_head ...@@ -249,18 +249,28 @@ extern void _ubh_memcpyubh_(struct ufs_sb_private_info *, struct ufs_buffer_head
/* /*
* macros to get important structures from ufs_buffer_head * macros and inline function to get important structures from ufs_sb_private_info
*/ */
#define ubh_get_usb_first(ubh) \
((struct ufs_super_block_first *)((ubh)->bh[0]->b_data))
#define ubh_get_usb_second(ubh) \ static inline void *get_usb_offset(struct ufs_sb_private_info *uspi,
((struct ufs_super_block_second *)((ubh)->\ unsigned int offset)
bh[UFS_SECTOR_SIZE >> uspi->s_fshift]->b_data + (UFS_SECTOR_SIZE & ~uspi->s_fmask))) {
unsigned int index;
index = offset >> uspi->s_fshift;
offset &= ~uspi->s_fmask;
return uspi->s_ubh.bh[index]->b_data + offset;
}
#define ubh_get_usb_first(uspi) \
((struct ufs_super_block_first *)get_usb_offset((uspi), 0))
#define ubh_get_usb_second(uspi) \
((struct ufs_super_block_second *)get_usb_offset((uspi), UFS_SECTOR_SIZE))
#define ubh_get_usb_third(uspi) \
((struct ufs_super_block_third *)get_usb_offset((uspi), 2*UFS_SECTOR_SIZE))
#define ubh_get_usb_third(ubh) \
((struct ufs_super_block_third *)((ubh)-> \
bh[UFS_SECTOR_SIZE*2 >> uspi->s_fshift]->b_data + (UFS_SECTOR_SIZE*2 & ~uspi->s_fmask)))
#define ubh_get_ucg(ubh) \ #define ubh_get_ucg(ubh) \
((struct ufs_cylinder_group *)((ubh)->bh[0]->b_data)) ((struct ufs_cylinder_group *)((ubh)->bh[0]->b_data))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment