|
|
1.1 ! root 1: /* ! 2: * linux/fs/minix/inode.c ! 3: * ! 4: * (C) 1991 Linus Torvalds ! 5: */ ! 6: ! 7: #include <string.h> ! 8: #include <sys/stat.h> ! 9: ! 10: #include <linux/sched.h> ! 11: #include <linux/minix_fs.h> ! 12: #include <linux/kernel.h> ! 13: #include <linux/mm.h> ! 14: #include <asm/system.h> ! 15: ! 16: static int _bmap(struct inode * inode,int block,int create) ! 17: { ! 18: struct buffer_head * bh; ! 19: int i; ! 20: ! 21: if (block<0) ! 22: panic("_bmap: block<0"); ! 23: if (block >= 7+512+512*512) ! 24: panic("_bmap: block>big"); ! 25: if (block<7) { ! 26: if (create && !inode->i_data[block]) ! 27: if (inode->i_data[block]=minix_new_block(inode->i_dev)) { ! 28: inode->i_ctime=CURRENT_TIME; ! 29: inode->i_dirt=1; ! 30: } ! 31: return inode->i_data[block]; ! 32: } ! 33: block -= 7; ! 34: if (block<512) { ! 35: if (create && !inode->i_data[7]) ! 36: if (inode->i_data[7]=minix_new_block(inode->i_dev)) { ! 37: inode->i_dirt=1; ! 38: inode->i_ctime=CURRENT_TIME; ! 39: } ! 40: if (!inode->i_data[7]) ! 41: return 0; ! 42: if (!(bh = bread(inode->i_dev,inode->i_data[7]))) ! 43: return 0; ! 44: i = ((unsigned short *) (bh->b_data))[block]; ! 45: if (create && !i) ! 46: if (i=minix_new_block(inode->i_dev)) { ! 47: ((unsigned short *) (bh->b_data))[block]=i; ! 48: bh->b_dirt=1; ! 49: } ! 50: brelse(bh); ! 51: return i; ! 52: } ! 53: block -= 512; ! 54: if (create && !inode->i_data[8]) ! 55: if (inode->i_data[8]=minix_new_block(inode->i_dev)) { ! 56: inode->i_dirt=1; ! 57: inode->i_ctime=CURRENT_TIME; ! 58: } ! 59: if (!inode->i_data[8]) ! 60: return 0; ! 61: if (!(bh=bread(inode->i_dev,inode->i_data[8]))) ! 62: return 0; ! 63: i = ((unsigned short *)bh->b_data)[block>>9]; ! 64: if (create && !i) ! 65: if (i=minix_new_block(inode->i_dev)) { ! 66: ((unsigned short *) (bh->b_data))[block>>9]=i; ! 67: bh->b_dirt=1; ! 68: } ! 69: brelse(bh); ! 70: if (!i) ! 71: return 0; ! 72: if (!(bh=bread(inode->i_dev,i))) ! 73: return 0; ! 74: i = ((unsigned short *)bh->b_data)[block&511]; ! 75: if (create && !i) ! 76: if (i=minix_new_block(inode->i_dev)) { ! 77: ((unsigned short *) (bh->b_data))[block&511]=i; ! 78: bh->b_dirt=1; ! 79: } ! 80: brelse(bh); ! 81: return i; ! 82: } ! 83: ! 84: int minix_bmap(struct inode * inode,int block) ! 85: { ! 86: return _bmap(inode,block,0); ! 87: } ! 88: ! 89: int minix_create_block(struct inode * inode, int block) ! 90: { ! 91: return _bmap(inode,block,1); ! 92: } ! 93: ! 94: void minix_read_inode(struct inode * inode) ! 95: { ! 96: struct buffer_head * bh; ! 97: struct minix_inode * raw_inode; ! 98: int block; ! 99: ! 100: block = 2 + inode->i_sb->s_imap_blocks + inode->i_sb->s_zmap_blocks + ! 101: (inode->i_ino-1)/MINIX_INODES_PER_BLOCK; ! 102: if (!(bh=bread(inode->i_dev,block))) ! 103: panic("unable to read i-node block"); ! 104: raw_inode = ((struct minix_inode *) bh->b_data) + ! 105: (inode->i_ino-1)%MINIX_INODES_PER_BLOCK; ! 106: inode->i_mode = raw_inode->i_mode; ! 107: inode->i_uid = raw_inode->i_uid; ! 108: inode->i_gid = raw_inode->i_gid; ! 109: inode->i_nlink = raw_inode->i_nlinks; ! 110: inode->i_size = raw_inode->i_size; ! 111: inode->i_mtime = inode->i_atime = inode->i_ctime = raw_inode->i_time; ! 112: if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) ! 113: inode->i_rdev = raw_inode->i_zone[0]; ! 114: else for (block = 0; block < 9; block++) ! 115: inode->i_data[block] = raw_inode->i_zone[block]; ! 116: brelse(bh); ! 117: inode->i_op = &minix_inode_operations; ! 118: } ! 119: ! 120: void minix_write_inode(struct inode * inode) ! 121: { ! 122: struct buffer_head * bh; ! 123: struct minix_inode * raw_inode; ! 124: int block; ! 125: ! 126: block = 2 + inode->i_sb->s_imap_blocks + inode->i_sb->s_zmap_blocks + ! 127: (inode->i_ino-1)/MINIX_INODES_PER_BLOCK; ! 128: if (!(bh=bread(inode->i_dev,block))) ! 129: panic("unable to read i-node block"); ! 130: raw_inode = ((struct minix_inode *)bh->b_data) + ! 131: (inode->i_ino-1)%MINIX_INODES_PER_BLOCK; ! 132: raw_inode->i_mode = inode->i_mode; ! 133: raw_inode->i_uid = inode->i_uid; ! 134: raw_inode->i_gid = inode->i_gid; ! 135: raw_inode->i_nlinks = inode->i_nlink; ! 136: raw_inode->i_size = inode->i_size; ! 137: raw_inode->i_time = inode->i_mtime; ! 138: if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) ! 139: raw_inode->i_zone[0] = inode->i_rdev; ! 140: else for (block = 0; block < 9; block++) ! 141: raw_inode->i_zone[block] = inode->i_data[block]; ! 142: bh->b_dirt=1; ! 143: inode->i_dirt=0; ! 144: brelse(bh); ! 145: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.