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