patch-2.2.15 linux/fs/qnx4/dir.c

Next file: linux/fs/qnx4/file.c
Previous file: linux/fs/qnx4/bitmap.c
Back to the patch index
Back to the overall index

diff -u --new-file --recursive --exclude-from ../../exclude v2.2.14/fs/qnx4/dir.c linux/fs/qnx4/dir.c
@@ -1,7 +1,7 @@
 /* 
  * QNX4 file system, Linux implementation.
  * 
- * Version : 0.1
+ * Version : 0.2.1
  * 
  * Using parts of the xiafs filesystem.
  * 
@@ -20,55 +20,57 @@
 
 #include <asm/segment.h>
 
-static int qnx4_readdir(struct file *filp, void *dirent, filldir_t filldir);
-
 static int qnx4_readdir(struct file *filp, void *dirent, filldir_t filldir)
 {
 	struct inode *inode = filp->f_dentry->d_inode;
 	unsigned int offset;
 	struct buffer_head *bh;
 	struct qnx4_inode_entry *de;
-	long blknum;
-	int i;
+	struct qnx4_link_info *le;
+	unsigned long blknum;
+	int ix, ino;
 	int size;
 
-	blknum = inode->u.qnx4_i.i_first_xtnt.xtnt_blk - 1 +
-	    ((filp->f_pos >> 6) >> 3);
-
 	QNX4DEBUG(("qnx4_readdir:i_size = %ld\n", (long) inode->i_size));
 	QNX4DEBUG(("filp->f_pos         = %ld\n", (long) filp->f_pos));
-	QNX4DEBUG(("BlkNum              = %ld\n", (long) blknum));
 
 	while (filp->f_pos < inode->i_size) {
+		blknum = qnx4_block_map( inode, filp->f_pos >> QNX4_BLOCK_SIZE_BITS );
 		bh = bread(inode->i_dev, blknum, QNX4_BLOCK_SIZE);
-		if(bh==NULL)
-		{
+		if(bh==NULL) {
 			printk(KERN_ERR "qnx4_readdir: bread failed (%ld)\n", blknum);
 			break;
 		}
-		i = (filp->f_pos - (((filp->f_pos >> 6) >> 3) << 9)) & 0x3f;
-		while (i < QNX4_INODES_PER_BLOCK) {
-			offset = i * QNX4_DIR_ENTRY_SIZE;
+		ix = (int)(filp->f_pos >> QNX4_DIR_ENTRY_SIZE_BITS) % QNX4_INODES_PER_BLOCK;
+		while (ix < QNX4_INODES_PER_BLOCK) {
+			offset = ix * QNX4_DIR_ENTRY_SIZE;
 			de = (struct qnx4_inode_entry *) (bh->b_data + offset);
 			size = strlen(de->di_fname);
 			if (size) {
-
-				QNX4DEBUG(("qnx4_readdir:%s\n", de->di_fname));
-
-				if ((de->di_mode) || (de->di_status == QNX4_FILE_LINK)) {
-					if (de->di_status) {
-						if (filldir(dirent, de->di_fname, size, filp->f_pos, de->di_first_xtnt.xtnt_blk) < 0) {
-							brelse(bh);
-							return 0;
-						}
+				if ( !(de->di_status & QNX4_FILE_LINK) && size > QNX4_SHORT_NAME_MAX )
+					size = QNX4_SHORT_NAME_MAX;
+				else if ( size > QNX4_NAME_MAX )
+					size = QNX4_NAME_MAX;
+				if ( ( de->di_status & (QNX4_FILE_USED|QNX4_FILE_LINK) ) != 0 ) {
+					QNX4DEBUG(("qnx4_readdir:%.*s\n", size, de->di_fname));
+					if ( ( de->di_status & QNX4_FILE_LINK ) == 0 )
+						ino = blknum * QNX4_INODES_PER_BLOCK + ix - 1;
+					else {
+						le  = (struct qnx4_link_info*)de;
+						ino = ( le->dl_inode_blk - 1 ) *
+							QNX4_INODES_PER_BLOCK +
+							le->dl_inode_ndx;
+					}
+					if (filldir(dirent, de->di_fname, size, filp->f_pos, ino) < 0) {
+						brelse(bh);
+						return 0;
 					}
 				}
 			}
-			i++;
+			ix++;
 			filp->f_pos += QNX4_DIR_ENTRY_SIZE;
 		}
 		brelse(bh);
-		blknum++;
 	}
 	UPDATE_ATIME(inode);
 
@@ -77,52 +79,19 @@
 
 static struct file_operations qnx4_dir_operations =
 {
-	NULL,			/* lseek - default */
-	NULL,			/* read */
-	NULL,			/* write - bad */
-	qnx4_readdir,		/* readdir */
-	NULL,			/* poll - default */
-	NULL,			/* ioctl - default */
-	NULL,			/* mmap */
-	NULL,			/* no special open code */
-        NULL,                   /* no special flush code */
-	NULL,			/* no special release code */
-	file_fsync,		/* default fsync */
-	NULL,			/* default fasync */
-	NULL,			/* default check_media_change */
-	NULL,			/* default revalidate */
+	readdir:		qnx4_readdir,
+	fsync:			file_fsync,
 };
 
 struct inode_operations qnx4_dir_inode_operations =
 {
-	&qnx4_dir_operations,
-#ifdef CONFIG_QNX4FS_RW
-	qnx4_create,
-#else
-	NULL,			/* create */
-#endif
-	qnx4_lookup,
-	NULL,			/* link */
+	default_file_ops:	&qnx4_dir_operations,
 #ifdef CONFIG_QNX4FS_RW
-	qnx4_unlink,		/* unlink */
-#else
-	NULL,
+	create:			qnx4_create,
 #endif
-	NULL,			/* symlink */
-	NULL,			/* mkdir */
+	lookup:			qnx4_lookup,
 #ifdef CONFIG_QNX4FS_RW
-	qnx4_rmdir,		/* rmdir */
-#else
-	NULL,
+	unlink:			qnx4_unlink,
+	rmdir:			qnx4_rmdir,
 #endif
-	NULL,			/* mknod */
-	NULL,			/* rename */
-	NULL,			/* readlink */
-	NULL,			/* follow_link */
-	NULL,			/* readpage */
-	NULL,			/* writepage */
-	NULL,			/* bmap */
-	NULL,			/* truncate */
-	NULL,			/* permission */
-	NULL			/* smap */
 };

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)