nfsd4: use list_move in move_to_confirmed
[safe/jmp/linux-2.6] / fs / hfsplus / catalog.c
index 04255af..f6874ac 100644 (file)
@@ -8,7 +8,6 @@
  * Handling of catalog records
  */
 
-#include <linux/sched.h>
 
 #include "hfsplus_fs.h"
 #include "hfsplus_raw.h"
@@ -119,14 +118,20 @@ static int hfsplus_cat_build_record(hfsplus_cat_entry *entry, u32 cnid, struct i
                        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);
-                       file->user_info.fdCreator = cpu_to_be32(HFSPLUS_SB(inode->i_sb).creator);
+                       if (S_ISLNK(inode->i_mode)) {
+                               file->user_info.fdType = cpu_to_be32(HFSP_SYMLINK_TYPE);
+                               file->user_info.fdCreator = cpu_to_be32(HFSP_SYMLINK_CREATOR);
+                       } else {
+                               file->user_info.fdType = cpu_to_be32(HFSPLUS_SB(inode->i_sb).type);
+                               file->user_info.fdCreator = cpu_to_be32(HFSPLUS_SB(inode->i_sb).creator);
+                       }
                        if ((file->permissions.rootflags | file->permissions.userflags) & HFSPLUS_FLG_IMMUTABLE)
                                file->flags |= cpu_to_be16(HFSPLUS_FILE_LOCKED);
                } else {
                        file->user_info.fdType = cpu_to_be32(HFSP_HARDLINK_TYPE);
                        file->user_info.fdCreator = cpu_to_be32(HFSP_HFSPLUS_CREATOR);
                        file->user_info.fdFlags = cpu_to_be16(0x100);
+                       file->create_date = HFSPLUS_I(HFSPLUS_SB(inode->i_sb).hidden_dir).create_date;
                        file->permissions.dev = cpu_to_be32(HFSPLUS_I(inode).dev);
                }
                return sizeof(*file);
@@ -163,6 +168,11 @@ int hfsplus_find_cat(struct super_block *sb, u32 cnid,
                return -EIO;
        }
 
+       if (be16_to_cpu(tmp.thread.nodeName.length) > 255) {
+               printk(KERN_ERR "hfs: catalog name length corrupted\n");
+               return -EIO;
+       }
+
        hfsplus_cat_build_key_uni(fd->search_key, be32_to_cpu(tmp.thread.parentID),
                                 &tmp.thread.nodeName);
        return hfs_brec_find(fd);