--- linux/fs/ext/inode.c 2018/04/24 18:10:42 1.1.1.1 +++ linux/fs/ext/inode.c 2018/04/24 18:12:24 1.1.1.2 @@ -1,21 +1,22 @@ /* * linux/fs/ext/inode.c * - * (C) 1992 Remy Card (card@masi.ibp.fr) + * Copyright (C) 1992 Remy Card (card@masi.ibp.fr) * * from * * linux/fs/minix/inode.c * - * (C) 1991 Linus Torvalds + * Copyright (C) 1991, 1992 Linus Torvalds */ -#include -#include #include #include #include #include +#include +#include + #include #include @@ -38,15 +39,15 @@ void ext_put_super(struct super_block *s sb->s_dev = 0; #ifdef EXTFS_BITMAP for(i = 0 ; i < EXT_I_MAP_SLOTS ; i++) - brelse(sb->s_imap[i]); + brelse(sb->u.ext_sb.s_imap[i]); for(i = 0 ; i < EXT_Z_MAP_SLOTS ; i++) - brelse(sb->s_zmap[i]); + brelse(sb->u.ext_sb.s_zmap[i]); #endif #ifdef EXTFS_FREELIST - if (sb->s_imap[1]) - brelse (sb->s_imap[1]); - if (sb->s_zmap[1]) - brelse (sb->s_zmap[1]); + if (sb->u.ext_sb.s_imap[1]) + brelse (sb->u.ext_sb.s_imap[1]); + if (sb->u.ext_sb.s_zmap[1]) + brelse (sb->u.ext_sb.s_zmap[1]); #endif free_super(sb); return; @@ -65,13 +66,13 @@ struct super_block *ext_read_super(struc { struct buffer_head *bh; struct ext_super_block *es; - int dev=s->s_dev,block; + int dev = s->s_dev,block; #ifdef EXTFS_BITMAP int i; #endif lock_super(s); - if (!(bh = bread(dev,1))) { + if (!(bh = bread(dev, 1, BLOCK_SIZE))) { s->s_dev=0; free_super(s); printk("bread failed\n"); @@ -80,21 +81,22 @@ struct super_block *ext_read_super(struc /* *((struct ext_super_block *) s) = *((struct ext_super_block *) bh->b_data); */ es = (struct ext_super_block *) bh->b_data; - s->s_ninodes = es->s_ninodes; - s->s_nzones = es->s_nzones; + s->s_blocksize = 1024; + s->u.ext_sb.s_ninodes = es->s_ninodes; + s->u.ext_sb.s_nzones = es->s_nzones; #ifdef EXTFS_BITMAP - s->s_imap_blocks = es->s_imap_blocks; - s->s_zmap_blocks = es->s_zmap_blocks; + s->u.ext_sb.s_imap_blocks = es->s_imap_blocks; + s->u.ext_sb.s_zmap_blocks = es->s_zmap_blocks; #endif - s->s_firstdatazone = es->s_firstdatazone; - s->s_log_zone_size = es->s_log_zone_size; - s->s_max_size = es->s_max_size; + s->u.ext_sb.s_firstdatazone = es->s_firstdatazone; + s->u.ext_sb.s_log_zone_size = es->s_log_zone_size; + s->u.ext_sb.s_max_size = es->s_max_size; s->s_magic = es->s_magic; #ifdef EXTFS_FREELIST - s->s_zmap[0] = (struct buffer_head *) es->s_firstfreeblock; - s->s_zmap[2] = (struct buffer_head *) es->s_freeblockscount; - s->s_imap[0] = (struct buffer_head *) es->s_firstfreeinode; - s->s_imap[2] = (struct buffer_head *) es->s_freeinodescount; + s->u.ext_sb.s_zmap[0] = (struct buffer_head *) es->s_firstfreeblock; + s->u.ext_sb.s_zmap[2] = (struct buffer_head *) es->s_freeblockscount; + s->u.ext_sb.s_imap[0] = (struct buffer_head *) es->s_firstfreeinode; + s->u.ext_sb.s_imap[2] = (struct buffer_head *) es->s_freeinodescount; #endif brelse(bh); if (s->s_magic != EXT_SUPER_MAGIC) { @@ -105,50 +107,50 @@ struct super_block *ext_read_super(struc } #ifdef EXTFS_BITMAP for (i=0;i < EXT_I_MAP_SLOTS;i++) - s->s_imap[i] = NULL; + s->u.ext_sb.s_imap[i] = NULL; for (i=0;i < EXT_Z_MAP_SLOTS;i++) - s->s_zmap[i] = NULL; + s->u.ext_sb.s_zmap[i] = NULL; block=2; - for (i=0 ; i < s->s_imap_blocks ; i++) - if (s->s_imap[i]=bread(dev,block)) + for (i=0 ; i < s->u.ext_sb.s_imap_blocks ; i++) + if (s->u.ext_sb.s_imap[i]=bread(dev, block, BLOCK_SIZE)) block++; else break; - for (i=0 ; i < s->s_zmap_blocks ; i++) - if (s->s_zmap[i]=bread(dev,block)) + for (i=0 ; i < s->u.ext_sb.s_zmap_blocks ; i++) + if (s->u.ext_sb.s_zmap[i]=bread(dev, block, BLOCK_SIZE)) block++; else break; - if (block != 2+s->s_imap_blocks+s->s_zmap_blocks) { + if (block != 2+s->u.ext_sb.s_imap_blocks+s->u.ext_sb.s_zmap_blocks) { for(i=0;is_imap[i]); + brelse(s->u.ext_sb.s_imap[i]); for(i=0;is_zmap[i]); + brelse(s->u.ext_sb.s_zmap[i]); s->s_dev=0; free_super(s); printk("block failed\n"); return NULL; } - s->s_imap[0]->b_data[0] |= 1; - s->s_zmap[0]->b_data[0] |= 1; + s->u.ext_sb.s_imap[0]->b_data[0] |= 1; + s->u.ext_sb.s_zmap[0]->b_data[0] |= 1; #endif #ifdef EXTFS_FREELIST - if (!s->s_zmap[0]) - s->s_zmap[1] = NULL; + if (!s->u.ext_sb.s_zmap[0]) + s->u.ext_sb.s_zmap[1] = NULL; else - if (!(s->s_zmap[1] = bread (dev, (unsigned long) s->s_zmap[0]))) { + if (!(s->u.ext_sb.s_zmap[1] = bread(dev, (unsigned long) s->u.ext_sb.s_zmap[0], BLOCK_SIZE))) { printk ("ext_read_super: unable to read first free block\n"); s->s_dev = 0; free_super(s); return NULL; } - if (!s->s_imap[0]) - s->s_imap[1] = NULL; + if (!s->u.ext_sb.s_imap[0]) + s->u.ext_sb.s_imap[1] = NULL; else { - block = 2 + (((unsigned long) s->s_imap[0]) - 1) / EXT_INODES_PER_BLOCK; - if (!(s->s_imap[1] = bread (dev, block))) { + block = 2 + (((unsigned long) s->u.ext_sb.s_imap[0]) - 1) / EXT_INODES_PER_BLOCK; + if (!(s->u.ext_sb.s_imap[1] = bread(dev, block, BLOCK_SIZE))) { printk ("ext_read_super: unable to read first free inode block\n"); - brelse(s->s_zmap[1]); + brelse(s->u.ext_sb.s_zmap[1]); s->s_dev = 0; free_super (s); return NULL; @@ -177,15 +179,15 @@ void ext_write_super (struct super_block #ifdef EXTFS_DEBUG printk ("ext_write_super called\n"); #endif - if (!(bh = bread (sb->s_dev, 1))) { + if (!(bh = bread(sb->s_dev, 1, BLOCK_SIZE))) { printk ("ext_write_super: bread failed\n"); return; } es = (struct ext_super_block *) bh->b_data; - es->s_firstfreeblock = (unsigned long) sb->s_zmap[0]; - es->s_freeblockscount = (unsigned long) sb->s_zmap[2]; - es->s_firstfreeinode = (unsigned long) sb->s_imap[0]; - es->s_freeinodescount = (unsigned long) sb->s_imap[2]; + es->s_firstfreeblock = (unsigned long) sb->u.ext_sb.s_zmap[0]; + es->s_freeblockscount = (unsigned long) sb->u.ext_sb.s_zmap[2]; + es->s_firstfreeinode = (unsigned long) sb->u.ext_sb.s_imap[0]; + es->s_freeinodescount = (unsigned long) sb->u.ext_sb.s_imap[2]; bh->b_dirt = 1; brelse (bh); sb->s_dirt = 0; @@ -198,11 +200,11 @@ void ext_statfs (struct super_block *sb, put_fs_long(EXT_SUPER_MAGIC, &buf->f_type); put_fs_long(1024, &buf->f_bsize); - put_fs_long(sb->s_nzones << sb->s_log_zone_size, &buf->f_blocks); + put_fs_long(sb->u.ext_sb.s_nzones << sb->u.ext_sb.s_log_zone_size, &buf->f_blocks); tmp = ext_count_free_blocks(sb); put_fs_long(tmp, &buf->f_bfree); put_fs_long(tmp, &buf->f_bavail); - put_fs_long(sb->s_ninodes, &buf->f_files); + put_fs_long(sb->u.ext_sb.s_ninodes, &buf->f_files); put_fs_long(ext_count_free_inodes(sb), &buf->f_ffree); /* Don't know what value to put in buf->f_fsid */ } @@ -237,7 +239,7 @@ static int _ext_bmap(struct inode * inod } if (!inode->i_data[9]) return 0; - if (!(bh = bread(inode->i_dev,inode->i_data[9]))) + if (!(bh = bread(inode->i_dev, inode->i_data[9], BLOCK_SIZE))) return 0; i = ((unsigned long *) (bh->b_data))[block]; if (create && !i) @@ -257,7 +259,7 @@ static int _ext_bmap(struct inode * inod } if (!inode->i_data[10]) return 0; - if (!(bh=bread(inode->i_dev,inode->i_data[10]))) + if (!(bh=bread(inode->i_dev, inode->i_data[10], BLOCK_SIZE))) return 0; i = ((unsigned long *)bh->b_data)[block>>8]; if (create && !i) @@ -268,7 +270,7 @@ static int _ext_bmap(struct inode * inod brelse(bh); if (!i) return 0; - if (!(bh=bread(inode->i_dev,i))) + if (!(bh=bread(inode->i_dev, i, BLOCK_SIZE))) return 0; i = ((unsigned long *)bh->b_data)[block&255]; if (create && !i) @@ -279,6 +281,46 @@ static int _ext_bmap(struct inode * inod brelse(bh); return i; } + if (create && !inode->i_data[11]) + if (inode->i_data[11] = ext_new_block(inode->i_dev)) { + inode->i_dirt = 1; + inode->i_ctime = CURRENT_TIME; + } + if (!inode->i_data[11]) + return 0; + if (!(bh = bread(inode->i_dev, inode->i_data[11], BLOCK_SIZE))) + return 0; + i = ((unsigned long *) bh->b_data)[block >> 16]; + if (create && !i) + if (i = ext_new_block(inode->i_dev)) { + ((unsigned long *) bh->b_data)[block >> 16] = i; + bh->b_dirt = 1; + } + brelse (bh); + if (!i) + return 0; + if (!(bh = bread(inode->i_dev, i, BLOCK_SIZE))) + return 0; + i = ((unsigned long *) bh->b_data)[(block >> 8) & 255]; + if (create && !i) + if (i = ext_new_block(inode->i_dev)) { + ((unsigned long *) bh->b_data)[(block >> 8) & 255] = i; + bh->b_dirt = 1; + } + brelse (bh); + if (!i) + return 0; + if (!(bh = bread(inode->i_dev, i, BLOCK_SIZE))) + return 0; + i = ((unsigned long *) bh->b_data)[block & 255]; + if (create && !i) + if (i = ext_new_block(inode->i_dev)) { + ((unsigned long *) bh->b_data)[block & 255] = i; + bh->b_dirt = 1; + } + brelse (bh); + return i; + printk("ext_bmap: triple indirection not yet implemented\n"); return 0; } @@ -300,13 +342,13 @@ void ext_read_inode(struct inode * inode int block; #ifdef EXTFS_BITMAP - block = 2 + inode->i_sb->s_imap_blocks + inode->i_sb->s_zmap_blocks + + block = 2 + inode->i_sb->u.ext_sb.s_imap_blocks + inode->i_sb->u.ext_sb.s_zmap_blocks + (inode->i_ino-1)/EXT_INODES_PER_BLOCK; #endif #ifdef EXTFS_FREELIST block = 2 + (inode->i_ino-1)/EXT_INODES_PER_BLOCK; #endif - if (!(bh=bread(inode->i_dev,block))) + if (!(bh=bread(inode->i_dev, block, BLOCK_SIZE))) panic("unable to read i-node block"); raw_inode = ((struct ext_inode *) bh->b_data) + (inode->i_ino-1)%EXT_INODES_PER_BLOCK; @@ -348,13 +390,13 @@ void ext_write_inode(struct inode * inod int block; #ifdef EXTFS_BITMAP - block = 2 + inode->i_sb->s_imap_blocks + inode->i_sb->s_zmap_blocks + + block = 2 + inode->i_sb->u.ext_sb.s_imap_blocks + inode->i_sb->u.ext_sb.s_zmap_blocks + (inode->i_ino-1)/EXT_INODES_PER_BLOCK; #endif #ifdef EXTFS_FREELIST block = 2 + (inode->i_ino-1)/EXT_INODES_PER_BLOCK; #endif - if (!(bh=bread(inode->i_dev,block))) + if (!(bh=bread(inode->i_dev, block, BLOCK_SIZE))) panic("unable to read i-node block"); raw_inode = ((struct ext_inode *)bh->b_data) + (inode->i_ino-1)%EXT_INODES_PER_BLOCK;