patch-2.3.35 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
- Lines: 162
- Date:
Wed Dec 22 17:38:27 1999
- Orig file:
v2.3.34/linux/fs/qnx4/dir.c
- Orig date:
Tue Dec 7 09:32:48 1999
diff -u --recursive --new-file v2.3.34/linux/fs/qnx4/dir.c linux/fs/qnx4/dir.c
@@ -1,12 +1,12 @@
-/*
+/*
* QNX4 file system, Linux implementation.
- *
- * Version : 0.1
- *
+ *
+ * Version : 0.2.1
+ *
* Using parts of the xiafs filesystem.
- *
+ *
* History :
- *
+ *
* 28-05-1998 by Richard Frowijn : first release.
* 20-06-1998 by Frank Denis : Linux 2.1.99+ & dcache support.
*/
@@ -20,55 +20,60 @@
#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 );
bh = bread(inode->i_dev, blknum, QNX4_BLOCK_SIZE);
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 = (filp->f_pos / QNX4_DIR_ENTRY_SIZE - (filp->f_pos / QNX4_BLOCK_SIZE) * QNX4_INODES_PER_BLOCK) % 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 +82,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, /* get_block */
- NULL, /* readpage */
- NULL, /* writepage */
- NULL, /* truncate */
- NULL, /* permission */
- NULL /* revalidate */
};
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)