diff options
Diffstat (limited to 'fs/hfsplus/inode.c')
| -rw-r--r-- | fs/hfsplus/inode.c | 185 |
1 files changed, 91 insertions, 94 deletions
diff --git a/fs/hfsplus/inode.c b/fs/hfsplus/inode.c index c5a979d62c65..78449280dae0 100644 --- a/fs/hfsplus/inode.c +++ b/fs/hfsplus/inode.c | |||
| @@ -36,7 +36,7 @@ static int hfsplus_write_begin(struct file *file, struct address_space *mapping, | |||
| 36 | *pagep = NULL; | 36 | *pagep = NULL; |
| 37 | ret = cont_write_begin(file, mapping, pos, len, flags, pagep, fsdata, | 37 | ret = cont_write_begin(file, mapping, pos, len, flags, pagep, fsdata, |
| 38 | hfsplus_get_block, | 38 | hfsplus_get_block, |
| 39 | &HFSPLUS_I(mapping->host).phys_size); | 39 | &HFSPLUS_I(mapping->host)->phys_size); |
| 40 | if (unlikely(ret)) { | 40 | if (unlikely(ret)) { |
| 41 | loff_t isize = mapping->host->i_size; | 41 | loff_t isize = mapping->host->i_size; |
| 42 | if (pos + len > isize) | 42 | if (pos + len > isize) |
| @@ -62,13 +62,13 @@ static int hfsplus_releasepage(struct page *page, gfp_t mask) | |||
| 62 | 62 | ||
| 63 | switch (inode->i_ino) { | 63 | switch (inode->i_ino) { |
| 64 | case HFSPLUS_EXT_CNID: | 64 | case HFSPLUS_EXT_CNID: |
| 65 | tree = HFSPLUS_SB(sb).ext_tree; | 65 | tree = HFSPLUS_SB(sb)->ext_tree; |
| 66 | break; | 66 | break; |
| 67 | case HFSPLUS_CAT_CNID: | 67 | case HFSPLUS_CAT_CNID: |
| 68 | tree = HFSPLUS_SB(sb).cat_tree; | 68 | tree = HFSPLUS_SB(sb)->cat_tree; |
| 69 | break; | 69 | break; |
| 70 | case HFSPLUS_ATTR_CNID: | 70 | case HFSPLUS_ATTR_CNID: |
| 71 | tree = HFSPLUS_SB(sb).attr_tree; | 71 | tree = HFSPLUS_SB(sb)->attr_tree; |
| 72 | break; | 72 | break; |
| 73 | default: | 73 | default: |
| 74 | BUG(); | 74 | BUG(); |
| @@ -172,12 +172,13 @@ static struct dentry *hfsplus_file_lookup(struct inode *dir, struct dentry *dent | |||
| 172 | struct hfs_find_data fd; | 172 | struct hfs_find_data fd; |
| 173 | struct super_block *sb = dir->i_sb; | 173 | struct super_block *sb = dir->i_sb; |
| 174 | struct inode *inode = NULL; | 174 | struct inode *inode = NULL; |
| 175 | struct hfsplus_inode_info *hip; | ||
| 175 | int err; | 176 | int err; |
| 176 | 177 | ||
| 177 | if (HFSPLUS_IS_RSRC(dir) || strcmp(dentry->d_name.name, "rsrc")) | 178 | if (HFSPLUS_IS_RSRC(dir) || strcmp(dentry->d_name.name, "rsrc")) |
| 178 | goto out; | 179 | goto out; |
| 179 | 180 | ||
| 180 | inode = HFSPLUS_I(dir).rsrc_inode; | 181 | inode = HFSPLUS_I(dir)->rsrc_inode; |
| 181 | if (inode) | 182 | if (inode) |
| 182 | goto out; | 183 | goto out; |
| 183 | 184 | ||
| @@ -185,12 +186,13 @@ static struct dentry *hfsplus_file_lookup(struct inode *dir, struct dentry *dent | |||
| 185 | if (!inode) | 186 | if (!inode) |
| 186 | return ERR_PTR(-ENOMEM); | 187 | return ERR_PTR(-ENOMEM); |
| 187 | 188 | ||
| 189 | hip = HFSPLUS_I(inode); | ||
| 188 | inode->i_ino = dir->i_ino; | 190 | inode->i_ino = dir->i_ino; |
| 189 | INIT_LIST_HEAD(&HFSPLUS_I(inode).open_dir_list); | 191 | INIT_LIST_HEAD(&hip->open_dir_list); |
| 190 | mutex_init(&HFSPLUS_I(inode).extents_lock); | 192 | mutex_init(&hip->extents_lock); |
| 191 | HFSPLUS_I(inode).flags = HFSPLUS_FLG_RSRC; | 193 | hip->flags = HFSPLUS_FLG_RSRC; |
| 192 | 194 | ||
| 193 | hfs_find_init(HFSPLUS_SB(sb).cat_tree, &fd); | 195 | hfs_find_init(HFSPLUS_SB(sb)->cat_tree, &fd); |
| 194 | err = hfsplus_find_cat(sb, dir->i_ino, &fd); | 196 | err = hfsplus_find_cat(sb, dir->i_ino, &fd); |
| 195 | if (!err) | 197 | if (!err) |
| 196 | err = hfsplus_cat_read_inode(inode, &fd); | 198 | err = hfsplus_cat_read_inode(inode, &fd); |
| @@ -199,10 +201,18 @@ static struct dentry *hfsplus_file_lookup(struct inode *dir, struct dentry *dent | |||
| 199 | iput(inode); | 201 | iput(inode); |
| 200 | return ERR_PTR(err); | 202 | return ERR_PTR(err); |
| 201 | } | 203 | } |
| 202 | HFSPLUS_I(inode).rsrc_inode = dir; | 204 | hip->rsrc_inode = dir; |
| 203 | HFSPLUS_I(dir).rsrc_inode = inode; | 205 | HFSPLUS_I(dir)->rsrc_inode = inode; |
| 204 | igrab(dir); | 206 | igrab(dir); |
| 205 | hlist_add_head(&inode->i_hash, &HFSPLUS_SB(sb).rsrc_inodes); | 207 | |
| 208 | /* | ||
| 209 | * __mark_inode_dirty expects inodes to be hashed. Since we don't | ||
| 210 | * want resource fork inodes in the regular inode space, we make them | ||
| 211 | * appear hashed, but do not put on any lists. hlist_del() | ||
| 212 | * will work fine and require no locking. | ||
| 213 | */ | ||
| 214 | inode->i_hash.pprev = &inode->i_hash.next; | ||
| 215 | |||
| 206 | mark_inode_dirty(inode); | 216 | mark_inode_dirty(inode); |
| 207 | out: | 217 | out: |
| 208 | d_add(dentry, inode); | 218 | d_add(dentry, inode); |
| @@ -211,30 +221,27 @@ out: | |||
| 211 | 221 | ||
| 212 | static void hfsplus_get_perms(struct inode *inode, struct hfsplus_perm *perms, int dir) | 222 | static void hfsplus_get_perms(struct inode *inode, struct hfsplus_perm *perms, int dir) |
| 213 | { | 223 | { |
| 214 | struct super_block *sb = inode->i_sb; | 224 | struct hfsplus_sb_info *sbi = HFSPLUS_SB(inode->i_sb); |
| 215 | u16 mode; | 225 | u16 mode; |
| 216 | 226 | ||
| 217 | mode = be16_to_cpu(perms->mode); | 227 | mode = be16_to_cpu(perms->mode); |
| 218 | 228 | ||
| 219 | inode->i_uid = be32_to_cpu(perms->owner); | 229 | inode->i_uid = be32_to_cpu(perms->owner); |
| 220 | if (!inode->i_uid && !mode) | 230 | if (!inode->i_uid && !mode) |
| 221 | inode->i_uid = HFSPLUS_SB(sb).uid; | 231 | inode->i_uid = sbi->uid; |
| 222 | 232 | ||
| 223 | inode->i_gid = be32_to_cpu(perms->group); | 233 | inode->i_gid = be32_to_cpu(perms->group); |
| 224 | if (!inode->i_gid && !mode) | 234 | if (!inode->i_gid && !mode) |
| 225 | inode->i_gid = HFSPLUS_SB(sb).gid; | 235 | inode->i_gid = sbi->gid; |
| 226 | 236 | ||
| 227 | if (dir) { | 237 | if (dir) { |
| 228 | mode = mode ? (mode & S_IALLUGO) : | 238 | mode = mode ? (mode & S_IALLUGO) : (S_IRWXUGO & ~(sbi->umask)); |
| 229 | (S_IRWXUGO & ~(HFSPLUS_SB(sb).umask)); | ||
| 230 | mode |= S_IFDIR; | 239 | mode |= S_IFDIR; |
| 231 | } else if (!mode) | 240 | } else if (!mode) |
| 232 | mode = S_IFREG | ((S_IRUGO|S_IWUGO) & | 241 | mode = S_IFREG | ((S_IRUGO|S_IWUGO) & ~(sbi->umask)); |
| 233 | ~(HFSPLUS_SB(sb).umask)); | ||
| 234 | inode->i_mode = mode; | 242 | inode->i_mode = mode; |
| 235 | 243 | ||
| 236 | HFSPLUS_I(inode).rootflags = perms->rootflags; | 244 | HFSPLUS_I(inode)->userflags = perms->userflags; |
| 237 | HFSPLUS_I(inode).userflags = perms->userflags; | ||
| 238 | if (perms->rootflags & HFSPLUS_FLG_IMMUTABLE) | 245 | if (perms->rootflags & HFSPLUS_FLG_IMMUTABLE) |
| 239 | inode->i_flags |= S_IMMUTABLE; | 246 | inode->i_flags |= S_IMMUTABLE; |
| 240 | else | 247 | else |
| @@ -245,30 +252,13 @@ static void hfsplus_get_perms(struct inode *inode, struct hfsplus_perm *perms, i | |||
| 245 | inode->i_flags &= ~S_APPEND; | 252 | inode->i_flags &= ~S_APPEND; |
| 246 | } | 253 | } |
| 247 | 254 | ||
| 248 | static void hfsplus_set_perms(struct inode *inode, struct hfsplus_perm *perms) | ||
| 249 | { | ||
| 250 | if (inode->i_flags & S_IMMUTABLE) | ||
| 251 | perms->rootflags |= HFSPLUS_FLG_IMMUTABLE; | ||
| 252 | else | ||
| 253 | perms->rootflags &= ~HFSPLUS_FLG_IMMUTABLE; | ||
| 254 | if (inode->i_flags & S_APPEND) | ||
| 255 | perms->rootflags |= HFSPLUS_FLG_APPEND; | ||
| 256 | else | ||
| 257 | perms->rootflags &= ~HFSPLUS_FLG_APPEND; | ||
| 258 | perms->userflags = HFSPLUS_I(inode).userflags; | ||
| 259 | perms->mode = cpu_to_be16(inode->i_mode); | ||
| 260 | perms->owner = cpu_to_be32(inode->i_uid); | ||
| 261 | perms->group = cpu_to_be32(inode->i_gid); | ||
| 262 | perms->dev = cpu_to_be32(HFSPLUS_I(inode).dev); | ||
| 263 | } | ||
| 264 | |||
| 265 | static int hfsplus_file_open(struct inode *inode, struct file *file) | 255 | static int hfsplus_file_open(struct inode *inode, struct file *file) |
| 266 | { | 256 | { |
| 267 | if (HFSPLUS_IS_RSRC(inode)) | 257 | if (HFSPLUS_IS_RSRC(inode)) |
| 268 | inode = HFSPLUS_I(inode).rsrc_inode; | 258 | inode = HFSPLUS_I(inode)->rsrc_inode; |
| 269 | if (!(file->f_flags & O_LARGEFILE) && i_size_read(inode) > MAX_NON_LFS) | 259 | if (!(file->f_flags & O_LARGEFILE) && i_size_read(inode) > MAX_NON_LFS) |
| 270 | return -EOVERFLOW; | 260 | return -EOVERFLOW; |
| 271 | atomic_inc(&HFSPLUS_I(inode).opencnt); | 261 | atomic_inc(&HFSPLUS_I(inode)->opencnt); |
| 272 | return 0; | 262 | return 0; |
| 273 | } | 263 | } |
| 274 | 264 | ||
| @@ -277,12 +267,13 @@ static int hfsplus_file_release(struct inode *inode, struct file *file) | |||
| 277 | struct super_block *sb = inode->i_sb; | 267 | struct super_block *sb = inode->i_sb; |
| 278 | 268 | ||
| 279 | if (HFSPLUS_IS_RSRC(inode)) | 269 | if (HFSPLUS_IS_RSRC(inode)) |
| 280 | inode = HFSPLUS_I(inode).rsrc_inode; | 270 | inode = HFSPLUS_I(inode)->rsrc_inode; |
| 281 | if (atomic_dec_and_test(&HFSPLUS_I(inode).opencnt)) { | 271 | if (atomic_dec_and_test(&HFSPLUS_I(inode)->opencnt)) { |
| 282 | mutex_lock(&inode->i_mutex); | 272 | mutex_lock(&inode->i_mutex); |
| 283 | hfsplus_file_truncate(inode); | 273 | hfsplus_file_truncate(inode); |
| 284 | if (inode->i_flags & S_DEAD) { | 274 | if (inode->i_flags & S_DEAD) { |
| 285 | hfsplus_delete_cat(inode->i_ino, HFSPLUS_SB(sb).hidden_dir, NULL); | 275 | hfsplus_delete_cat(inode->i_ino, |
| 276 | HFSPLUS_SB(sb)->hidden_dir, NULL); | ||
| 286 | hfsplus_delete_inode(inode); | 277 | hfsplus_delete_inode(inode); |
| 287 | } | 278 | } |
| 288 | mutex_unlock(&inode->i_mutex); | 279 | mutex_unlock(&inode->i_mutex); |
| @@ -361,47 +352,52 @@ static const struct file_operations hfsplus_file_operations = { | |||
| 361 | 352 | ||
| 362 | struct inode *hfsplus_new_inode(struct super_block *sb, int mode) | 353 | struct inode *hfsplus_new_inode(struct super_block *sb, int mode) |
| 363 | { | 354 | { |
| 355 | struct hfsplus_sb_info *sbi = HFSPLUS_SB(sb); | ||
| 364 | struct inode *inode = new_inode(sb); | 356 | struct inode *inode = new_inode(sb); |
| 357 | struct hfsplus_inode_info *hip; | ||
| 358 | |||
| 365 | if (!inode) | 359 | if (!inode) |
| 366 | return NULL; | 360 | return NULL; |
| 367 | 361 | ||
| 368 | inode->i_ino = HFSPLUS_SB(sb).next_cnid++; | 362 | inode->i_ino = sbi->next_cnid++; |
| 369 | inode->i_mode = mode; | 363 | inode->i_mode = mode; |
| 370 | inode->i_uid = current_fsuid(); | 364 | inode->i_uid = current_fsuid(); |
| 371 | inode->i_gid = current_fsgid(); | 365 | inode->i_gid = current_fsgid(); |
| 372 | inode->i_nlink = 1; | 366 | inode->i_nlink = 1; |
| 373 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC; | 367 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC; |
| 374 | INIT_LIST_HEAD(&HFSPLUS_I(inode).open_dir_list); | 368 | |
| 375 | mutex_init(&HFSPLUS_I(inode).extents_lock); | 369 | hip = HFSPLUS_I(inode); |
| 376 | atomic_set(&HFSPLUS_I(inode).opencnt, 0); | 370 | INIT_LIST_HEAD(&hip->open_dir_list); |
| 377 | HFSPLUS_I(inode).flags = 0; | 371 | mutex_init(&hip->extents_lock); |
| 378 | memset(HFSPLUS_I(inode).first_extents, 0, sizeof(hfsplus_extent_rec)); | 372 | atomic_set(&hip->opencnt, 0); |
| 379 | memset(HFSPLUS_I(inode).cached_extents, 0, sizeof(hfsplus_extent_rec)); | 373 | hip->flags = 0; |
| 380 | HFSPLUS_I(inode).alloc_blocks = 0; | 374 | memset(hip->first_extents, 0, sizeof(hfsplus_extent_rec)); |
| 381 | HFSPLUS_I(inode).first_blocks = 0; | 375 | memset(hip->cached_extents, 0, sizeof(hfsplus_extent_rec)); |
| 382 | HFSPLUS_I(inode).cached_start = 0; | 376 | hip->alloc_blocks = 0; |
| 383 | HFSPLUS_I(inode).cached_blocks = 0; | 377 | hip->first_blocks = 0; |
| 384 | HFSPLUS_I(inode).phys_size = 0; | 378 | hip->cached_start = 0; |
| 385 | HFSPLUS_I(inode).fs_blocks = 0; | 379 | hip->cached_blocks = 0; |
| 386 | HFSPLUS_I(inode).rsrc_inode = NULL; | 380 | hip->phys_size = 0; |
| 381 | hip->fs_blocks = 0; | ||
| 382 | hip->rsrc_inode = NULL; | ||
| 387 | if (S_ISDIR(inode->i_mode)) { | 383 | if (S_ISDIR(inode->i_mode)) { |
| 388 | inode->i_size = 2; | 384 | inode->i_size = 2; |
| 389 | HFSPLUS_SB(sb).folder_count++; | 385 | sbi->folder_count++; |
| 390 | inode->i_op = &hfsplus_dir_inode_operations; | 386 | inode->i_op = &hfsplus_dir_inode_operations; |
| 391 | inode->i_fop = &hfsplus_dir_operations; | 387 | inode->i_fop = &hfsplus_dir_operations; |
| 392 | } else if (S_ISREG(inode->i_mode)) { | 388 | } else if (S_ISREG(inode->i_mode)) { |
| 393 | HFSPLUS_SB(sb).file_count++; | 389 | sbi->file_count++; |
| 394 | inode->i_op = &hfsplus_file_inode_operations; | 390 | inode->i_op = &hfsplus_file_inode_operations; |
| 395 | inode->i_fop = &hfsplus_file_operations; | 391 | inode->i_fop = &hfsplus_file_operations; |
| 396 | inode->i_mapping->a_ops = &hfsplus_aops; | 392 | inode->i_mapping->a_ops = &hfsplus_aops; |
| 397 | HFSPLUS_I(inode).clump_blocks = HFSPLUS_SB(sb).data_clump_blocks; | 393 | hip->clump_blocks = sbi->data_clump_blocks; |
| 398 | } else if (S_ISLNK(inode->i_mode)) { | 394 | } else if (S_ISLNK(inode->i_mode)) { |
| 399 | HFSPLUS_SB(sb).file_count++; | 395 | sbi->file_count++; |
| 400 | inode->i_op = &page_symlink_inode_operations; | 396 | inode->i_op = &page_symlink_inode_operations; |
| 401 | inode->i_mapping->a_ops = &hfsplus_aops; | 397 | inode->i_mapping->a_ops = &hfsplus_aops; |
| 402 | HFSPLUS_I(inode).clump_blocks = 1; | 398 | hip->clump_blocks = 1; |
| 403 | } else | 399 | } else |
| 404 | HFSPLUS_SB(sb).file_count++; | 400 | sbi->file_count++; |
| 405 | insert_inode_hash(inode); | 401 | insert_inode_hash(inode); |
| 406 | mark_inode_dirty(inode); | 402 | mark_inode_dirty(inode); |
| 407 | sb->s_dirt = 1; | 403 | sb->s_dirt = 1; |
| @@ -414,11 +410,11 @@ void hfsplus_delete_inode(struct inode *inode) | |||
| 414 | struct super_block *sb = inode->i_sb; | 410 | struct super_block *sb = inode->i_sb; |
| 415 | 411 | ||
| 416 | if (S_ISDIR(inode->i_mode)) { | 412 | if (S_ISDIR(inode->i_mode)) { |
| 417 | HFSPLUS_SB(sb).folder_count--; | 413 | HFSPLUS_SB(sb)->folder_count--; |
| 418 | sb->s_dirt = 1; | 414 | sb->s_dirt = 1; |
| 419 | return; | 415 | return; |
| 420 | } | 416 | } |
| 421 | HFSPLUS_SB(sb).file_count--; | 417 | HFSPLUS_SB(sb)->file_count--; |
| 422 | if (S_ISREG(inode->i_mode)) { | 418 | if (S_ISREG(inode->i_mode)) { |
| 423 | if (!inode->i_nlink) { | 419 | if (!inode->i_nlink) { |
| 424 | inode->i_size = 0; | 420 | inode->i_size = 0; |
| @@ -434,34 +430,39 @@ void hfsplus_delete_inode(struct inode *inode) | |||
| 434 | void hfsplus_inode_read_fork(struct inode *inode, struct hfsplus_fork_raw *fork) | 430 | void hfsplus_inode_read_fork(struct inode *inode, struct hfsplus_fork_raw *fork) |
| 435 | { | 431 | { |
| 436 | struct super_block *sb = inode->i_sb; | 432 | struct super_block *sb = inode->i_sb; |
| 433 | struct hfsplus_sb_info *sbi = HFSPLUS_SB(sb); | ||
| 434 | struct hfsplus_inode_info *hip = HFSPLUS_I(inode); | ||
| 437 | u32 count; | 435 | u32 count; |
| 438 | int i; | 436 | int i; |
| 439 | 437 | ||
| 440 | memcpy(&HFSPLUS_I(inode).first_extents, &fork->extents, | 438 | memcpy(&hip->first_extents, &fork->extents, sizeof(hfsplus_extent_rec)); |
| 441 | sizeof(hfsplus_extent_rec)); | ||
| 442 | for (count = 0, i = 0; i < 8; i++) | 439 | for (count = 0, i = 0; i < 8; i++) |
| 443 | count += be32_to_cpu(fork->extents[i].block_count); | 440 | count += be32_to_cpu(fork->extents[i].block_count); |
| 444 | HFSPLUS_I(inode).first_blocks = count; | 441 | hip->first_blocks = count; |
| 445 | memset(HFSPLUS_I(inode).cached_extents, 0, sizeof(hfsplus_extent_rec)); | 442 | memset(hip->cached_extents, 0, sizeof(hfsplus_extent_rec)); |
| 446 | HFSPLUS_I(inode).cached_start = 0; | 443 | hip->cached_start = 0; |
| 447 | HFSPLUS_I(inode).cached_blocks = 0; | 444 | hip->cached_blocks = 0; |
| 448 | 445 | ||
| 449 | HFSPLUS_I(inode).alloc_blocks = be32_to_cpu(fork->total_blocks); | 446 | hip->alloc_blocks = be32_to_cpu(fork->total_blocks); |
| 450 | inode->i_size = HFSPLUS_I(inode).phys_size = be64_to_cpu(fork->total_size); | 447 | hip->phys_size = inode->i_size = be64_to_cpu(fork->total_size); |
| 451 | HFSPLUS_I(inode).fs_blocks = (inode->i_size + sb->s_blocksize - 1) >> sb->s_blocksize_bits; | 448 | hip->fs_blocks = |
| 452 | inode_set_bytes(inode, HFSPLUS_I(inode).fs_blocks << sb->s_blocksize_bits); | 449 | (inode->i_size + sb->s_blocksize - 1) >> sb->s_blocksize_bits; |
| 453 | HFSPLUS_I(inode).clump_blocks = be32_to_cpu(fork->clump_size) >> HFSPLUS_SB(sb).alloc_blksz_shift; | 450 | inode_set_bytes(inode, hip->fs_blocks << sb->s_blocksize_bits); |
| 454 | if (!HFSPLUS_I(inode).clump_blocks) | 451 | hip->clump_blocks = |
| 455 | HFSPLUS_I(inode).clump_blocks = HFSPLUS_IS_RSRC(inode) ? HFSPLUS_SB(sb).rsrc_clump_blocks : | 452 | be32_to_cpu(fork->clump_size) >> sbi->alloc_blksz_shift; |
| 456 | HFSPLUS_SB(sb).data_clump_blocks; | 453 | if (!hip->clump_blocks) { |
| 454 | hip->clump_blocks = HFSPLUS_IS_RSRC(inode) ? | ||
| 455 | sbi->rsrc_clump_blocks : | ||
| 456 | sbi->data_clump_blocks; | ||
| 457 | } | ||
| 457 | } | 458 | } |
| 458 | 459 | ||
| 459 | void hfsplus_inode_write_fork(struct inode *inode, struct hfsplus_fork_raw *fork) | 460 | void hfsplus_inode_write_fork(struct inode *inode, struct hfsplus_fork_raw *fork) |
| 460 | { | 461 | { |
| 461 | memcpy(&fork->extents, &HFSPLUS_I(inode).first_extents, | 462 | memcpy(&fork->extents, &HFSPLUS_I(inode)->first_extents, |
| 462 | sizeof(hfsplus_extent_rec)); | 463 | sizeof(hfsplus_extent_rec)); |
| 463 | fork->total_size = cpu_to_be64(inode->i_size); | 464 | fork->total_size = cpu_to_be64(inode->i_size); |
| 464 | fork->total_blocks = cpu_to_be32(HFSPLUS_I(inode).alloc_blocks); | 465 | fork->total_blocks = cpu_to_be32(HFSPLUS_I(inode)->alloc_blocks); |
| 465 | } | 466 | } |
| 466 | 467 | ||
| 467 | int hfsplus_cat_read_inode(struct inode *inode, struct hfs_find_data *fd) | 468 | int hfsplus_cat_read_inode(struct inode *inode, struct hfs_find_data *fd) |
| @@ -472,7 +473,7 @@ int hfsplus_cat_read_inode(struct inode *inode, struct hfs_find_data *fd) | |||
| 472 | 473 | ||
| 473 | type = hfs_bnode_read_u16(fd->bnode, fd->entryoffset); | 474 | type = hfs_bnode_read_u16(fd->bnode, fd->entryoffset); |
| 474 | 475 | ||
| 475 | HFSPLUS_I(inode).dev = 0; | 476 | HFSPLUS_I(inode)->linkid = 0; |
| 476 | if (type == HFSPLUS_FOLDER) { | 477 | if (type == HFSPLUS_FOLDER) { |
| 477 | struct hfsplus_cat_folder *folder = &entry.folder; | 478 | struct hfsplus_cat_folder *folder = &entry.folder; |
| 478 | 479 | ||
| @@ -486,8 +487,8 @@ int hfsplus_cat_read_inode(struct inode *inode, struct hfs_find_data *fd) | |||
| 486 | inode->i_atime = hfsp_mt2ut(folder->access_date); | 487 | inode->i_atime = hfsp_mt2ut(folder->access_date); |
| 487 | inode->i_mtime = hfsp_mt2ut(folder->content_mod_date); | 488 | inode->i_mtime = hfsp_mt2ut(folder->content_mod_date); |
| 488 | inode->i_ctime = hfsp_mt2ut(folder->attribute_mod_date); | 489 | inode->i_ctime = hfsp_mt2ut(folder->attribute_mod_date); |
| 489 | HFSPLUS_I(inode).create_date = folder->create_date; | 490 | HFSPLUS_I(inode)->create_date = folder->create_date; |
| 490 | HFSPLUS_I(inode).fs_blocks = 0; | 491 | HFSPLUS_I(inode)->fs_blocks = 0; |
| 491 | inode->i_op = &hfsplus_dir_inode_operations; | 492 | inode->i_op = &hfsplus_dir_inode_operations; |
| 492 | inode->i_fop = &hfsplus_dir_operations; | 493 | inode->i_fop = &hfsplus_dir_operations; |
| 493 | } else if (type == HFSPLUS_FILE) { | 494 | } else if (type == HFSPLUS_FILE) { |
| @@ -518,7 +519,7 @@ int hfsplus_cat_read_inode(struct inode *inode, struct hfs_find_data *fd) | |||
| 518 | inode->i_atime = hfsp_mt2ut(file->access_date); | 519 | inode->i_atime = hfsp_mt2ut(file->access_date); |
| 519 | inode->i_mtime = hfsp_mt2ut(file->content_mod_date); | 520 | inode->i_mtime = hfsp_mt2ut(file->content_mod_date); |
| 520 | inode->i_ctime = hfsp_mt2ut(file->attribute_mod_date); | 521 | inode->i_ctime = hfsp_mt2ut(file->attribute_mod_date); |
| 521 | HFSPLUS_I(inode).create_date = file->create_date; | 522 | HFSPLUS_I(inode)->create_date = file->create_date; |
| 522 | } else { | 523 | } else { |
| 523 | printk(KERN_ERR "hfs: bad catalog entry used to create inode\n"); | 524 | printk(KERN_ERR "hfs: bad catalog entry used to create inode\n"); |
| 524 | res = -EIO; | 525 | res = -EIO; |
| @@ -533,12 +534,12 @@ int hfsplus_cat_write_inode(struct inode *inode) | |||
| 533 | hfsplus_cat_entry entry; | 534 | hfsplus_cat_entry entry; |
| 534 | 535 | ||
| 535 | if (HFSPLUS_IS_RSRC(inode)) | 536 | if (HFSPLUS_IS_RSRC(inode)) |
| 536 | main_inode = HFSPLUS_I(inode).rsrc_inode; | 537 | main_inode = HFSPLUS_I(inode)->rsrc_inode; |
| 537 | 538 | ||
| 538 | if (!main_inode->i_nlink) | 539 | if (!main_inode->i_nlink) |
| 539 | return 0; | 540 | return 0; |
| 540 | 541 | ||
| 541 | if (hfs_find_init(HFSPLUS_SB(main_inode->i_sb).cat_tree, &fd)) | 542 | if (hfs_find_init(HFSPLUS_SB(main_inode->i_sb)->cat_tree, &fd)) |
| 542 | /* panic? */ | 543 | /* panic? */ |
| 543 | return -EIO; | 544 | return -EIO; |
| 544 | 545 | ||
| @@ -554,7 +555,7 @@ int hfsplus_cat_write_inode(struct inode *inode) | |||
| 554 | hfs_bnode_read(fd.bnode, &entry, fd.entryoffset, | 555 | hfs_bnode_read(fd.bnode, &entry, fd.entryoffset, |
| 555 | sizeof(struct hfsplus_cat_folder)); | 556 | sizeof(struct hfsplus_cat_folder)); |
| 556 | /* simple node checks? */ | 557 | /* simple node checks? */ |
| 557 | hfsplus_set_perms(inode, &folder->permissions); | 558 | hfsplus_cat_set_perms(inode, &folder->permissions); |
| 558 | folder->access_date = hfsp_ut2mt(inode->i_atime); | 559 | folder->access_date = hfsp_ut2mt(inode->i_atime); |
| 559 | folder->content_mod_date = hfsp_ut2mt(inode->i_mtime); | 560 | folder->content_mod_date = hfsp_ut2mt(inode->i_mtime); |
| 560 | folder->attribute_mod_date = hfsp_ut2mt(inode->i_ctime); | 561 | folder->attribute_mod_date = hfsp_ut2mt(inode->i_ctime); |
| @@ -576,11 +577,7 @@ int hfsplus_cat_write_inode(struct inode *inode) | |||
| 576 | hfs_bnode_read(fd.bnode, &entry, fd.entryoffset, | 577 | hfs_bnode_read(fd.bnode, &entry, fd.entryoffset, |
| 577 | sizeof(struct hfsplus_cat_file)); | 578 | sizeof(struct hfsplus_cat_file)); |
| 578 | hfsplus_inode_write_fork(inode, &file->data_fork); | 579 | hfsplus_inode_write_fork(inode, &file->data_fork); |
| 579 | if (S_ISREG(inode->i_mode)) | 580 | hfsplus_cat_set_perms(inode, &file->permissions); |
| 580 | HFSPLUS_I(inode).dev = inode->i_nlink; | ||
| 581 | if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) | ||
| 582 | HFSPLUS_I(inode).dev = kdev_t_to_nr(inode->i_rdev); | ||
| 583 | hfsplus_set_perms(inode, &file->permissions); | ||
| 584 | if ((file->permissions.rootflags | file->permissions.userflags) & HFSPLUS_FLG_IMMUTABLE) | 581 | if ((file->permissions.rootflags | file->permissions.userflags) & HFSPLUS_FLG_IMMUTABLE) |
| 585 | file->flags |= cpu_to_be16(HFSPLUS_FILE_LOCKED); | 582 | file->flags |= cpu_to_be16(HFSPLUS_FILE_LOCKED); |
| 586 | else | 583 | else |
