Import 2.3.9pre7
[davej-history.git] / fs / minix / dir.c
bloba44d5d69d5d5d6158ae57d92df989bc249bb3aea
1 /*
2 * linux/fs/minix/dir.c
4 * Copyright (C) 1991, 1992 Linus Torvalds
6 * minix directory handling functions
7 */
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>
15 #include <asm/uaccess.h>
17 static ssize_t minix_dir_read(struct file * filp, char * buf,
18 size_t count, loff_t *ppos)
20 return -EISDIR;
23 static int minix_readdir(struct file *, void *, filldir_t);
25 static struct file_operations minix_dir_operations = {
26 NULL, /* lseek - default */
27 minix_dir_read, /* read */
28 NULL, /* write - bad */
29 minix_readdir, /* readdir */
30 NULL, /* poll - default */
31 NULL, /* ioctl - default */
32 NULL, /* mmap */
33 NULL, /* no special open code */
34 NULL, /* flush */
35 NULL, /* no special release code */
36 file_fsync /* default fsync */
40 * directories can handle most operations...
42 struct inode_operations minix_dir_inode_operations = {
43 &minix_dir_operations, /* default directory file-ops */
44 minix_create, /* create */
45 minix_lookup, /* lookup */
46 minix_link, /* link */
47 minix_unlink, /* unlink */
48 minix_symlink, /* symlink */
49 minix_mkdir, /* mkdir */
50 minix_rmdir, /* rmdir */
51 minix_mknod, /* mknod */
52 minix_rename, /* rename */
53 NULL, /* readlink */
54 NULL, /* follow_link */
55 NULL, /* get_block */
56 NULL, /* readpage */
57 NULL, /* writepage */
58 NULL, /* flushpage */
59 NULL, /* truncate */
60 NULL, /* permission */
61 NULL, /* smap */
62 NULL /* revalidate */
65 static int minix_readdir(struct file * filp,
66 void * dirent, filldir_t filldir)
68 unsigned int offset;
69 struct buffer_head * bh;
70 struct minix_dir_entry * de;
71 struct minix_sb_info * info;
72 struct inode *inode = filp->f_dentry->d_inode;
74 info = &inode->i_sb->u.minix_sb;
75 if (filp->f_pos & (info->s_dirsize - 1))
76 return -EBADF;
77 while (filp->f_pos < inode->i_size) {
78 offset = filp->f_pos & 1023;
79 bh = minix_bread(inode,(filp->f_pos)>>BLOCK_SIZE_BITS,0);
80 if (!bh) {
81 filp->f_pos += 1024-offset;
82 continue;
84 do {
85 de = (struct minix_dir_entry *) (offset + bh->b_data);
86 if (de->inode) {
87 int size = strnlen(de->name, info->s_namelen);
88 if (filldir(dirent, de->name, size, filp->f_pos, de->inode) < 0) {
89 brelse(bh);
90 return 0;
93 offset += info->s_dirsize;
94 filp->f_pos += info->s_dirsize;
95 } while (offset < 1024 && filp->f_pos < inode->i_size);
96 brelse(bh);
98 UPDATE_ATIME(inode);
99 return 0;