2 * QNX4 file system, Linux implementation.
6 * Using parts of the xiafs filesystem.
10 * 28-05-1998 by Richard Frowijn : first release.
11 * 20-06-1998 by Frank Denis : Linux 2.1.99+ & dcache support.
14 #include <linux/config.h>
15 #include <linux/string.h>
16 #include <linux/errno.h>
18 #include <linux/qnx4_fs.h>
19 #include <linux/stat.h>
20 #include <linux/smp_lock.h>
21 #include <linux/buffer_head.h>
24 static int qnx4_readdir(struct file
*filp
, void *dirent
, filldir_t filldir
)
26 struct inode
*inode
= filp
->f_dentry
->d_inode
;
28 struct buffer_head
*bh
;
29 struct qnx4_inode_entry
*de
;
30 struct qnx4_link_info
*le
;
35 QNX4DEBUG(("qnx4_readdir:i_size = %ld\n", (long) inode
->i_size
));
36 QNX4DEBUG(("filp->f_pos = %ld\n", (long) filp
->f_pos
));
40 while (filp
->f_pos
< inode
->i_size
) {
41 blknum
= qnx4_block_map( inode
, filp
->f_pos
>> QNX4_BLOCK_SIZE_BITS
);
42 bh
= sb_bread(inode
->i_sb
, blknum
);
44 printk(KERN_ERR
"qnx4_readdir: bread failed (%ld)\n", blknum
);
47 ix
= (int)(filp
->f_pos
>> QNX4_DIR_ENTRY_SIZE_BITS
) % QNX4_INODES_PER_BLOCK
;
48 while (ix
< QNX4_INODES_PER_BLOCK
) {
49 offset
= ix
* QNX4_DIR_ENTRY_SIZE
;
50 de
= (struct qnx4_inode_entry
*) (bh
->b_data
+ offset
);
51 size
= strlen(de
->di_fname
);
53 if ( !( de
->di_status
& QNX4_FILE_LINK
) && size
> QNX4_SHORT_NAME_MAX
)
54 size
= QNX4_SHORT_NAME_MAX
;
55 else if ( size
> QNX4_NAME_MAX
)
58 if ( ( de
->di_status
& (QNX4_FILE_USED
|QNX4_FILE_LINK
) ) != 0 ) {
59 QNX4DEBUG(("qnx4_readdir:%.*s\n", size
, de
->di_fname
));
60 if ( ( de
->di_status
& QNX4_FILE_LINK
) == 0 )
61 ino
= blknum
* QNX4_INODES_PER_BLOCK
+ ix
- 1;
63 le
= (struct qnx4_link_info
*)de
;
64 ino
= ( le32_to_cpu(le
->dl_inode_blk
) - 1 ) *
65 QNX4_INODES_PER_BLOCK
+
68 if (filldir(dirent
, de
->di_fname
, size
, filp
->f_pos
, ino
, DT_UNKNOWN
) < 0) {
75 filp
->f_pos
+= QNX4_DIR_ENTRY_SIZE
;
84 struct file_operations qnx4_dir_operations
=
86 .read
= generic_read_dir
,
87 .readdir
= qnx4_readdir
,
91 struct inode_operations qnx4_dir_inode_operations
=
93 .lookup
= qnx4_lookup
,
94 #ifdef CONFIG_QNX4FS_RW
95 .create
= qnx4_create
,
96 .unlink
= qnx4_unlink
,