#include <asm/uaccess.h>
-#include <asm/uaccess.h>
-
#include <linux/errno.h>
#include <linux/fs.h>
#include <linux/ext2_fs.h>
#include <linux/locks.h>
#include <linux/quotaops.h>
#include <linux/iobuf.h>
-#include "obdfs.h"
#include <linux/obd_support.h>
+#include <linux/obdfs.h>
-#if 0
static ssize_t obdfs_dir_read (struct file * filp, char * buf,
size_t count, loff_t *ppos)
{
return -EISDIR;
}
+static int obdfs_readdir(struct file *, void *, filldir_t);
+
+struct file_operations obdfs_dir_operations = {
+ NULL, /* lseek - default */
+ obdfs_dir_read, /* read */
+ NULL, /* write - bad */
+ obdfs_readdir, /* readdir */
+ NULL, /* poll - default */
+ NULL, /* ioctl */
+ NULL, /* mmap */
+ NULL, /* no special open code */
+ NULL, /* flush */
+ NULL, /* no special release code */
+ NULL, /* fsync */
+ NULL, /* fasync */
+ NULL, /* check_media_change */
+ NULL /* revalidate */
+};
-int ext2_check_dir_entry (const char * function, struct inode * dir,
+struct inode_operations obdfs_dir_inode_operations = {
+ &obdfs_dir_operations, /* default directory file-ops */
+ obdfs_create, /* create */
+ obdfs_lookup, /* lookup */
+ obdfs_link, /* link */
+ obdfs_unlink, /* unlink */
+ obdfs_symlink, /* symlink */
+ obdfs_mkdir, /* mkdir */
+ obdfs_rmdir, /* rmdir */
+ obdfs_mknod, /* mknod */
+ obdfs_rename, /* rename */
+ NULL, /* readlink */
+ NULL, /* follow_link */
+ NULL, /* get_block */
+ obdfs_readpage, /* readpage */
+ obdfs_writepage, /* writepage */
+ NULL, /* truncate */
+ NULL, /* permission */
+ NULL /* revalidate */
+};
+
+int obdfs_check_dir_entry (const char * function, struct inode * dir,
struct ext2_dir_entry_2 * de,
- struct buffer_head * bh,
+ struct page * page,
unsigned long offset)
{
const char * error_msg = NULL;
+ return 1;
+
+ ENTRY;
+ if ( !de ) {
+ error_msg = "null de passed";
+ return 1;
+ }
if (le16_to_cpu(de->rec_len) < EXT2_DIR_REC_LEN(1))
error_msg = "rec_len is smaller than minimal";
error_msg = "rec_len % 4 != 0";
else if (le16_to_cpu(de->rec_len) < EXT2_DIR_REC_LEN(de->name_len))
error_msg = "rec_len is too small for name_len";
- else if (dir && ((char *) de - bh->b_data) + le16_to_cpu(de->rec_len) >
+ else if (dir && ((char *) de - (char *)page_address(page)) + le16_to_cpu(de->rec_len) >
dir->i_sb->s_blocksize)
error_msg = "directory entry across blocks";
- else if (dir && le32_to_cpu(de->inode) > le32_to_cpu(dir->i_sb->u.ext2_sb.s_es->s_inodes_count))
- error_msg = "inode out of bounds";
+#if 0 /* this one doesn't yet work for OBDFS */
+ else
+if (dir && le32_to_cpu(de->inode) > le32_to_cpu(dir->i_sb->u.ext2_sb.s_es->s_inodes_count))
+ error_msg = "inode out of bounds";
+#endif
if (error_msg != NULL)
ext2_error (dir->i_sb, function, "bad entry in directory #%lu: %s - "
"offset=%lu, inode=%lu, rec_len=%d, name_len=%d",
dir->i_ino, error_msg, offset,
(unsigned long) le32_to_cpu(de->inode),
le16_to_cpu(de->rec_len), de->name_len);
+ EXIT;
return error_msg == NULL ? 1 : 0;
}
-#endif
-int obdfs_readdir(struct file * filp, void * dirent, filldir_t filldir)
+static int obdfs_readdir(struct file * filp, void * dirent, filldir_t filldir)
{
int error = 0;
unsigned long offset;
offset = filp->f_pos & (PAGE_SIZE - 1);
while (!error && !stored && filp->f_pos < inode->i_size) {
- page = obdfs_getpage(inode, offset, 0, NOLOCK);
+ IDEBUG(inode);
+ page = obdfs_getpage(inode, offset, 0, LOCKED);
+ PDEBUG(page, "readdir");
if (!page) {
ext2_error (sb, "ext2_readdir",
"directory #%lu contains a hole at offset %lu",
* not the directory has been modified
* during the copy operation.
*/
- /* XXX unsigned long version = inode->i_version;
+ /* XXX
+ unsigned long version = inode->i_version;
*/
error = filldir(dirent, de->name,
de->name_len,
filp->f_pos += le16_to_cpu(de->rec_len);
}
offset = 0;
+ UnlockPage(page);
page_cache_release(page);
}
UPDATE_ATIME(inode);