inode.c (239060b93bb30a4ad55f1ecaa512464a035cc5ba) | inode.c (f6089ff87d309a8ddb7b0d4dd92a570f1b0f689b) |
---|---|
1/* 2 * linux/fs/hfsplus/inode.c 3 * 4 * Copyright (C) 2001 5 * Brad Boyer (flar@allandria.com) 6 * (C) 2003 Ardis Technologies <roman@ardistech.com> 7 * 8 * Inode handling routines --- 22 unchanged lines hidden (view full) --- 31 loff_t pos, unsigned len, unsigned flags, 32 struct page **pagep, void **fsdata) 33{ 34 int ret; 35 36 *pagep = NULL; 37 ret = cont_write_begin(file, mapping, pos, len, flags, pagep, fsdata, 38 hfsplus_get_block, | 1/* 2 * linux/fs/hfsplus/inode.c 3 * 4 * Copyright (C) 2001 5 * Brad Boyer (flar@allandria.com) 6 * (C) 2003 Ardis Technologies <roman@ardistech.com> 7 * 8 * Inode handling routines --- 22 unchanged lines hidden (view full) --- 31 loff_t pos, unsigned len, unsigned flags, 32 struct page **pagep, void **fsdata) 33{ 34 int ret; 35 36 *pagep = NULL; 37 ret = cont_write_begin(file, mapping, pos, len, flags, pagep, fsdata, 38 hfsplus_get_block, |
39 &HFSPLUS_I(mapping->host).phys_size); | 39 &HFSPLUS_I(mapping->host)->phys_size); |
40 if (unlikely(ret)) { 41 loff_t isize = mapping->host->i_size; 42 if (pos + len > isize) 43 vmtruncate(mapping->host, isize); 44 } 45 46 return ret; 47} --- 9 unchanged lines hidden (view full) --- 57 struct super_block *sb = inode->i_sb; 58 struct hfs_btree *tree; 59 struct hfs_bnode *node; 60 u32 nidx; 61 int i, res = 1; 62 63 switch (inode->i_ino) { 64 case HFSPLUS_EXT_CNID: | 40 if (unlikely(ret)) { 41 loff_t isize = mapping->host->i_size; 42 if (pos + len > isize) 43 vmtruncate(mapping->host, isize); 44 } 45 46 return ret; 47} --- 9 unchanged lines hidden (view full) --- 57 struct super_block *sb = inode->i_sb; 58 struct hfs_btree *tree; 59 struct hfs_bnode *node; 60 u32 nidx; 61 int i, res = 1; 62 63 switch (inode->i_ino) { 64 case HFSPLUS_EXT_CNID: |
65 tree = HFSPLUS_SB(sb).ext_tree; | 65 tree = HFSPLUS_SB(sb)->ext_tree; |
66 break; 67 case HFSPLUS_CAT_CNID: | 66 break; 67 case HFSPLUS_CAT_CNID: |
68 tree = HFSPLUS_SB(sb).cat_tree; | 68 tree = HFSPLUS_SB(sb)->cat_tree; |
69 break; 70 case HFSPLUS_ATTR_CNID: | 69 break; 70 case HFSPLUS_ATTR_CNID: |
71 tree = HFSPLUS_SB(sb).attr_tree; | 71 tree = HFSPLUS_SB(sb)->attr_tree; |
72 break; 73 default: 74 BUG(); 75 return 0; 76 } 77 if (!tree) 78 return 0; 79 if (tree->node_size >= PAGE_CACHE_SIZE) { --- 87 unchanged lines hidden (view full) --- 167}; 168 169static struct dentry *hfsplus_file_lookup(struct inode *dir, struct dentry *dentry, 170 struct nameidata *nd) 171{ 172 struct hfs_find_data fd; 173 struct super_block *sb = dir->i_sb; 174 struct inode *inode = NULL; | 72 break; 73 default: 74 BUG(); 75 return 0; 76 } 77 if (!tree) 78 return 0; 79 if (tree->node_size >= PAGE_CACHE_SIZE) { --- 87 unchanged lines hidden (view full) --- 167}; 168 169static struct dentry *hfsplus_file_lookup(struct inode *dir, struct dentry *dentry, 170 struct nameidata *nd) 171{ 172 struct hfs_find_data fd; 173 struct super_block *sb = dir->i_sb; 174 struct inode *inode = NULL; |
175 struct hfsplus_inode_info *hip; |
|
175 int err; 176 177 if (HFSPLUS_IS_RSRC(dir) || strcmp(dentry->d_name.name, "rsrc")) 178 goto out; 179 | 176 int err; 177 178 if (HFSPLUS_IS_RSRC(dir) || strcmp(dentry->d_name.name, "rsrc")) 179 goto out; 180 |
180 inode = HFSPLUS_I(dir).rsrc_inode; | 181 inode = HFSPLUS_I(dir)->rsrc_inode; |
181 if (inode) 182 goto out; 183 184 inode = new_inode(sb); 185 if (!inode) 186 return ERR_PTR(-ENOMEM); 187 | 182 if (inode) 183 goto out; 184 185 inode = new_inode(sb); 186 if (!inode) 187 return ERR_PTR(-ENOMEM); 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); 190 mutex_init(&HFSPLUS_I(inode).extents_lock); 191 HFSPLUS_I(inode).flags = HFSPLUS_FLG_RSRC; | 191 INIT_LIST_HEAD(&hip->open_dir_list); 192 mutex_init(&hip->extents_lock); 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); 195 if (!err) 196 err = hfsplus_cat_read_inode(inode, &fd); 197 hfs_find_exit(&fd); 198 if (err) { 199 iput(inode); 200 return ERR_PTR(err); 201 } | 196 err = hfsplus_find_cat(sb, dir->i_ino, &fd); 197 if (!err) 198 err = hfsplus_cat_read_inode(inode, &fd); 199 hfs_find_exit(&fd); 200 if (err) { 201 iput(inode); 202 return ERR_PTR(err); 203 } |
202 HFSPLUS_I(inode).rsrc_inode = dir; 203 HFSPLUS_I(dir).rsrc_inode = inode; | 204 hip->rsrc_inode = dir; 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); 207out: 208 d_add(dentry, inode); 209 return NULL; 210} 211 212static void hfsplus_get_perms(struct inode *inode, struct hfsplus_perm *perms, int dir) 213{ | 216 mark_inode_dirty(inode); 217out: 218 d_add(dentry, inode); 219 return NULL; 220} 221 222static void hfsplus_get_perms(struct inode *inode, struct hfsplus_perm *perms, int dir) 223{ |
214 struct super_block *sb = inode->i_sb; | 224 struct hfsplus_sb_info *sbi = HFSPLUS_SB(inode->i_sb); |
215 u16 mode; 216 217 mode = be16_to_cpu(perms->mode); 218 219 inode->i_uid = be32_to_cpu(perms->owner); 220 if (!inode->i_uid && !mode) | 225 u16 mode; 226 227 mode = be16_to_cpu(perms->mode); 228 229 inode->i_uid = be32_to_cpu(perms->owner); 230 if (!inode->i_uid && !mode) |
221 inode->i_uid = HFSPLUS_SB(sb).uid; | 231 inode->i_uid = sbi->uid; |
222 223 inode->i_gid = be32_to_cpu(perms->group); 224 if (!inode->i_gid && !mode) | 232 233 inode->i_gid = be32_to_cpu(perms->group); 234 if (!inode->i_gid && !mode) |
225 inode->i_gid = HFSPLUS_SB(sb).gid; | 235 inode->i_gid = sbi->gid; |
226 227 if (dir) { | 236 237 if (dir) { |
228 mode = mode ? (mode & S_IALLUGO) : 229 (S_IRWXUGO & ~(HFSPLUS_SB(sb).umask)); | 238 mode = mode ? (mode & S_IALLUGO) : (S_IRWXUGO & ~(sbi->umask)); |
230 mode |= S_IFDIR; 231 } else if (!mode) | 239 mode |= S_IFDIR; 240 } else if (!mode) |
232 mode = S_IFREG | ((S_IRUGO|S_IWUGO) & 233 ~(HFSPLUS_SB(sb).umask)); | 241 mode = S_IFREG | ((S_IRUGO|S_IWUGO) & ~(sbi->umask)); |
234 inode->i_mode = mode; 235 | 242 inode->i_mode = mode; 243 |
236 HFSPLUS_I(inode).rootflags = perms->rootflags; 237 HFSPLUS_I(inode).userflags = perms->userflags; | 244 HFSPLUS_I(inode)->rootflags = perms->rootflags; 245 HFSPLUS_I(inode)->userflags = perms->userflags; |
238 if (perms->rootflags & HFSPLUS_FLG_IMMUTABLE) 239 inode->i_flags |= S_IMMUTABLE; 240 else 241 inode->i_flags &= ~S_IMMUTABLE; 242 if (perms->rootflags & HFSPLUS_FLG_APPEND) 243 inode->i_flags |= S_APPEND; 244 else 245 inode->i_flags &= ~S_APPEND; --- 4 unchanged lines hidden (view full) --- 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; | 246 if (perms->rootflags & HFSPLUS_FLG_IMMUTABLE) 247 inode->i_flags |= S_IMMUTABLE; 248 else 249 inode->i_flags &= ~S_IMMUTABLE; 250 if (perms->rootflags & HFSPLUS_FLG_APPEND) 251 inode->i_flags |= S_APPEND; 252 else 253 inode->i_flags &= ~S_APPEND; --- 4 unchanged lines hidden (view full) --- 258 if (inode->i_flags & S_IMMUTABLE) 259 perms->rootflags |= HFSPLUS_FLG_IMMUTABLE; 260 else 261 perms->rootflags &= ~HFSPLUS_FLG_IMMUTABLE; 262 if (inode->i_flags & S_APPEND) 263 perms->rootflags |= HFSPLUS_FLG_APPEND; 264 else 265 perms->rootflags &= ~HFSPLUS_FLG_APPEND; |
258 perms->userflags = HFSPLUS_I(inode).userflags; | 266 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); | 267 perms->mode = cpu_to_be16(inode->i_mode); 268 perms->owner = cpu_to_be32(inode->i_uid); 269 perms->group = cpu_to_be32(inode->i_gid); |
262 perms->dev = cpu_to_be32(HFSPLUS_I(inode).dev); | 270 271 if (S_ISREG(inode->i_mode)) 272 perms->dev = cpu_to_be32(inode->i_nlink); 273 else if (S_ISBLK(inode->i_mode) || S_ISCHR(inode->i_mode)) 274 perms->dev = cpu_to_be32(inode->i_rdev); 275 else 276 perms->dev = 0; |
263} 264 265static int hfsplus_file_open(struct inode *inode, struct file *file) 266{ 267 if (HFSPLUS_IS_RSRC(inode)) | 277} 278 279static int hfsplus_file_open(struct inode *inode, struct file *file) 280{ 281 if (HFSPLUS_IS_RSRC(inode)) |
268 inode = HFSPLUS_I(inode).rsrc_inode; | 282 inode = HFSPLUS_I(inode)->rsrc_inode; |
269 if (!(file->f_flags & O_LARGEFILE) && i_size_read(inode) > MAX_NON_LFS) 270 return -EOVERFLOW; | 283 if (!(file->f_flags & O_LARGEFILE) && i_size_read(inode) > MAX_NON_LFS) 284 return -EOVERFLOW; |
271 atomic_inc(&HFSPLUS_I(inode).opencnt); | 285 atomic_inc(&HFSPLUS_I(inode)->opencnt); |
272 return 0; 273} 274 275static int hfsplus_file_release(struct inode *inode, struct file *file) 276{ 277 struct super_block *sb = inode->i_sb; 278 279 if (HFSPLUS_IS_RSRC(inode)) | 286 return 0; 287} 288 289static int hfsplus_file_release(struct inode *inode, struct file *file) 290{ 291 struct super_block *sb = inode->i_sb; 292 293 if (HFSPLUS_IS_RSRC(inode)) |
280 inode = HFSPLUS_I(inode).rsrc_inode; 281 if (atomic_dec_and_test(&HFSPLUS_I(inode).opencnt)) { | 294 inode = HFSPLUS_I(inode)->rsrc_inode; 295 if (atomic_dec_and_test(&HFSPLUS_I(inode)->opencnt)) { |
282 mutex_lock(&inode->i_mutex); 283 hfsplus_file_truncate(inode); 284 if (inode->i_flags & S_DEAD) { | 296 mutex_lock(&inode->i_mutex); 297 hfsplus_file_truncate(inode); 298 if (inode->i_flags & S_DEAD) { |
285 hfsplus_delete_cat(inode->i_ino, HFSPLUS_SB(sb).hidden_dir, NULL); | 299 hfsplus_delete_cat(inode->i_ino, 300 HFSPLUS_SB(sb)->hidden_dir, NULL); |
286 hfsplus_delete_inode(inode); 287 } 288 mutex_unlock(&inode->i_mutex); 289 } 290 return 0; 291} 292 293static int hfsplus_setattr(struct dentry *dentry, struct iattr *attr) --- 62 unchanged lines hidden (view full) --- 356 .fsync = hfsplus_file_fsync, 357 .open = hfsplus_file_open, 358 .release = hfsplus_file_release, 359 .unlocked_ioctl = hfsplus_ioctl, 360}; 361 362struct inode *hfsplus_new_inode(struct super_block *sb, int mode) 363{ | 301 hfsplus_delete_inode(inode); 302 } 303 mutex_unlock(&inode->i_mutex); 304 } 305 return 0; 306} 307 308static int hfsplus_setattr(struct dentry *dentry, struct iattr *attr) --- 62 unchanged lines hidden (view full) --- 371 .fsync = hfsplus_file_fsync, 372 .open = hfsplus_file_open, 373 .release = hfsplus_file_release, 374 .unlocked_ioctl = hfsplus_ioctl, 375}; 376 377struct inode *hfsplus_new_inode(struct super_block *sb, int mode) 378{ |
379 struct hfsplus_sb_info *sbi = HFSPLUS_SB(sb); |
|
364 struct inode *inode = new_inode(sb); | 380 struct inode *inode = new_inode(sb); |
381 struct hfsplus_inode_info *hip; 382 |
|
365 if (!inode) 366 return NULL; 367 | 383 if (!inode) 384 return NULL; 385 |
368 inode->i_ino = HFSPLUS_SB(sb).next_cnid++; | 386 inode->i_ino = sbi->next_cnid++; |
369 inode->i_mode = mode; 370 inode->i_uid = current_fsuid(); 371 inode->i_gid = current_fsgid(); 372 inode->i_nlink = 1; 373 inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC; | 387 inode->i_mode = mode; 388 inode->i_uid = current_fsuid(); 389 inode->i_gid = current_fsgid(); 390 inode->i_nlink = 1; 391 inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC; |
374 INIT_LIST_HEAD(&HFSPLUS_I(inode).open_dir_list); 375 mutex_init(&HFSPLUS_I(inode).extents_lock); 376 atomic_set(&HFSPLUS_I(inode).opencnt, 0); 377 HFSPLUS_I(inode).flags = 0; 378 memset(HFSPLUS_I(inode).first_extents, 0, sizeof(hfsplus_extent_rec)); 379 memset(HFSPLUS_I(inode).cached_extents, 0, sizeof(hfsplus_extent_rec)); 380 HFSPLUS_I(inode).alloc_blocks = 0; 381 HFSPLUS_I(inode).first_blocks = 0; 382 HFSPLUS_I(inode).cached_start = 0; 383 HFSPLUS_I(inode).cached_blocks = 0; 384 HFSPLUS_I(inode).phys_size = 0; 385 HFSPLUS_I(inode).fs_blocks = 0; 386 HFSPLUS_I(inode).rsrc_inode = NULL; | 392 393 hip = HFSPLUS_I(inode); 394 INIT_LIST_HEAD(&hip->open_dir_list); 395 mutex_init(&hip->extents_lock); 396 atomic_set(&hip->opencnt, 0); 397 hip->flags = 0; 398 memset(hip->first_extents, 0, sizeof(hfsplus_extent_rec)); 399 memset(hip->cached_extents, 0, sizeof(hfsplus_extent_rec)); 400 hip->alloc_blocks = 0; 401 hip->first_blocks = 0; 402 hip->cached_start = 0; 403 hip->cached_blocks = 0; 404 hip->phys_size = 0; 405 hip->fs_blocks = 0; 406 hip->rsrc_inode = NULL; |
387 if (S_ISDIR(inode->i_mode)) { 388 inode->i_size = 2; | 407 if (S_ISDIR(inode->i_mode)) { 408 inode->i_size = 2; |
389 HFSPLUS_SB(sb).folder_count++; | 409 sbi->folder_count++; |
390 inode->i_op = &hfsplus_dir_inode_operations; 391 inode->i_fop = &hfsplus_dir_operations; 392 } else if (S_ISREG(inode->i_mode)) { | 410 inode->i_op = &hfsplus_dir_inode_operations; 411 inode->i_fop = &hfsplus_dir_operations; 412 } else if (S_ISREG(inode->i_mode)) { |
393 HFSPLUS_SB(sb).file_count++; | 413 sbi->file_count++; |
394 inode->i_op = &hfsplus_file_inode_operations; 395 inode->i_fop = &hfsplus_file_operations; 396 inode->i_mapping->a_ops = &hfsplus_aops; | 414 inode->i_op = &hfsplus_file_inode_operations; 415 inode->i_fop = &hfsplus_file_operations; 416 inode->i_mapping->a_ops = &hfsplus_aops; |
397 HFSPLUS_I(inode).clump_blocks = HFSPLUS_SB(sb).data_clump_blocks; | 417 hip->clump_blocks = sbi->data_clump_blocks; |
398 } else if (S_ISLNK(inode->i_mode)) { | 418 } else if (S_ISLNK(inode->i_mode)) { |
399 HFSPLUS_SB(sb).file_count++; | 419 sbi->file_count++; |
400 inode->i_op = &page_symlink_inode_operations; 401 inode->i_mapping->a_ops = &hfsplus_aops; | 420 inode->i_op = &page_symlink_inode_operations; 421 inode->i_mapping->a_ops = &hfsplus_aops; |
402 HFSPLUS_I(inode).clump_blocks = 1; | 422 hip->clump_blocks = 1; |
403 } else | 423 } else |
404 HFSPLUS_SB(sb).file_count++; | 424 sbi->file_count++; |
405 insert_inode_hash(inode); 406 mark_inode_dirty(inode); 407 sb->s_dirt = 1; 408 409 return inode; 410} 411 412void hfsplus_delete_inode(struct inode *inode) 413{ 414 struct super_block *sb = inode->i_sb; 415 416 if (S_ISDIR(inode->i_mode)) { | 425 insert_inode_hash(inode); 426 mark_inode_dirty(inode); 427 sb->s_dirt = 1; 428 429 return inode; 430} 431 432void hfsplus_delete_inode(struct inode *inode) 433{ 434 struct super_block *sb = inode->i_sb; 435 436 if (S_ISDIR(inode->i_mode)) { |
417 HFSPLUS_SB(sb).folder_count--; | 437 HFSPLUS_SB(sb)->folder_count--; |
418 sb->s_dirt = 1; 419 return; 420 } | 438 sb->s_dirt = 1; 439 return; 440 } |
421 HFSPLUS_SB(sb).file_count--; | 441 HFSPLUS_SB(sb)->file_count--; |
422 if (S_ISREG(inode->i_mode)) { 423 if (!inode->i_nlink) { 424 inode->i_size = 0; 425 hfsplus_file_truncate(inode); 426 } 427 } else if (S_ISLNK(inode->i_mode)) { 428 inode->i_size = 0; 429 hfsplus_file_truncate(inode); 430 } 431 sb->s_dirt = 1; 432} 433 434void hfsplus_inode_read_fork(struct inode *inode, struct hfsplus_fork_raw *fork) 435{ 436 struct super_block *sb = inode->i_sb; | 442 if (S_ISREG(inode->i_mode)) { 443 if (!inode->i_nlink) { 444 inode->i_size = 0; 445 hfsplus_file_truncate(inode); 446 } 447 } else if (S_ISLNK(inode->i_mode)) { 448 inode->i_size = 0; 449 hfsplus_file_truncate(inode); 450 } 451 sb->s_dirt = 1; 452} 453 454void hfsplus_inode_read_fork(struct inode *inode, struct hfsplus_fork_raw *fork) 455{ 456 struct super_block *sb = inode->i_sb; |
457 struct hfsplus_sb_info *sbi = HFSPLUS_SB(sb); 458 struct hfsplus_inode_info *hip = HFSPLUS_I(inode); |
|
437 u32 count; 438 int i; 439 | 459 u32 count; 460 int i; 461 |
440 memcpy(&HFSPLUS_I(inode).first_extents, &fork->extents, 441 sizeof(hfsplus_extent_rec)); | 462 memcpy(&hip->first_extents, &fork->extents, sizeof(hfsplus_extent_rec)); |
442 for (count = 0, i = 0; i < 8; i++) 443 count += be32_to_cpu(fork->extents[i].block_count); | 463 for (count = 0, i = 0; i < 8; i++) 464 count += be32_to_cpu(fork->extents[i].block_count); |
444 HFSPLUS_I(inode).first_blocks = count; 445 memset(HFSPLUS_I(inode).cached_extents, 0, sizeof(hfsplus_extent_rec)); 446 HFSPLUS_I(inode).cached_start = 0; 447 HFSPLUS_I(inode).cached_blocks = 0; | 465 hip->first_blocks = count; 466 memset(hip->cached_extents, 0, sizeof(hfsplus_extent_rec)); 467 hip->cached_start = 0; 468 hip->cached_blocks = 0; |
448 | 469 |
449 HFSPLUS_I(inode).alloc_blocks = be32_to_cpu(fork->total_blocks); 450 inode->i_size = HFSPLUS_I(inode).phys_size = be64_to_cpu(fork->total_size); 451 HFSPLUS_I(inode).fs_blocks = (inode->i_size + sb->s_blocksize - 1) >> sb->s_blocksize_bits; 452 inode_set_bytes(inode, HFSPLUS_I(inode).fs_blocks << sb->s_blocksize_bits); 453 HFSPLUS_I(inode).clump_blocks = be32_to_cpu(fork->clump_size) >> HFSPLUS_SB(sb).alloc_blksz_shift; 454 if (!HFSPLUS_I(inode).clump_blocks) 455 HFSPLUS_I(inode).clump_blocks = HFSPLUS_IS_RSRC(inode) ? HFSPLUS_SB(sb).rsrc_clump_blocks : 456 HFSPLUS_SB(sb).data_clump_blocks; | 470 hip->alloc_blocks = be32_to_cpu(fork->total_blocks); 471 hip->phys_size = inode->i_size = be64_to_cpu(fork->total_size); 472 hip->fs_blocks = 473 (inode->i_size + sb->s_blocksize - 1) >> sb->s_blocksize_bits; 474 inode_set_bytes(inode, hip->fs_blocks << sb->s_blocksize_bits); 475 hip->clump_blocks = 476 be32_to_cpu(fork->clump_size) >> sbi->alloc_blksz_shift; 477 if (!hip->clump_blocks) { 478 hip->clump_blocks = HFSPLUS_IS_RSRC(inode) ? 479 sbi->rsrc_clump_blocks : 480 sbi->data_clump_blocks; 481 } |
457} 458 459void hfsplus_inode_write_fork(struct inode *inode, struct hfsplus_fork_raw *fork) 460{ | 482} 483 484void hfsplus_inode_write_fork(struct inode *inode, struct hfsplus_fork_raw *fork) 485{ |
461 memcpy(&fork->extents, &HFSPLUS_I(inode).first_extents, | 486 memcpy(&fork->extents, &HFSPLUS_I(inode)->first_extents, |
462 sizeof(hfsplus_extent_rec)); 463 fork->total_size = cpu_to_be64(inode->i_size); | 487 sizeof(hfsplus_extent_rec)); 488 fork->total_size = cpu_to_be64(inode->i_size); |
464 fork->total_blocks = cpu_to_be32(HFSPLUS_I(inode).alloc_blocks); | 489 fork->total_blocks = cpu_to_be32(HFSPLUS_I(inode)->alloc_blocks); |
465} 466 467int hfsplus_cat_read_inode(struct inode *inode, struct hfs_find_data *fd) 468{ 469 hfsplus_cat_entry entry; 470 int res = 0; 471 u16 type; 472 473 type = hfs_bnode_read_u16(fd->bnode, fd->entryoffset); 474 | 490} 491 492int hfsplus_cat_read_inode(struct inode *inode, struct hfs_find_data *fd) 493{ 494 hfsplus_cat_entry entry; 495 int res = 0; 496 u16 type; 497 498 type = hfs_bnode_read_u16(fd->bnode, fd->entryoffset); 499 |
475 HFSPLUS_I(inode).dev = 0; | 500 HFSPLUS_I(inode)->linkid = 0; |
476 if (type == HFSPLUS_FOLDER) { 477 struct hfsplus_cat_folder *folder = &entry.folder; 478 479 if (fd->entrylength < sizeof(struct hfsplus_cat_folder)) 480 /* panic? */; 481 hfs_bnode_read(fd->bnode, &entry, fd->entryoffset, 482 sizeof(struct hfsplus_cat_folder)); 483 hfsplus_get_perms(inode, &folder->permissions, 1); 484 inode->i_nlink = 1; 485 inode->i_size = 2 + be32_to_cpu(folder->valence); 486 inode->i_atime = hfsp_mt2ut(folder->access_date); 487 inode->i_mtime = hfsp_mt2ut(folder->content_mod_date); 488 inode->i_ctime = hfsp_mt2ut(folder->attribute_mod_date); | 501 if (type == HFSPLUS_FOLDER) { 502 struct hfsplus_cat_folder *folder = &entry.folder; 503 504 if (fd->entrylength < sizeof(struct hfsplus_cat_folder)) 505 /* panic? */; 506 hfs_bnode_read(fd->bnode, &entry, fd->entryoffset, 507 sizeof(struct hfsplus_cat_folder)); 508 hfsplus_get_perms(inode, &folder->permissions, 1); 509 inode->i_nlink = 1; 510 inode->i_size = 2 + be32_to_cpu(folder->valence); 511 inode->i_atime = hfsp_mt2ut(folder->access_date); 512 inode->i_mtime = hfsp_mt2ut(folder->content_mod_date); 513 inode->i_ctime = hfsp_mt2ut(folder->attribute_mod_date); |
489 HFSPLUS_I(inode).create_date = folder->create_date; 490 HFSPLUS_I(inode).fs_blocks = 0; | 514 HFSPLUS_I(inode)->create_date = folder->create_date; 515 HFSPLUS_I(inode)->fs_blocks = 0; |
491 inode->i_op = &hfsplus_dir_inode_operations; 492 inode->i_fop = &hfsplus_dir_operations; 493 } else if (type == HFSPLUS_FILE) { 494 struct hfsplus_cat_file *file = &entry.file; 495 496 if (fd->entrylength < sizeof(struct hfsplus_cat_file)) 497 /* panic? */; 498 hfs_bnode_read(fd->bnode, &entry, fd->entryoffset, --- 14 unchanged lines hidden (view full) --- 513 inode->i_mapping->a_ops = &hfsplus_aops; 514 } else { 515 init_special_inode(inode, inode->i_mode, 516 be32_to_cpu(file->permissions.dev)); 517 } 518 inode->i_atime = hfsp_mt2ut(file->access_date); 519 inode->i_mtime = hfsp_mt2ut(file->content_mod_date); 520 inode->i_ctime = hfsp_mt2ut(file->attribute_mod_date); | 516 inode->i_op = &hfsplus_dir_inode_operations; 517 inode->i_fop = &hfsplus_dir_operations; 518 } else if (type == HFSPLUS_FILE) { 519 struct hfsplus_cat_file *file = &entry.file; 520 521 if (fd->entrylength < sizeof(struct hfsplus_cat_file)) 522 /* panic? */; 523 hfs_bnode_read(fd->bnode, &entry, fd->entryoffset, --- 14 unchanged lines hidden (view full) --- 538 inode->i_mapping->a_ops = &hfsplus_aops; 539 } else { 540 init_special_inode(inode, inode->i_mode, 541 be32_to_cpu(file->permissions.dev)); 542 } 543 inode->i_atime = hfsp_mt2ut(file->access_date); 544 inode->i_mtime = hfsp_mt2ut(file->content_mod_date); 545 inode->i_ctime = hfsp_mt2ut(file->attribute_mod_date); |
521 HFSPLUS_I(inode).create_date = file->create_date; | 546 HFSPLUS_I(inode)->create_date = file->create_date; |
522 } else { 523 printk(KERN_ERR "hfs: bad catalog entry used to create inode\n"); 524 res = -EIO; 525 } 526 return res; 527} 528 529int hfsplus_cat_write_inode(struct inode *inode) 530{ 531 struct inode *main_inode = inode; 532 struct hfs_find_data fd; 533 hfsplus_cat_entry entry; 534 535 if (HFSPLUS_IS_RSRC(inode)) | 547 } else { 548 printk(KERN_ERR "hfs: bad catalog entry used to create inode\n"); 549 res = -EIO; 550 } 551 return res; 552} 553 554int hfsplus_cat_write_inode(struct inode *inode) 555{ 556 struct inode *main_inode = inode; 557 struct hfs_find_data fd; 558 hfsplus_cat_entry entry; 559 560 if (HFSPLUS_IS_RSRC(inode)) |
536 main_inode = HFSPLUS_I(inode).rsrc_inode; | 561 main_inode = HFSPLUS_I(inode)->rsrc_inode; |
537 538 if (!main_inode->i_nlink) 539 return 0; 540 | 562 563 if (!main_inode->i_nlink) 564 return 0; 565 |
541 if (hfs_find_init(HFSPLUS_SB(main_inode->i_sb).cat_tree, &fd)) | 566 if (hfs_find_init(HFSPLUS_SB(main_inode->i_sb)->cat_tree, &fd)) |
542 /* panic? */ 543 return -EIO; 544 545 if (hfsplus_find_cat(main_inode->i_sb, main_inode->i_ino, &fd)) 546 /* panic? */ 547 goto out; 548 549 if (S_ISDIR(main_inode->i_mode)) { --- 21 unchanged lines hidden (view full) --- 571 } else { 572 struct hfsplus_cat_file *file = &entry.file; 573 574 if (fd.entrylength < sizeof(struct hfsplus_cat_file)) 575 /* panic? */; 576 hfs_bnode_read(fd.bnode, &entry, fd.entryoffset, 577 sizeof(struct hfsplus_cat_file)); 578 hfsplus_inode_write_fork(inode, &file->data_fork); | 567 /* panic? */ 568 return -EIO; 569 570 if (hfsplus_find_cat(main_inode->i_sb, main_inode->i_ino, &fd)) 571 /* panic? */ 572 goto out; 573 574 if (S_ISDIR(main_inode->i_mode)) { --- 21 unchanged lines hidden (view full) --- 596 } else { 597 struct hfsplus_cat_file *file = &entry.file; 598 599 if (fd.entrylength < sizeof(struct hfsplus_cat_file)) 600 /* panic? */; 601 hfs_bnode_read(fd.bnode, &entry, fd.entryoffset, 602 sizeof(struct hfsplus_cat_file)); 603 hfsplus_inode_write_fork(inode, &file->data_fork); |
579 if (S_ISREG(inode->i_mode)) 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) 585 file->flags |= cpu_to_be16(HFSPLUS_FILE_LOCKED); 586 else 587 file->flags &= cpu_to_be16(~HFSPLUS_FILE_LOCKED); 588 file->access_date = hfsp_ut2mt(inode->i_atime); 589 file->content_mod_date = hfsp_ut2mt(inode->i_mtime); 590 file->attribute_mod_date = hfsp_ut2mt(inode->i_ctime); 591 hfs_bnode_write(fd.bnode, &entry, fd.entryoffset, 592 sizeof(struct hfsplus_cat_file)); 593 } 594out: 595 hfs_find_exit(&fd); 596 return 0; 597} | 604 hfsplus_set_perms(inode, &file->permissions); 605 if ((file->permissions.rootflags | file->permissions.userflags) & HFSPLUS_FLG_IMMUTABLE) 606 file->flags |= cpu_to_be16(HFSPLUS_FILE_LOCKED); 607 else 608 file->flags &= cpu_to_be16(~HFSPLUS_FILE_LOCKED); 609 file->access_date = hfsp_ut2mt(inode->i_atime); 610 file->content_mod_date = hfsp_ut2mt(inode->i_mtime); 611 file->attribute_mod_date = hfsp_ut2mt(inode->i_ctime); 612 hfs_bnode_write(fd.bnode, &entry, fd.entryoffset, 613 sizeof(struct hfsplus_cat_file)); 614 } 615out: 616 hfs_find_exit(&fd); 617 return 0; 618} |