~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Linux Cross Reference
Linux/fs/minix/dir.c

Version: ~ [ 2.4.0 ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  *  linux/fs/minix/dir.c
  3  *
  4  *  Copyright (C) 1991, 1992 Linus Torvalds
  5  *
  6  *  minix directory handling functions
  7  */
  8 
  9 #include <linux/string.h>
 10 #include <linux/errno.h>
 11 #include <linux/fs.h>
 12 #include <linux/minix_fs.h>
 13 #include <linux/stat.h>
 14 
 15 static int minix_readdir(struct file *, void *, filldir_t);
 16 
 17 struct file_operations minix_dir_operations = {
 18         read:           generic_read_dir,
 19         readdir:        minix_readdir,
 20         fsync:          file_fsync,
 21 };
 22 
 23 static int minix_readdir(struct file * filp,
 24         void * dirent, filldir_t filldir)
 25 {
 26         unsigned int offset;
 27         struct buffer_head * bh;
 28         struct minix_dir_entry * de;
 29         struct minix_sb_info * info;
 30         struct inode *inode = filp->f_dentry->d_inode;
 31 
 32         info = &inode->i_sb->u.minix_sb;
 33         if (filp->f_pos & (info->s_dirsize - 1))
 34                 return -EBADF;
 35         while (filp->f_pos < inode->i_size) {
 36                 offset = filp->f_pos & 1023;
 37                 bh = minix_bread(inode,(filp->f_pos)>>BLOCK_SIZE_BITS,0);
 38                 if (!bh) {
 39                         filp->f_pos += 1024-offset;
 40                         continue;
 41                 }
 42                 do {
 43                         de = (struct minix_dir_entry *) (offset + bh->b_data);
 44                         if (de->inode) {
 45                                 int size = strnlen(de->name, info->s_namelen);
 46                                 if (filldir(dirent, de->name, size, filp->f_pos, de->inode, DT_UNKNOWN) < 0) {
 47                                         brelse(bh);
 48                                         return 0;
 49                                 }
 50                         }
 51                         offset += info->s_dirsize;
 52                         filp->f_pos += info->s_dirsize;
 53                 } while (offset < 1024 && filp->f_pos < inode->i_size);
 54                 brelse(bh);
 55         }
 56         UPDATE_ATIME(inode);
 57         return 0;
 58 }
 59 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.