VisionFive2 Linux kernel

StarFive Tech Linux Kernel for VisionFive (JH7110) boards (mirror)

More than 9999 Commits   32 Branches   54 Tags
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) };