[PATCH] hfs: set correct ctime
authorRoman Zippel <zippel@linux-m68k.org>
Thu, 19 Jan 2006 01:43:09 +0000 (17:43 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Thu, 19 Jan 2006 03:20:23 +0000 (19:20 -0800)
Read the correct ctime from disk (it was written but never read for some
reason).  Read also creation date, which is used in the next patch.  (Problem
found by Olivier Castan <olivier.castan@certa.ssi.gouv.fr>)

Signed-off-by: Roman Zippel <zippel@linux-m68k.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
fs/hfsplus/catalog.c
fs/hfsplus/hfsplus_fs.h
fs/hfsplus/inode.c

index 662d176856d8333fd7ca904544d3904c4c2749b3..04255af347091b1bae58b2a0ccd794ba15513cbe 100644 (file)
@@ -94,8 +94,11 @@ static int hfsplus_cat_build_record(hfsplus_cat_entry *entry, u32 cnid, struct i
                memset(folder, 0, sizeof(*folder));
                folder->type = cpu_to_be16(HFSPLUS_FOLDER);
                folder->id = cpu_to_be32(inode->i_ino);
-               folder->create_date = folder->content_mod_date =
-                       folder->attribute_mod_date = folder->access_date = hfsp_now2mt();
+               HFSPLUS_I(inode).create_date =
+                       folder->create_date =
+                       folder->content_mod_date =
+                       folder->attribute_mod_date =
+                       folder->access_date = hfsp_now2mt();
                hfsplus_set_perms(inode, &folder->permissions);
                if (inode == HFSPLUS_SB(inode->i_sb).hidden_dir)
                        /* invisible and namelocked */
@@ -109,8 +112,11 @@ static int hfsplus_cat_build_record(hfsplus_cat_entry *entry, u32 cnid, struct i
                file->type = cpu_to_be16(HFSPLUS_FILE);
                file->flags = cpu_to_be16(HFSPLUS_FILE_THREAD_EXISTS);
                file->id = cpu_to_be32(cnid);
-               file->create_date = file->content_mod_date =
-                       file->attribute_mod_date = file->access_date = hfsp_now2mt();
+               HFSPLUS_I(inode).create_date =
+                       file->create_date =
+                       file->content_mod_date =
+                       file->attribute_mod_date =
+                       file->access_date = hfsp_now2mt();
                if (cnid == inode->i_ino) {
                        hfsplus_set_perms(inode, &file->permissions);
                        file->user_info.fdType = cpu_to_be32(HFSPLUS_SB(inode->i_sb).type);
index 4608171f45d3153bfc093af3ee226651b75e9450..7ae393637a0ccc688dbfd38f674123d673081471 100644 (file)
@@ -166,6 +166,7 @@ struct hfsplus_inode_info {
        struct inode *rsrc_inode;
        unsigned long flags;
 
+       __be32 create_date;
        /* Device number in hfsplus_permissions in catalog */
        u32 dev;
        /* BSD system and user file flags */
index 182eb3177975ca19dfa738141271b85de06ac7d7..12ed2b7d046bf11ae2023523c52b33ac55975651 100644 (file)
@@ -431,7 +431,8 @@ int hfsplus_cat_read_inode(struct inode *inode, struct hfs_find_data *fd)
                inode->i_size = 2 + be32_to_cpu(folder->valence);
                inode->i_atime = hfsp_mt2ut(folder->access_date);
                inode->i_mtime = hfsp_mt2ut(folder->content_mod_date);
-               inode->i_ctime = inode->i_mtime;
+               inode->i_ctime = hfsp_mt2ut(folder->attribute_mod_date);
+               HFSPLUS_I(inode).create_date = folder->create_date;
                HFSPLUS_I(inode).fs_blocks = 0;
                inode->i_op = &hfsplus_dir_inode_operations;
                inode->i_fop = &hfsplus_dir_operations;
@@ -462,7 +463,8 @@ int hfsplus_cat_read_inode(struct inode *inode, struct hfs_find_data *fd)
                }
                inode->i_atime = hfsp_mt2ut(file->access_date);
                inode->i_mtime = hfsp_mt2ut(file->content_mod_date);
-               inode->i_ctime = inode->i_mtime;
+               inode->i_ctime = hfsp_mt2ut(file->attribute_mod_date);
+               HFSPLUS_I(inode).create_date = file->create_date;
        } else {
                printk(KERN_ERR "hfs: bad catalog entry used to create inode\n");
                res = -EIO;