Annotation of linux/fs/minix/dir.c, revision 1.1.1.3

1.1       root        1: /*
1.1.1.2   root        2:  *  linux/fs/minix/dir.c
1.1       root        3:  *
1.1.1.3 ! root        4:  *  Copyright (C) 1991, 1992 Linus Torvalds
1.1.1.2   root        5:  *
                      6:  *  minix directory handling functions
1.1       root        7:  */
                      8: 
                      9: #include <asm/segment.h>
                     10: 
1.1.1.3 ! root       11: #include <linux/errno.h>
1.1       root       12: #include <linux/fs.h>
                     13: #include <linux/minix_fs.h>
1.1.1.2   root       14: #include <linux/stat.h>
1.1       root       15: 
                     16: static int minix_readdir(struct inode *, struct file *, struct dirent *, int);
                     17: 
                     18: static struct file_operations minix_dir_operations = {
                     19:        NULL,                   /* lseek - default */
                     20:        minix_file_read,        /* read */
                     21:        NULL,                   /* write - bad */
                     22:        minix_readdir,          /* readdir */
                     23:        NULL,                   /* select - default */
                     24:        NULL,                   /* ioctl - default */
                     25:        NULL,                   /* no special open code */
                     26:        NULL                    /* no special release code */
                     27: };
                     28: 
                     29: /*
                     30:  * directories can handle most operations...
                     31:  */
                     32: struct inode_operations minix_dir_inode_operations = {
                     33:        &minix_dir_operations,  /* default directory file-ops */
                     34:        minix_create,           /* create */
                     35:        minix_lookup,           /* lookup */
                     36:        minix_link,             /* link */
                     37:        minix_unlink,           /* unlink */
                     38:        minix_symlink,          /* symlink */
                     39:        minix_mkdir,            /* mkdir */
                     40:        minix_rmdir,            /* rmdir */
                     41:        minix_mknod,            /* mknod */
                     42:        minix_rename,           /* rename */
                     43:        NULL,                   /* readlink */
                     44:        NULL,                   /* follow_link */
                     45:        minix_bmap,             /* bmap */
                     46:        minix_truncate          /* truncate */
                     47: };
                     48: 
                     49: static int minix_readdir(struct inode * inode, struct file * filp,
                     50:        struct dirent * dirent, int count)
                     51: {
                     52:        unsigned int block,offset,i;
                     53:        char c;
                     54:        struct buffer_head * bh;
                     55:        struct minix_dir_entry * de;
                     56: 
                     57:        if (!inode || !S_ISDIR(inode->i_mode))
                     58:                return -EBADF;
                     59:        if (filp->f_pos & (sizeof (struct minix_dir_entry) - 1))
                     60:                return -EBADF;
                     61:        while (filp->f_pos < inode->i_size) {
                     62:                offset = filp->f_pos & 1023;
                     63:                block = minix_bmap(inode,(filp->f_pos)>>BLOCK_SIZE_BITS);
1.1.1.3 ! root       64:                if (!block || !(bh = bread(inode->i_dev,block,BLOCK_SIZE))) {
1.1       root       65:                        filp->f_pos += 1024-offset;
                     66:                        continue;
                     67:                }
                     68:                de = (struct minix_dir_entry *) (offset + bh->b_data);
                     69:                while (offset < 1024 && filp->f_pos < inode->i_size) {
                     70:                        offset += sizeof (struct minix_dir_entry);
                     71:                        filp->f_pos += sizeof (struct minix_dir_entry);
                     72:                        if (de->inode) {
                     73:                                for (i = 0; i < MINIX_NAME_LEN; i++)
                     74:                                        if (c = de->name[i])
                     75:                                                put_fs_byte(c,i+dirent->d_name);
                     76:                                        else
                     77:                                                break;
                     78:                                if (i) {
                     79:                                        put_fs_long(de->inode,&dirent->d_ino);
                     80:                                        put_fs_byte(0,i+dirent->d_name);
                     81:                                        put_fs_word(i,&dirent->d_reclen);
                     82:                                        brelse(bh);
                     83:                                        return i;
                     84:                                }
                     85:                        }
                     86:                        de++;
                     87:                }
                     88:                brelse(bh);
                     89:        }
                     90:        return 0;
                     91: }

unix.superglobalmegacorp.com

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