|
|
1.1 ! root 1: #include <linux/sched.h> ! 2: ! 3: #include <sys/stat.h> ! 4: ! 5: static void free_ind(int dev,int block) ! 6: { ! 7: struct buffer_head * bh; ! 8: unsigned short * p; ! 9: int i; ! 10: ! 11: if (!block) ! 12: return; ! 13: if (bh=bread(dev,block)) { ! 14: p = (unsigned short *) bh->b_data; ! 15: for (i=0;i<512;i++,p++) ! 16: if (*p) ! 17: free_block(dev,*p); ! 18: brelse(bh); ! 19: } ! 20: free_block(dev,block); ! 21: } ! 22: ! 23: static void free_dind(int dev,int block) ! 24: { ! 25: struct buffer_head * bh; ! 26: unsigned short * p; ! 27: int i; ! 28: ! 29: if (!block) ! 30: return; ! 31: if (bh=bread(dev,block)) { ! 32: p = (unsigned short *) bh->b_data; ! 33: for (i=0;i<512;i++,p++) ! 34: if (*p) ! 35: free_ind(dev,*p); ! 36: brelse(bh); ! 37: } ! 38: free_block(dev,block); ! 39: } ! 40: ! 41: void truncate(struct m_inode * inode) ! 42: { ! 43: int i; ! 44: ! 45: if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode))) ! 46: return; ! 47: for (i=0;i<7;i++) ! 48: if (inode->i_zone[i]) { ! 49: free_block(inode->i_dev,inode->i_zone[i]); ! 50: inode->i_zone[i]=0; ! 51: } ! 52: free_ind(inode->i_dev,inode->i_zone[7]); ! 53: free_dind(inode->i_dev,inode->i_zone[8]); ! 54: inode->i_zone[7] = inode->i_zone[8] = 0; ! 55: inode->i_size = 0; ! 56: inode->i_dirt = 1; ! 57: inode->i_mtime = inode->i_ctime = CURRENT_TIME; ! 58: } ! 59:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.