Whamcloud - gitweb
Type proposals, simplifications.
[fs/lustre-release.git] / lustre / obdfs / dir.c
index 7e87052..30262e0 100644 (file)
@@ -26,8 +26,6 @@
 
 #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);
 
-int ext2_check_dir_entry (const char * function, struct inode * dir,
+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 */
+};
+
+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";
@@ -62,24 +105,27 @@ int ext2_check_dir_entry (const char * function, struct inode * dir,
                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;
@@ -89,13 +135,17 @@ int obdfs_readdir(struct file * filp, void * dirent, filldir_t filldir)
        struct page *page;
        struct inode *inode = filp->f_dentry->d_inode;
 
+       ENTRY;
+
        sb = inode->i_sb;
 
        stored = 0;
        offset = filp->f_pos & (PAGE_SIZE - 1);
 
        while (!error && !stored && filp->f_pos < inode->i_size) {
-               page = obdfs_getpage(inode, offset);
+               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",
@@ -154,7 +204,8 @@ revalidate:
                                 * 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,
@@ -170,7 +221,10 @@ revalidate:
                        filp->f_pos += le16_to_cpu(de->rec_len);
                }
                offset = 0;
-               }
+               UnlockPage(page);
+               page_cache_release(page);
+       }
        UPDATE_ATIME(inode);
+       EXIT;
        return 0;
 }