aboutsummaryrefslogtreecommitdiffstats
path: root/fs/hfsplus/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/hfsplus/inode.c')
-rw-r--r--fs/hfsplus/inode.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/fs/hfsplus/inode.c b/fs/hfsplus/inode.c
index d53b2af91c25..b085d64a2b67 100644
--- a/fs/hfsplus/inode.c
+++ b/fs/hfsplus/inode.c
@@ -65,6 +65,8 @@ static int hfsplus_releasepage(struct page *page, gfp_t mask)
65 BUG(); 65 BUG();
66 return 0; 66 return 0;
67 } 67 }
68 if (!tree)
69 return 0;
68 if (tree->node_size >= PAGE_CACHE_SIZE) { 70 if (tree->node_size >= PAGE_CACHE_SIZE) {
69 nidx = page->index >> (tree->node_size_shift - PAGE_CACHE_SHIFT); 71 nidx = page->index >> (tree->node_size_shift - PAGE_CACHE_SHIFT);
70 spin_lock(&tree->hash_lock); 72 spin_lock(&tree->hash_lock);
@@ -161,7 +163,7 @@ static struct dentry *hfsplus_file_lookup(struct inode *dir, struct dentry *dent
161 163
162 inode->i_ino = dir->i_ino; 164 inode->i_ino = dir->i_ino;
163 INIT_LIST_HEAD(&HFSPLUS_I(inode).open_dir_list); 165 INIT_LIST_HEAD(&HFSPLUS_I(inode).open_dir_list);
164 init_MUTEX(&HFSPLUS_I(inode).extents_lock); 166 mutex_init(&HFSPLUS_I(inode).extents_lock);
165 HFSPLUS_I(inode).flags = HFSPLUS_FLG_RSRC; 167 HFSPLUS_I(inode).flags = HFSPLUS_FLG_RSRC;
166 168
167 hfs_find_init(HFSPLUS_SB(sb).cat_tree, &fd); 169 hfs_find_init(HFSPLUS_SB(sb).cat_tree, &fd);
@@ -236,7 +238,7 @@ static void hfsplus_set_perms(struct inode *inode, struct hfsplus_perm *perms)
236 perms->dev = cpu_to_be32(HFSPLUS_I(inode).dev); 238 perms->dev = cpu_to_be32(HFSPLUS_I(inode).dev);
237} 239}
238 240
239static int hfsplus_permission(struct inode *inode, int mask, struct nameidata *nd) 241static int hfsplus_permission(struct inode *inode, int mask)
240{ 242{
241 /* MAY_EXEC is also used for lookup, if no x bit is set allow lookup, 243 /* MAY_EXEC is also used for lookup, if no x bit is set allow lookup,
242 * open_exec has the same test, so it's still not executable, if a x bit 244 * open_exec has the same test, so it's still not executable, if a x bit
@@ -252,8 +254,6 @@ static int hfsplus_file_open(struct inode *inode, struct file *file)
252{ 254{
253 if (HFSPLUS_IS_RSRC(inode)) 255 if (HFSPLUS_IS_RSRC(inode))
254 inode = HFSPLUS_I(inode).rsrc_inode; 256 inode = HFSPLUS_I(inode).rsrc_inode;
255 if (atomic_read(&file->f_count) != 1)
256 return 0;
257 atomic_inc(&HFSPLUS_I(inode).opencnt); 257 atomic_inc(&HFSPLUS_I(inode).opencnt);
258 return 0; 258 return 0;
259} 259}
@@ -264,8 +264,6 @@ static int hfsplus_file_release(struct inode *inode, struct file *file)
264 264
265 if (HFSPLUS_IS_RSRC(inode)) 265 if (HFSPLUS_IS_RSRC(inode))
266 inode = HFSPLUS_I(inode).rsrc_inode; 266 inode = HFSPLUS_I(inode).rsrc_inode;
267 if (atomic_read(&file->f_count) != 0)
268 return 0;
269 if (atomic_dec_and_test(&HFSPLUS_I(inode).opencnt)) { 267 if (atomic_dec_and_test(&HFSPLUS_I(inode).opencnt)) {
270 mutex_lock(&inode->i_mutex); 268 mutex_lock(&inode->i_mutex);
271 hfsplus_file_truncate(inode); 269 hfsplus_file_truncate(inode);
@@ -314,7 +312,7 @@ struct inode *hfsplus_new_inode(struct super_block *sb, int mode)
314 inode->i_nlink = 1; 312 inode->i_nlink = 1;
315 inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC; 313 inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC;
316 INIT_LIST_HEAD(&HFSPLUS_I(inode).open_dir_list); 314 INIT_LIST_HEAD(&HFSPLUS_I(inode).open_dir_list);
317 init_MUTEX(&HFSPLUS_I(inode).extents_lock); 315 mutex_init(&HFSPLUS_I(inode).extents_lock);
318 atomic_set(&HFSPLUS_I(inode).opencnt, 0); 316 atomic_set(&HFSPLUS_I(inode).opencnt, 0);
319 HFSPLUS_I(inode).flags = 0; 317 HFSPLUS_I(inode).flags = 0;
320 memset(HFSPLUS_I(inode).first_extents, 0, sizeof(hfsplus_extent_rec)); 318 memset(HFSPLUS_I(inode).first_extents, 0, sizeof(hfsplus_extent_rec));