ufs2 write: inodes write
RFC PATCH 2/3 ufs2 write: inodes write
This patch adds into write inode path function to write UFS2 inode,
and modifys allocate inode path to allocate and init additional inode chunks.
Also some cleanups:
- remove not used parameters in some functions
- remove i_gen field from ufs_inode_info structure, there is i_generation in inode structure with same purposes.
Signed-off-by Evgeniy Dushistov <[email protected]>
---
fs/ufs/inode.c +80 -31
@@ -616,8 +616,8 @@ static void ufs1_read_inode(struct inode inode->i_atime.tv_nsec =0 ; inode->i_ctime.tv_nsec =0 ; inode->i_blocks =fs32_to_cpu (sb, ufs_inode->ui_blocks); + inode->i_generation =fs32_to_cpu (sb, ufs_inode->ui_gen); ufsi->i_flags =fs32_to_cpu (sb, ufs_inode->ui_flags); - ufsi->i_gen =fs32_to_cpu (sb, ufs_inode->ui_gen); ufsi->i_shadow =fs32_to_cpu (sb, ufs_inode->ui_u3.ui_sun.ui_shadow); ufsi->i_oeftflag =fs32_to_cpu (sb, ufs_inode->ui_u3.ui_sun.ui_oeftflag);
@@ -661,8 +661,8 @@ static void ufs2_read_inode(struct inode inode->i_atime.tv_nsec =0 ; inode->i_ctime.tv_nsec =0 ; inode->i_blocks =fs64_to_cpu (sb, ufs2_inode->ui_blocks); + inode->i_generation =fs32_to_cpu (sb, ufs2_inode->ui_gen); ufsi->i_flags =fs32_to_cpu (sb, ufs2_inode->ui_flags); - ufsi->i_gen =fs32_to_cpu (sb, ufs2_inode->ui_gen);/* ufsi->i_shadow = fs32_to_cpu(sb, ufs_inode->ui_u3.ui_sun.ui_shadow); ufsi->i_oeftflag = fs32_to_cpu(sb, ufs_inode->ui_u3.ui_sun.ui_oeftflag);
@@ -731,34 +731,11 @@ bad_inode:make_bad_inode (inode); } -static int ufs_update_inode (struct inode * inode,int do_sync) +static void ufs1_update_inode (struct inode *inode,struct ufs_inode *ufs_inode) { -struct ufs_inode_info *ufsi =UFS_I (inode); -struct super_block * sb; -struct ufs_sb_private_info * uspi; -struct buffer_head * bh; -struct ufs_inode * ufs_inode; -unsigned i; -unsigned flags; - -UFSD ("ENTER, ino %lu\n" , inode->i_ino); - - sb = inode->i_sb; - uspi =UFS_SB (sb)->s_uspi; - flags =UFS_SB (sb)->s_flags; - -if (inode->i_ino <UFS_ROOTINO || - inode->i_ino > (uspi->s_ncg * uspi->s_ipg)) { -ufs_warning (sb,"ufs_read_inode" ,"bad inode number (%lu)\n" , inode->i_ino); -return -1 ; - } - - bh =sb_bread (sb,ufs_inotofsba (inode->i_ino)); -if (!bh) { -ufs_warning (sb,"ufs_read_inode" ,"unable to read inode %lu\n" , inode->i_ino); -return -1 ; - } - ufs_inode = (struct ufs_inode *) (bh->b_data +ufs_inotofsbo (inode->i_ino) *sizeof (struct ufs_inode )); +struct super_block *sb = inode->i_sb; +struct ufs_inode_info *ufsi =UFS_I (inode); +unsigned i; ufs_inode->ui_mode =cpu_to_fs16 (sb, inode->i_mode); ufs_inode->ui_nlink =cpu_to_fs16 (sb, inode->i_nlink);
@@ -775,9 +752,9 @@ static int ufs_update_inode(struct inode ufs_inode->ui_mtime.tv_usec =0 ; ufs_inode->ui_blocks =cpu_to_fs32 (sb, inode->i_blocks); ufs_inode->ui_flags =cpu_to_fs32 (sb, ufsi->i_flags); - ufs_inode->ui_gen =cpu_to_fs32 (sb, ufsi->i_gen); + ufs_inode->ui_gen =cpu_to_fs32 (sb, inode->i_generation); -if ((flags &UFS_UID_MASK ) ==UFS_UID_EFT ) { +if ((UFS_SB (sb)->s_flags &UFS_UID_MASK ) ==UFS_UID_EFT ) { ufs_inode->ui_u3.ui_sun.ui_shadow =cpu_to_fs32 (sb, ufsi->i_shadow); ufs_inode->ui_u3.ui_sun.ui_oeftflag =cpu_to_fs32 (sb, ufsi->i_oeftflag); }
@@ -796,6 +773,78 @@ static int ufs_update_inode(struct inodeif (!inode->i_nlink)memset (ufs_inode,0 ,sizeof (struct ufs_inode )); +} + +static void ufs2_update_inode (struct inode *inode,struct ufs2_inode *ufs_inode) +{ +struct super_block *sb = inode->i_sb; +struct ufs_inode_info *ufsi =UFS_I (inode); +unsigned i; + +UFSD ("ENTER\n" ); + ufs_inode->ui_mode =cpu_to_fs16 (sb, inode->i_mode); + ufs_inode->ui_nlink =cpu_to_fs16 (sb, inode->i_nlink); + + ufs_inode->ui_uid =cpu_to_fs32 (sb, inode->i_uid); + ufs_inode->ui_gid =cpu_to_fs32 (sb, inode->i_gid); + + ufs_inode->ui_size =cpu_to_fs64 (sb, inode->i_size); + ufs_inode->ui_atime.tv_sec =cpu_to_fs32 (sb, inode->i_atime.tv_sec); + ufs_inode->ui_atime.tv_usec =0 ; + ufs_inode->ui_ctime.tv_sec =cpu_to_fs32 (sb, inode->i_ctime.tv_sec); + ufs_inode->ui_ctime.tv_usec =0 ; + ufs_inode->ui_mtime.tv_sec =cpu_to_fs32 (sb, inode->i_mtime.tv_sec); + ufs_inode->ui_mtime.tv_usec =0 ; + + ufs_inode->ui_blocks =cpu_to_fs64 (sb, inode->i_blocks); + ufs_inode->ui_flags =cpu_to_fs32 (sb, ufsi->i_flags); + ufs_inode->ui_gen =cpu_to_fs32 (sb, inode->i_generation); + +if (S_ISCHR (inode->i_mode) ||S_ISBLK (inode->i_mode)) { +/* ufs_inode->ui_u2.ui_addr.ui_db[0] = cpu_to_fs32(sb, inode->i_rdev); */ + ufs_inode->ui_u2.ui_addr.ui_db[0 ] = ufsi->i_u1.u2_i_data[0 ]; + }else if (inode->i_blocks) { +for (i =0 ; i < (UFS_NDADDR +UFS_NINDIR ); i++) + ufs_inode->ui_u2.ui_addr.ui_db[i] = ufsi->i_u1.u2_i_data[i]; + }else { +for (i =0 ; i < (UFS_NDADDR +UFS_NINDIR ) *4 ; i++) + ufs_inode->ui_u2.ui_symlink[i] = ufsi->i_u1.i_symlink[i]; + } + +if (!inode->i_nlink) +memset (ufs_inode,0 ,sizeof (struct ufs2_inode )); +UFSD ("EXIT\n" ); +} + +static int ufs_update_inode (struct inode * inode,int do_sync) +{ +struct super_block *sb = inode->i_sb; +struct ufs_sb_private_info *uspi =UFS_SB (sb)->s_uspi; +struct buffer_head * bh; + +UFSD ("ENTER, ino %lu\n" , inode->i_ino); + +if (inode->i_ino <UFS_ROOTINO || + inode->i_ino > (uspi->s_ncg * uspi->s_ipg)) { +ufs_warning (sb,"ufs_read_inode" ,"bad inode number (%lu)\n" , inode->i_ino); +return -1 ; + } + + bh =sb_bread (sb,ufs_inotofsba (inode->i_ino)); +if (!bh) { +ufs_warning (sb,"ufs_read_inode" ,"unable to read inode %lu\n" , inode->i_ino); +return -1 ; + } +if (uspi->fs_magic ==UFS2_MAGIC ) { +struct ufs2_inode *ufs2_inode = (struct ufs2_inode *)bh->b_data; + +ufs2_update_inode (inode, + ufs2_inode +ufs_inotofsbo (inode->i_ino)); + }else { +struct ufs_inode *ufs_inode = (struct ufs_inode *) bh->b_data; + +ufs1_update_inode (inode, ufs_inode +ufs_inotofsbo (inode->i_ino)); + }mark_buffer_dirty (bh);if (do_sync)
fs/ufs/super.c +23 -13
@@ -95,14 +95,16 @@/* * Print contents of ufs_super_block, useful for debugging */ -static void ufs_print_super_stuff (struct super_block *sb,unsigned flags, +static void ufs_print_super_stuff (struct super_block *sb,struct ufs_super_block_first *usb1,struct ufs_super_block_second *usb2,struct ufs_super_block_third *usb3) { +u32 magic =fs32_to_cpu (sb, usb3->fs_magic); +printk ("ufs_print_super_stuff\n" ); -printk (" magic: 0x%x\n" ,fs32_to_cpu (sb, usb3->fs_magic)); -if ((flags &UFS_TYPE_MASK ) ==UFS_TYPE_UFS2 ) { +printk (" magic: 0x%x\n" , magic); +if (fs32_to_cpu (sb, usb3->fs_magic) ==UFS2_MAGIC ) {printk (" fs_size: %llu\n" , (unsigned long long )fs64_to_cpu (sb, usb3->fs_un1.fs_u2.fs_size)); printk(" fs_dsize: %llu\n", (unsigned long long)
@@ -119,6 +121,12 @@ static void ufs_print_super_stuff(structprintk (" cs_nbfree(No of free blocks): %llu\n" , (unsigned long long )fs64_to_cpu (sb, usb2->fs_un.fs_u2.cs_nbfree)); +printk (KERN_INFO " cs_nifree(Num of free inodes): %llu\n" , + (unsigned long long ) +fs64_to_cpu (sb, usb3->fs_un1.fs_u2.cs_nifree)); +printk (KERN_INFO " cs_nffree(Num of free frags): %llu\n" , + (unsigned long long ) +fs64_to_cpu (sb, usb3->fs_un1.fs_u2.cs_nffree)); }else {printk (" sblkno: %u\n" ,fs32_to_cpu (sb, usb1->fs_sblkno));printk (" cblkno: %u\n" ,fs32_to_cpu (sb, usb1->fs_cblkno));
@@ -201,7 +209,7 @@ static void ufs_print_cylinder_stuff(str printk("\n"); }#else -# define ufs_print_super_stuff (sb, flags, usb1, usb2, usb3)/**/ +# define ufs_print_super_stuff (sb, usb1, usb2, usb3)/**/ # define ufs_print_cylinder_stuff (sb, cg)/**/ #endif /* CONFIG_UFS_DEBUG */
@@ -424,7 +432,6 @@ static int ufs_read_cylinder_structures( {struct ufs_sb_info *sbi =UFS_SB (sb);struct ufs_sb_private_info *uspi = sbi->s_uspi; -unsigned flags = sbi->s_flags;struct ufs_buffer_head * ubh;unsigned char * base, * space;unsigned size, blks, i;
@@ -448,11 +455,7 @@ static int ufs_read_cylinder_structures(if (i + uspi->s_fpb > blks) size = (blks - i) * uspi->s_fsize; -if ((flags &UFS_TYPE_MASK ) ==UFS_TYPE_UFS2 ) - ubh =ubh_bread (sb, -fs64_to_cpu (sb, usb3->fs_un1.fs_u2.fs_csaddr) + i, size); -else - ubh =ubh_bread (sb, uspi->s_csaddr + i, size); + ubh =ubh_bread (sb, uspi->s_csaddr + i, size);if (!ubh) goto failed;
@@ -547,6 +550,7 @@ static void ufs_put_cstotal(struct supercpu_to_fs32 (sb, uspi->cs_total.cs_nffree); }ubh_mark_buffer_dirty (USPI_UBH (uspi)); +ufs_print_super_stuff (sb, usb1, usb2, usb3);UFSD ("EXIT\n" ); }
@@ -574,7 +578,9 @@ static void ufs_put_super_internal(struc size = uspi->s_bsize;if (i + uspi->s_fpb > blks) size = (blks - i) * uspi->s_fsize; + ubh =ubh_bread (sb, uspi->s_csaddr + i, size); +ubh_memcpyubh (ubh, space, size); space += size;ubh_mark_buffer_uptodate (ubh,1 );
@@ -885,7 +891,7 @@ magic_found: } -ufs_print_super_stuff (sb, flags, usb1, usb2, usb3); +ufs_print_super_stuff (sb, usb1, usb2, usb3);/* * Check, if file system was correctly unmounted.
@@ -968,7 +974,12 @@ magic_found: uspi->s_npsect =ufs_get_fs_npsect (sb, usb1, usb3); uspi->s_interleave =fs32_to_cpu (sb, usb1->fs_interleave); uspi->s_trackskew =fs32_to_cpu (sb, usb1->fs_trackskew); - uspi->s_csaddr =fs32_to_cpu (sb, usb1->fs_csaddr); + +if (uspi->fs_magic ==UFS2_MAGIC ) + uspi->s_csaddr =fs64_to_cpu (sb, usb3->fs_un1.fs_u2.fs_csaddr); +else + uspi->s_csaddr =fs32_to_cpu (sb, usb1->fs_csaddr); + uspi->s_cssize =fs32_to_cpu (sb, usb1->fs_cssize); uspi->s_cgsize =fs32_to_cpu (sb, usb1->fs_cgsize); uspi->s_ntrak =fs32_to_cpu (sb, usb1->fs_ntrak);
@@ -1055,7 +1066,6 @@ static void ufs_write_super(struct superunsigned flags;lock_kernel (); -UFSD ("ENTER\n" ); flags =UFS_SB (sb)->s_flags; uspi =UFS_SB (sb)->s_uspi;
include/linux/ufs_fs.h +2 -2
@@ -261,7 +261,7 @@ typedef __u16 __bitwise __fs16;*/ #define ufs_inotocg (x) ((x) / uspi->s_ipg)#define ufs_inotocgoff (x) ((x) % uspi->s_ipg) -#define ufs_inotofsba (x) (ufs_cgimin(ufs_inotocg(x)) + ufs_inotocgoff(x) / uspi->s_inopf) +#define ufs_inotofsba (x) (((u64)ufs_cgimin(ufs_inotocg(x))) + ufs_inotocgoff(x) / uspi->s_inopf)#define ufs_inotofsbo (x) ((x) % uspi->s_inopf)/*
@@ -754,7 +754,7 @@ struct ufs_sb_private_info {__u32 s_npsect;/* # sectors/track including spares */ __u32 s_interleave;/* hardware sector interleave */ __u32 s_trackskew;/* sector 0 skew, per track */ -__u32 s_csaddr;/* blk addr of cyl grp summary area */ +__u64 s_csaddr;/* blk addr of cyl grp summary area */ __u32 s_cssize;/* size of cyl grp summary area */ __u32 s_cgsize;/* cylinder group size */ __u32 s_ntrak;/* tracks per cylinder */
fs/ufs/ialloc.c +103 -13
201 lines not on this page · raw message
include/linux/ufs_fs_i.h +0 -1
@@ -20,7 +20,6 @@ struct ufs_inode_info {__fs64 u2_i_data[15 ]; } i_u1;__u32 i_flags; -__u32 i_gen;__u32 i_shadow;__u32 i_unused1;__u32 i_unused2;
Signature · 1 line
/Evgeniy