patch-2.1.112 linux/fs/ufs/ufs_dir.c
Next file: linux/fs/ufs/ufs_file.c
Previous file: linux/fs/ufs/truncate.c
Back to the patch index
Back to the overall index
- Lines: 192
- Date:
Wed Dec 31 16:00:00 1969
- Orig file:
v2.1.111/linux/fs/ufs/ufs_dir.c
- Orig date:
Tue Feb 17 13:12:48 1998
diff -u --recursive --new-file v2.1.111/linux/fs/ufs/ufs_dir.c linux/fs/ufs/ufs_dir.c
@@ -1,191 +0,0 @@
-/*
- * linux/fs/ufs/ufs_dir.c
- *
- * Copyright (C) 1996
- * Adrian Rodriguez (adrian@franklins-tower.rutgers.edu)
- * Laboratory for Computer Science Research Computing Facility
- * Rutgers, The State University of New Jersey
- *
- * swab support by Francois-Rene Rideau <rideau@ens.fr> 19970406
- *
- * 4.4BSD (FreeBSD) support added on February 1st 1998 by
- * Niels Kristian Bech Jensen <nkbj@image.dk> partially based
- * on code by Martin von Loewis <martin@mira.isdn.cs.tu-berlin.de>.
- */
-
-#include <linux/fs.h>
-
-#include "ufs_swab.h"
-
-/*
- * This is blatantly stolen from ext2fs
- */
-static int
-ufs_readdir (struct file * filp, void * dirent, filldir_t filldir)
-{
- struct inode *inode = filp->f_dentry->d_inode;
- int error = 0;
- unsigned long offset, lblk, blk;
- int i, stored;
- struct buffer_head * bh;
- struct ufs_direct * de;
- struct super_block * sb;
- int de_reclen;
- __u32 flags;
-
- /* Isn't that already done in the upper layer???
- * the VFS layer really needs some explicit documentation!
- */
- if (!inode || !S_ISDIR(inode->i_mode))
- return -EBADF;
-
- sb = inode->i_sb;
- flags = sb->u.ufs_sb.s_flags;
-
- if (flags & UFS_DEBUG) {
- printk("ufs_readdir: ino %lu f_pos %lu\n",
- inode->i_ino, (unsigned long) filp->f_pos);
- ufs_print_inode(inode);
- }
-
- stored = 0;
- bh = NULL;
- offset = filp->f_pos & (sb->s_blocksize - 1);
-
- while (!error && !stored && filp->f_pos < inode->i_size) {
- lblk = (filp->f_pos) >> sb->s_blocksize_bits;
- /* XXX - ufs_bmap() call needs error checking */
- blk = ufs_bmap(inode, lblk);
- bh = bread (sb->s_dev, blk, sb->s_blocksize);
- if (!bh) {
- /* XXX - error - skip to the next block */
- printk("ufs_readdir: "
- "dir inode %lu has a hole at offset %lu\n",
- inode->i_ino, (unsigned long int)filp->f_pos);
- filp->f_pos += sb->s_blocksize - offset;
- continue;
- }
-
-revalidate:
- /* If the dir block has changed since the last call to
- * readdir(2), then we might be pointing to an invalid
- * dirent right now. Scan from the start of the block
- * to make sure. */
- if (filp->f_version != inode->i_version) {
- for (i = 0; i < sb->s_blocksize && i < offset; ) {
- de = (struct ufs_direct *)
- (bh->b_data + i);
- /* It's too expensive to do a full
- * dirent test each time round this
- * loop, but we do have to test at
- * least that it is non-zero. A
- * failure will be detected in the
- * dirent test below. */
- de_reclen = SWAB16(de->d_reclen);
- if (de_reclen < 1)
- break;
- i += de_reclen;
- }
- offset = i;
- filp->f_pos = (filp->f_pos & ~(sb->s_blocksize - 1))
- | offset;
- filp->f_version = inode->i_version;
- }
-
- while (!error && filp->f_pos < inode->i_size
- && offset < sb->s_blocksize) {
- de = (struct ufs_direct *) (bh->b_data + offset);
- /* XXX - put in a real ufs_check_dir_entry() */
- if ((de->d_reclen == 0) || (NAMLEN(de) == 0)) {
- /* SWAB16() was unneeded -- compare to 0 */
- filp->f_pos = (filp->f_pos &
- (sb->s_blocksize - 1)) +
- sb->s_blocksize;
- brelse(bh);
- return stored;
- }
-#if 0 /* XXX */
- if (!ext2_check_dir_entry ("ext2_readdir", inode, de,
- /* XXX - beware about de having to be swabped somehow */
- bh, offset)) {
- /* On error, skip the f_pos to the
- next block. */
- filp->f_pos = (filp->f_pos &
- (sb->s_blocksize - 1)) +
- sb->s_blocksize;
- brelse (bh);
- return stored;
- }
-#endif /* XXX */
- offset += SWAB16(de->d_reclen);
- if (de->d_ino) {
- /* SWAB16() was unneeded -- compare to 0 */
- /* We might block in the next section
- * if the data destination is
- * currently swapped out. So, use a
- * version stamp to detect whether or
- * not the directory has been modified
- * during the copy operation. */
- unsigned long version = inode->i_version;
-
- if (flags & UFS_DEBUG) {
- printk("ufs_readdir: filldir(%s,%u)\n",
- de->d_name, SWAB32(de->d_ino));
- }
- error = filldir(dirent, de->d_name, NAMLEN(de),
- filp->f_pos, SWAB32(de->d_ino));
- if (error)
- break;
- if (version != inode->i_version)
- goto revalidate;
- stored ++;
- }
- filp->f_pos += SWAB16(de->d_reclen);
- }
- offset = 0;
- brelse (bh);
- }
-#if 0 /* XXX */
- if (!IS_RDONLY(inode)) {
- inode->i_atime = CURRENT_TIME;
- inode->i_dirt = 1;
- }
-#endif /* XXX */
- return 0;
-}
-
-static struct file_operations ufs_dir_operations = {
- NULL, /* lseek */
- NULL, /* read */
- NULL, /* write */
- ufs_readdir, /* readdir */
- NULL, /* select */
- NULL, /* ioctl */
- NULL, /* mmap */
- NULL, /* open */
- NULL, /* release */
- file_fsync, /* fsync */
- NULL, /* fasync */
- NULL, /* check_media_change */
- NULL, /* revalidate */
-};
-
-struct inode_operations ufs_dir_inode_operations = {
- &ufs_dir_operations, /* default directory file operations */
- NULL, /* create */
- ufs_lookup, /* lookup */
- NULL, /* link */
- NULL, /* unlink */
- NULL, /* symlink */
- NULL, /* mkdir */
- NULL, /* rmdir */
- NULL, /* mknod */
- NULL, /* rename */
- NULL, /* readlink */
- 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, slshen@lbl.gov