b24413180f560 (Greg Kroah-Hartman 2017-11-01 15:07:57 +0100 1) // SPDX-License-Identifier: GPL-2.0
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 2) /*
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 3) * QNX4 file system, Linux implementation.
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 4) *
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 5) * Version : 0.2.1
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 6) *
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 7) * Using parts of the xiafs filesystem.
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 8) *
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 9) * History :
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 10) *
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 11) * 28-05-1998 by Richard Frowijn : first release.
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 12) * 20-06-1998 by Frank Denis : Linux 2.1.99+ & dcache support.
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 13) */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 14)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 15) #include <linux/buffer_head.h>
964f5369667b3 (Al Viro 2009-06-07 09:47:13 -0400 16) #include "qnx4.h"
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 17)
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 18) static int qnx4_readdir(struct file *file, struct dir_context *ctx)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 19) {
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 20) struct inode *inode = file_inode(file);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 21) unsigned int offset;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 22) struct buffer_head *bh;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 23) struct qnx4_inode_entry *de;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 24) struct qnx4_link_info *le;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 25) unsigned long blknum;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 26) int ix, ino;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 27) int size;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 28)
891ddb95d06e9 (Anders Larsen 2009-09-26 20:15:09 +0200 29) QNX4DEBUG((KERN_INFO "qnx4_readdir:i_size = %ld\n", (long) inode->i_size));
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 30) QNX4DEBUG((KERN_INFO "pos = %ld\n", (long) ctx->pos));
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 31)
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 32) while (ctx->pos < inode->i_size) {
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 33) blknum = qnx4_block_map(inode, ctx->pos >> QNX4_BLOCK_SIZE_BITS);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 34) bh = sb_bread(inode->i_sb, blknum);
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 35) if (bh == NULL) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 36) printk(KERN_ERR "qnx4_readdir: bread failed (%ld)\n", blknum);
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 37) return 0;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 38) }
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 39) ix = (ctx->pos >> QNX4_DIR_ENTRY_SIZE_BITS) % QNX4_INODES_PER_BLOCK;
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 40) for (; ix < QNX4_INODES_PER_BLOCK; ix++, ctx->pos += QNX4_DIR_ENTRY_SIZE) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 41) offset = ix * QNX4_DIR_ENTRY_SIZE;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 42) de = (struct qnx4_inode_entry *) (bh->b_data + offset);
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 43) if (!de->di_fname[0])
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 44) continue;
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 45) if (!(de->di_status & (QNX4_FILE_USED|QNX4_FILE_LINK)))
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 46) continue;
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 47) if (!(de->di_status & QNX4_FILE_LINK))
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 48) size = QNX4_SHORT_NAME_MAX;
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 49) else
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 50) size = QNX4_NAME_MAX;
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 51) size = strnlen(de->di_fname, size);
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 52) QNX4DEBUG((KERN_INFO "qnx4_readdir:%.*s\n", size, de->di_fname));
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 53) if (!(de->di_status & QNX4_FILE_LINK))
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 54) ino = blknum * QNX4_INODES_PER_BLOCK + ix - 1;
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 55) else {
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 56) le = (struct qnx4_link_info*)de;
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 57) ino = ( le32_to_cpu(le->dl_inode_blk) - 1 ) *
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 58) QNX4_INODES_PER_BLOCK +
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 59) le->dl_inode_ndx;
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 60) }
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 61) if (!dir_emit(ctx, de->di_fname, size, ino, DT_UNKNOWN)) {
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 62) brelse(bh);
663f4deca76cc (Al Viro 2013-05-17 15:17:59 -0400 63) return 0;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 64) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 65) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 66) brelse(bh);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 67) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 68) return 0;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 69) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 70)
4b6f5d20b04dc (Arjan van de Ven 2006-03-28 01:56:42 -0800 71) const struct file_operations qnx4_dir_operations =
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 72) {
ca572727dbb94 (jan Blunck 2010-05-26 14:44:53 -0700 73) .llseek = generic_file_llseek,
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 74) .read = generic_read_dir,
c51da20c48b76 (Al Viro 2016-04-30 22:37:34 -0400 75) .iterate_shared = qnx4_readdir,
1b061d9247f71 (Christoph Hellwig 2010-05-26 17:53:41 +0200 76) .fsync = generic_file_fsync,
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 77) };
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 78)
c5ef1c42c51b1 (Arjan van de Ven 2007-02-12 00:55:40 -0800 79) const struct inode_operations qnx4_dir_inode_operations =
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 80) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 81) .lookup = qnx4_lookup,
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 82) };