X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fhfs%2Finode.c;h=674acb1400bcf5c0aaeb47e911f864ede1555fe5;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=6c869f3779648adb008b10403e678001e2ef38c2;hpb=87fc8d1bb10cd459024a742c6a10961fefcef18f;p=linux-2.6.git diff --git a/fs/hfs/inode.c b/fs/hfs/inode.c index 6c869f377..674acb140 100644 --- a/fs/hfs/inode.c +++ b/fs/hfs/inode.c @@ -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, };