Merge branch 'ovl-fixes' into for-linus
[cascardo/linux.git] / fs / hfs / dir.c
index e9f2b85..163190e 100644 (file)
@@ -161,8 +161,14 @@ static int hfs_readdir(struct file *file, struct dir_context *ctx)
                }
                file->private_data = rd;
                rd->file = file;
+               spin_lock(&HFS_I(inode)->open_dir_lock);
                list_add(&rd->list, &HFS_I(inode)->open_dir_list);
+               spin_unlock(&HFS_I(inode)->open_dir_lock);
        }
+       /*
+        * Can be done after the list insertion; exclusion with
+        * hfs_delete_cat() is provided by directory lock.
+        */
        memcpy(&rd->key, &fd.key, sizeof(struct hfs_cat_key));
 out:
        hfs_find_exit(&fd);
@@ -173,9 +179,9 @@ static int hfs_dir_release(struct inode *inode, struct file *file)
 {
        struct hfs_readdir_data *rd = file->private_data;
        if (rd) {
-               inode_lock(inode);
+               spin_lock(&HFS_I(inode)->open_dir_lock);
                list_del(&rd->list);
-               inode_unlock(inode);
+               spin_unlock(&HFS_I(inode)->open_dir_lock);
                kfree(rd);
        }
        return 0;
@@ -303,7 +309,7 @@ static int hfs_rename(struct inode *old_dir, struct dentry *old_dentry,
 
 const struct file_operations hfs_dir_operations = {
        .read           = generic_read_dir,
-       .iterate        = hfs_readdir,
+       .iterate_shared = hfs_readdir,
        .llseek         = generic_file_llseek,
        .release        = hfs_dir_release,
 };