commit 11536b68bf20d82407e1634f5cee7845c53b2013
Author: Yiannis Pericleous <[EMAIL PROTECTED]>
Date:   Sun May 20 18:59:13 2007 -0400

    smaller odf cached dir dirents, and also rearranged dirent contents
    
    to more closely resemble the ext2 dirent structure

diff --git a/fs/unionfs/odf.c b/fs/unionfs/odf.c
index 1cd47da..82e1be5 100644
--- a/fs/unionfs/odf.c
+++ b/fs/unionfs/odf.c
@@ -1126,8 +1126,6 @@ out:
 }
 /*
  * Write a dirent to the given file
- * FIXME: Instead of a file we should give the position
- * in the odf
  */
 int odf_write_dirent(struct file *filp, const char *name, int namelen,
                                u64 ino, unsigned int d_type)
@@ -1135,38 +1133,44 @@ int odf_write_dirent(struct file *filp, const char 
*name, int namelen,
        int err = 0;
        __le32 le32;
        __le64 le64;
+       unsigned char byte;
        mm_segment_t oldfs;
 
        oldfs = get_fs();
        set_fs(KERNEL_DS);
 
+       /* odf dirent magic */
        le32 = cpu_to_le32(ODF_DIRENT_MAGIC);
        err = filp->f_op->write(filp, (char*)&le32,
                        sizeof(__le32), &filp->f_pos);
        if (err != sizeof(__le32))
                goto out;
 
-       le32 = cpu_to_le32(namelen);
-       err = filp->f_op->write(filp, (char*)&le32,
-                       sizeof(__le32), &filp->f_pos);
-       if (err != sizeof(__le32))
-               goto out;
-
-       err = filp->f_op->write(filp, (char*)name,
-                       namelen, &filp->f_pos);
-       if (err != namelen)
-               goto out;
-
+       /* inode */
        le64 = cpu_to_le64(ino);
        err = filp->f_op->write(filp, (char*)&le64,
                        sizeof(__le64), &filp->f_pos);
        if (err != sizeof(__le64))
                goto out;
 
-       le32 = cpu_to_le32(d_type);
-       err =filp->f_op->write(filp, (char*)&le32,
-                       sizeof(__le32), &filp->f_pos);
-       if (err != sizeof(__le32))
+       /* name length */
+       byte = (unsigned char)namelen;
+       err = filp->f_op->write(filp, (char*)&byte,
+                       sizeof(unsigned char), &filp->f_pos);
+       if (err != sizeof(unsigned char))
+               goto out;
+
+       /* type */
+       byte = (unsigned char)d_type;
+       err =filp->f_op->write(filp, (char*)&byte,
+                       sizeof(unsigned char), &filp->f_pos);
+       if (err != sizeof(unsigned char))
+               goto out;
+
+       /* name */
+       err = filp->f_op->write(filp, (char*)name,
+                       namelen, &filp->f_pos);
+       if (err != namelen)
                goto out;
 
        err = 0;
@@ -1187,10 +1191,12 @@ int odf_read_dirent(struct file *filp, char **name, int 
*namelen,
        mm_segment_t oldfs;
        __le32 le32;
        __le64 le64;
+       unsigned char byte;
 
        oldfs = get_fs();
        set_fs(KERNEL_DS);
 
+       /* dirent magic */
        err = filp->f_op->read(filp, (char*)&le32,
                        sizeof(__le32), &filp->f_pos);
        if (err != sizeof(__le32)) {
@@ -1204,18 +1210,38 @@ int odf_read_dirent(struct file *filp, char **name, int 
*namelen,
                goto out;
        }
 
-       err = filp->f_op->read(filp, (char*)&le32,
-                       sizeof(__le32), &filp->f_pos);
-       if (err != sizeof(__le32)) {
+       /* inode */
+       err = filp->f_op->read(filp, (char*)&le64,
+                       sizeof(__le64), &filp->f_pos);
+       if (err != sizeof(__le64)) {
+               err = -EIO;
+               goto out;
+       }
+       *ino = le64_to_cpu(le64);
+
+       /* name length */
+       err = filp->f_op->read(filp, (char*)&byte,
+                       sizeof(unsigned char), &filp->f_pos);
+       if (err != sizeof(unsigned char)) {
                err = -EIO;
                goto out;
        }
-       *namelen = le32_to_cpu(le32);
+       *namelen = byte;
        if (*namelen <= 0) {
                err = -EFAULT;
                goto out;
        }
 
+       /* type */
+       err = filp->f_op->read(filp, (char*)&byte,
+                       sizeof(unsigned char), &filp->f_pos);
+       if (err != sizeof(unsigned char)) {
+               err = -EIO;
+               goto out;
+       }
+       *d_type = byte;
+
+       /* name */
        *name = kmalloc(*namelen, GFP_KERNEL);
        if (!(*name)) {
                err = -ENOMEM;
@@ -1228,21 +1254,6 @@ int odf_read_dirent(struct file *filp, char **name, int 
*namelen,
                goto out;
        }
 
-       err = filp->f_op->read(filp, (char*)&le64,
-                       sizeof(__le64), &filp->f_pos);
-       if (err != sizeof(__le64)) {
-               err = -EIO;
-               goto out;
-       }
-       *ino = le64_to_cpu(le64);
-       err = filp->f_op->read(filp, (char*)&le32,
-                       sizeof(__le32), &filp->f_pos);
-       if (err != sizeof(__le32)) {
-               err = -EIO;
-               goto out;
-       }
-       *d_type = le32_to_cpu(le32);
-
        err = 0;
 out:
        set_fs(oldfs);
_______________________________________________
unionfs-cvs mailing list: http://unionfs.filesystems.org/
[email protected]
http://www.fsl.cs.sunysb.edu/mailman/listinfo/unionfs-cvs

Reply via email to