|
|
1.1.1.2 root 1: /*
2: * linux/fs/truncate.c
3: *
4: * (C) 1991 Linus Torvalds
5: */
6:
1.1 root 7: #include <linux/sched.h>
8:
9: #include <sys/stat.h>
10:
1.1.1.3 ! root 11: static int free_ind(int dev,int block)
1.1 root 12: {
13: struct buffer_head * bh;
14: unsigned short * p;
15: int i;
1.1.1.3 ! root 16: int block_busy;
1.1 root 17:
18: if (!block)
1.1.1.3 ! root 19: return 1;
! 20: block_busy = 0;
1.1 root 21: if (bh=bread(dev,block)) {
22: p = (unsigned short *) bh->b_data;
23: for (i=0;i<512;i++,p++)
24: if (*p)
1.1.1.3 ! root 25: if (free_block(dev,*p)) {
! 26: *p = 0;
! 27: bh->b_dirt = 1;
! 28: } else
! 29: block_busy = 1;
1.1 root 30: brelse(bh);
31: }
1.1.1.3 ! root 32: if (block_busy)
! 33: return 0;
! 34: else
! 35: return free_block(dev,block);
1.1 root 36: }
37:
1.1.1.3 ! root 38: static int free_dind(int dev,int block)
1.1 root 39: {
40: struct buffer_head * bh;
41: unsigned short * p;
42: int i;
1.1.1.3 ! root 43: int block_busy;
1.1 root 44:
45: if (!block)
1.1.1.3 ! root 46: return 1;
! 47: block_busy = 0;
1.1 root 48: if (bh=bread(dev,block)) {
49: p = (unsigned short *) bh->b_data;
50: for (i=0;i<512;i++,p++)
51: if (*p)
1.1.1.3 ! root 52: if (free_ind(dev,*p)) {
! 53: *p = 0;
! 54: bh->b_dirt = 1;
! 55: } else
! 56: block_busy = 1;
1.1 root 57: brelse(bh);
58: }
1.1.1.3 ! root 59: if (block_busy)
! 60: return 0;
! 61: else
! 62: return free_block(dev,block);
1.1 root 63: }
64:
65: void truncate(struct m_inode * inode)
66: {
67: int i;
1.1.1.3 ! root 68: int block_busy;
1.1 root 69:
1.1.1.3 ! root 70: if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
! 71: S_ISLNK(inode->i_mode)))
1.1 root 72: return;
1.1.1.3 ! root 73: repeat:
! 74: block_busy = 0;
1.1 root 75: for (i=0;i<7;i++)
76: if (inode->i_zone[i]) {
1.1.1.3 ! root 77: if (free_block(inode->i_dev,inode->i_zone[i]))
! 78: inode->i_zone[i]=0;
! 79: else
! 80: block_busy = 1;
1.1 root 81: }
1.1.1.3 ! root 82: if (free_ind(inode->i_dev,inode->i_zone[7]))
! 83: inode->i_zone[7] = 0;
! 84: else
! 85: block_busy = 1;
! 86: if (free_dind(inode->i_dev,inode->i_zone[8]))
! 87: inode->i_zone[8] = 0;
! 88: else
! 89: block_busy = 1;
1.1 root 90: inode->i_dirt = 1;
1.1.1.3 ! root 91: if (block_busy) {
! 92: current->counter = 0;
! 93: schedule();
! 94: goto repeat;
! 95: }
! 96: inode->i_size = 0;
1.1 root 97: inode->i_mtime = inode->i_ctime = CURRENT_TIME;
98: }
99:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.