Annotation of linux/fs/truncate.c, revision 1.1.1.3

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.