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
This page was automatically generated by the
LXR engine.
Visit the LXR main site for more
information.