This source file includes following definitions.
- ufs_dir_read
- ufs_readdir
1
2
3
4
5
6
7
8
9
10
11
12
13 #include <linux/fs.h>
14
15
16 extern int ufs_lookup();
17 extern int ufs_bmap();
18
19 static int ufs_dir_read (struct inode * inode, struct file * filp,
20 char * buf, int count)
21 {
22
23 return -EISDIR;
24 }
25
26
27
28
29 static int
30 ufs_readdir (struct inode * inode, struct file * filp, void * dirent,
31 filldir_t filldir)
32 {
33 int error = 0;
34 unsigned long offset, lblk, blk;
35 int i, stored;
36 struct buffer_head * bh;
37 struct direct * de;
38 struct super_block * sb;
39
40 if (!inode || !S_ISDIR(inode->i_mode))
41 return -EBADF;
42 sb = inode->i_sb;
43
44 if (inode->i_sb->u.ufs_sb.s_flags & UFS_DEBUG) {
45 printk("ufs_readdir: ino %lu f_pos %lu\n",
46 inode->i_ino, filp->f_pos);
47 ufs_print_inode(inode);
48 }
49
50 stored = 0;
51 bh = NULL;
52 offset = filp->f_pos & (sb->s_blocksize - 1);
53
54 while (!error && !stored && filp->f_pos < inode->i_size) {
55 lblk = (filp->f_pos) >> sb->s_blocksize_bits;
56 blk = ufs_bmap(inode, lblk);
57
58 blk = ufs_bmap(inode, lblk);
59 bh = bread (sb->s_dev, blk, sb->s_blocksize);
60 if (!bh) {
61
62 printk("ufs_readdir: dir inode %lu has a hole at offset %lu\n",
63 inode->i_ino, (unsigned long int)filp->f_pos);
64 filp->f_pos += sb->s_blocksize - offset;
65 continue;
66 }
67
68 revalidate:
69
70
71
72
73 if (filp->f_version != inode->i_version) {
74 for (i = 0; i < sb->s_blocksize && i < offset; ) {
75 de = (struct direct *)
76 (bh->b_data + i);
77
78
79
80
81
82
83 if (de->d_reclen < 1)
84 break;
85 i += de->d_reclen;
86 }
87 offset = i;
88 filp->f_pos = (filp->f_pos & ~(sb->s_blocksize - 1))
89 | offset;
90 filp->f_version = inode->i_version;
91 }
92
93 while (!error && filp->f_pos < inode->i_size
94 && offset < sb->s_blocksize) {
95 de = (struct direct *) (bh->b_data + offset);
96
97 if ((de->d_reclen == 0) || (de->d_namlen == 0)) {
98 filp->f_pos = filp->f_pos & (sb->s_blocksize - 1) + sb->s_blocksize;
99 brelse(bh);
100 return stored;
101 }
102 #if 0
103 if (!ext2_check_dir_entry ("ext2_readdir", inode, de,
104 bh, offset)) {
105
106
107 filp->f_pos = (filp->f_pos & (sb->s_blocksize - 1))
108 + sb->s_blocksize;
109 brelse (bh);
110 return stored;
111 }
112 #endif
113 offset += de->d_reclen;
114 if (de->d_ino) {
115
116
117
118
119
120
121 unsigned long version;
122 dcache_add(inode, de->d_name, de->d_namlen,
123 de->d_ino);
124 version = inode->i_version;
125 if (inode->i_sb->u.ufs_sb.s_flags & UFS_DEBUG) {
126 printk("ufs_readdir: filldir(%s,%lu)\n",
127 de->d_name, de->d_ino);
128 }
129 error = filldir(dirent, de->d_name, de->d_namlen, filp->f_pos, de->d_ino);
130 if (error)
131 break;
132 if (version != inode->i_version)
133 goto revalidate;
134 stored ++;
135 }
136 filp->f_pos += de->d_reclen;
137 }
138 offset = 0;
139 brelse (bh);
140 }
141 #if 0
142 if (!IS_RDONLY(inode)) {
143 inode->i_atime = CURRENT_TIME;
144 inode->i_dirt = 1;
145 }
146 #endif
147 return 0;
148 }
149
150
151 static struct file_operations ufs_dir_operations = {
152 NULL,
153 &ufs_dir_read,
154 NULL,
155 &ufs_readdir,
156 NULL,
157 NULL,
158 NULL,
159 NULL,
160 NULL,
161 &file_fsync,
162 NULL,
163 NULL,
164 NULL,
165 };
166
167 struct inode_operations ufs_dir_inode_operations = {
168 &ufs_dir_operations,
169 NULL,
170 &ufs_lookup,
171 NULL,
172 NULL,
173 NULL,
174 NULL,
175 NULL,
176 NULL,
177 NULL,
178 NULL,
179 NULL,
180 NULL,
181 NULL,
182 NULL,
183 NULL,
184 NULL,
185 NULL,
186 };
187
188
189
190
191
192
193
194
195
196