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
- Lines: 151
- Date:
Fri Apr 21 12:46:45 2000
- Orig file:
v2.2.14/fs/qnx4/dir.c
- Orig date:
Wed Oct 20 01:12:49 1999
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)