1 // SPDX-License-Identifier: GPL-2.0
3 * QNX4 file system, Linux implementation.
7 * Using parts of the xiafs filesystem.
11 * 28-05-1998 by Richard Frowijn : first release.
12 * 20-06-1998 by Frank Denis : Linux 2.1.99+ & dcache support.
15 #include <linux/buffer_head.h>
18 static int qnx4_readdir(struct file
*file
, struct dir_context
*ctx
)
20 struct inode
*inode
= file_inode(file
);
22 struct buffer_head
*bh
;
23 struct qnx4_inode_entry
*de
;
24 struct qnx4_link_info
*le
;
29 QNX4DEBUG((KERN_INFO
"qnx4_readdir:i_size = %ld\n", (long) inode
->i_size
));
30 QNX4DEBUG((KERN_INFO
"pos = %ld\n", (long) ctx
->pos
));
32 while (ctx
->pos
< inode
->i_size
) {
33 blknum
= qnx4_block_map(inode
, ctx
->pos
>> QNX4_BLOCK_SIZE_BITS
);
34 bh
= sb_bread(inode
->i_sb
, blknum
);
36 printk(KERN_ERR
"qnx4_readdir: bread failed (%ld)\n", blknum
);
39 ix
= (ctx
->pos
>> QNX4_DIR_ENTRY_SIZE_BITS
) % QNX4_INODES_PER_BLOCK
;
40 for (; ix
< QNX4_INODES_PER_BLOCK
; ix
++, ctx
->pos
+= QNX4_DIR_ENTRY_SIZE
) {
41 offset
= ix
* QNX4_DIR_ENTRY_SIZE
;
42 de
= (struct qnx4_inode_entry
*) (bh
->b_data
+ offset
);
45 if (!(de
->di_status
& (QNX4_FILE_USED
|QNX4_FILE_LINK
)))
47 if (!(de
->di_status
& QNX4_FILE_LINK
))
48 size
= QNX4_SHORT_NAME_MAX
;
51 size
= strnlen(de
->di_fname
, size
);
52 QNX4DEBUG((KERN_INFO
"qnx4_readdir:%.*s\n", size
, de
->di_fname
));
53 if (!(de
->di_status
& QNX4_FILE_LINK
))
54 ino
= blknum
* QNX4_INODES_PER_BLOCK
+ ix
- 1;
56 le
= (struct qnx4_link_info
*)de
;
57 ino
= ( le32_to_cpu(le
->dl_inode_blk
) - 1 ) *
58 QNX4_INODES_PER_BLOCK
+
61 if (!dir_emit(ctx
, de
->di_fname
, size
, ino
, DT_UNKNOWN
)) {
71 const struct file_operations qnx4_dir_operations
=
73 .llseek
= generic_file_llseek
,
74 .read
= generic_read_dir
,
75 .iterate_shared
= qnx4_readdir
,
76 .fsync
= generic_file_fsync
,
79 const struct inode_operations qnx4_dir_inode_operations
=
81 .lookup
= qnx4_lookup
,