vserver 1.9.5.x5
[linux-2.6.git] / fs / hfs / inode.c
index 6c869f3..674acb1 100644 (file)
@@ -169,9 +169,11 @@ struct inode *hfs_new_inode(struct inode *dir, struct qstr *name, int mode)
        inode->i_uid = current->fsuid;
        inode->i_gid = current->fsgid;
        inode->i_nlink = 1;
-       inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
+       inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC;
+       inode->i_blksize = HFS_SB(sb)->alloc_blksz;
        HFS_I(inode)->flags = 0;
        HFS_I(inode)->rsrc_inode = NULL;
+       HFS_I(inode)->fs_blocks = 0;
        if (S_ISDIR(inode->i_mode)) {
                inode->i_size = 2;
                HFS_SB(sb)->folder_count++;
@@ -243,7 +245,8 @@ void hfs_inode_read_fork(struct inode *inode, struct hfs_extent *ext,
        HFS_I(inode)->first_blocks = count;
 
        inode->i_size = HFS_I(inode)->phys_size = log_size;
-       inode->i_blocks = (log_size + sb->s_blocksize - 1) >> sb->s_blocksize_bits;
+       HFS_I(inode)->fs_blocks = (log_size + sb->s_blocksize - 1) >> sb->s_blocksize_bits;
+       inode_set_bytes(inode, HFS_I(inode)->fs_blocks << sb->s_blocksize_bits);
        HFS_I(inode)->alloc_blocks = be32_to_cpu(phys_size) /
                                     HFS_SB(sb)->alloc_blksz;
        HFS_I(inode)->clump_blocks = clump_size / HFS_SB(sb)->alloc_blksz;
@@ -291,6 +294,7 @@ int hfs_read_inode(struct inode *inode, void *data)
        inode->i_uid = hsb->s_uid;
        inode->i_gid = hsb->s_gid;
        inode->i_nlink = 1;
+       inode->i_blksize = HFS_SB(inode->i_sb)->alloc_blksz;
 
        if (idata->key)
                HFS_I(inode)->cat_key = *idata->key;
@@ -320,15 +324,14 @@ int hfs_read_inode(struct inode *inode, void *data)
                inode->i_op = &hfs_file_inode_operations;
                inode->i_fop = &hfs_file_operations;
                inode->i_mapping->a_ops = &hfs_aops;
-               HFS_I(inode)->phys_size = inode->i_size;
                break;
        case HFS_CDR_DIR:
                inode->i_ino = be32_to_cpu(rec->dir.DirID);
-               inode->i_blocks = 0;
                inode->i_size = be16_to_cpu(rec->dir.Val) + 2;
+               HFS_I(inode)->fs_blocks = 0;
                inode->i_mode = S_IFDIR | (S_IRWXUGO & hsb->s_dir_umask);
                inode->i_ctime = inode->i_atime = inode->i_mtime =
-                               hfs_m_to_utime(rec->file.MdDat);
+                               hfs_m_to_utime(rec->dir.MdDat);
                inode->i_op = &hfs_dir_inode_operations;
                inode->i_fop = &hfs_dir_operations;
                break;
@@ -383,6 +386,7 @@ void hfs_inode_write_fork(struct inode *inode, struct hfs_extent *ext,
 
 int hfs_write_inode(struct inode *inode, int unused)
 {
+       struct inode *main_inode = inode;
        struct hfs_find_data fd;
        hfs_cat_rec rec;
 
@@ -405,24 +409,22 @@ int hfs_write_inode(struct inode *inode, int unused)
                }
        }
 
-       if (HFS_IS_RSRC(inode)) {
-               mark_inode_dirty(HFS_I(inode)->rsrc_inode);
-               return 0;
-       }
+       if (HFS_IS_RSRC(inode))
+               main_inode = HFS_I(inode)->rsrc_inode;
 
-       if (!inode->i_nlink)
+       if (!main_inode->i_nlink)
                return 0;
 
-       if (hfs_find_init(HFS_SB(inode->i_sb)->cat_tree, &fd))
+       if (hfs_find_init(HFS_SB(main_inode->i_sb)->cat_tree, &fd))
                /* panic? */
                return -EIO;
 
-       fd.search_key->cat = HFS_I(inode)->cat_key;
+       fd.search_key->cat = HFS_I(main_inode)->cat_key;
        if (hfs_brec_find(&fd))
                /* panic? */
                goto out;
 
-       if (S_ISDIR(inode->i_mode)) {
+       if (S_ISDIR(main_inode->i_mode)) {
                if (fd.entrylength < sizeof(struct hfs_cat_dir))
                        /* panic? */;
                hfs_bnode_read(fd.bnode, &rec, fd.entryoffset,
@@ -436,6 +438,13 @@ int hfs_write_inode(struct inode *inode, int unused)
 
                hfs_bnode_write(fd.bnode, &rec, fd.entryoffset,
                            sizeof(struct hfs_cat_dir));
+       } else if (HFS_IS_RSRC(inode)) {
+               hfs_bnode_read(fd.bnode, &rec, fd.entryoffset,
+                              sizeof(struct hfs_cat_file));
+               hfs_inode_write_fork(inode, rec.file.RExtRec,
+                                    &rec.file.RLgLen, &rec.file.RPyLen);
+               hfs_bnode_write(fd.bnode, &rec, fd.entryoffset,
+                               sizeof(struct hfs_cat_file));
        } else {
                if (fd.entrylength < sizeof(struct hfs_cat_file))
                        /* panic? */;
@@ -450,9 +459,6 @@ int hfs_write_inode(struct inode *inode, int unused)
                else
                        rec.file.Flags |= HFS_FIL_LOCK;
                hfs_inode_write_fork(inode, rec.file.ExtRec, &rec.file.LgLen, &rec.file.PyLen);
-               if (HFS_I(inode)->rsrc_inode)
-                       hfs_inode_write_fork(HFS_I(inode)->rsrc_inode, rec.file.RExtRec,
-                                            &rec.file.RLgLen, &rec.file.RPyLen);
                rec.file.MdDat = hfs_u_to_mtime(inode->i_mtime);
 
                hfs_bnode_write(fd.bnode, &rec, fd.entryoffset,
@@ -517,7 +523,7 @@ static int hfs_permission(struct inode *inode, int mask,
 {
        if (S_ISREG(inode->i_mode) && mask & MAY_EXEC)
                return 0;
-       return vfs_permission(inode, mask);
+       return generic_permission(inode, mask, NULL);
 }
 
 static int hfs_file_open(struct inode *inode, struct file *file)
@@ -621,4 +627,7 @@ struct inode_operations hfs_file_inode_operations = {
        .truncate       = hfs_file_truncate,
        .setattr        = hfs_inode_setattr,
        .permission     = hfs_permission,
+       .setxattr       = hfs_setxattr,
+       .getxattr       = hfs_getxattr,
+       .listxattr      = hfs_listxattr,
 };