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++;
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;
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;
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;
int hfs_write_inode(struct inode *inode, int unused)
{
+ struct inode *main_inode = inode;
struct hfs_find_data fd;
hfs_cat_rec rec;
}
}
- 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,
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? */;
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,
{
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)
.truncate = hfs_file_truncate,
.setattr = hfs_inode_setattr,
.permission = hfs_permission,
+ .setxattr = hfs_setxattr,
+ .getxattr = hfs_getxattr,
+ .listxattr = hfs_listxattr,
};