|
@@ -271,8 +271,14 @@ next:
|
|
|
}
|
|
|
file->private_data = rd;
|
|
|
rd->file = file;
|
|
|
+ spin_lock(&HFSPLUS_I(inode)->open_dir_lock);
|
|
|
list_add(&rd->list, &HFSPLUS_I(inode)->open_dir_list);
|
|
|
+ spin_unlock(&HFSPLUS_I(inode)->open_dir_lock);
|
|
|
}
|
|
|
+ /*
|
|
|
+ * Can be done after the list insertion; exclusion with
|
|
|
+ * hfsplus_delete_cat() is provided by directory lock.
|
|
|
+ */
|
|
|
memcpy(&rd->key, fd.key, sizeof(struct hfsplus_cat_key));
|
|
|
out:
|
|
|
kfree(strbuf);
|
|
@@ -284,9 +290,9 @@ static int hfsplus_dir_release(struct inode *inode, struct file *file)
|
|
|
{
|
|
|
struct hfsplus_readdir_data *rd = file->private_data;
|
|
|
if (rd) {
|
|
|
- inode_lock(inode);
|
|
|
+ spin_lock(&HFSPLUS_I(inode)->open_dir_lock);
|
|
|
list_del(&rd->list);
|
|
|
- inode_unlock(inode);
|
|
|
+ spin_unlock(&HFSPLUS_I(inode)->open_dir_lock);
|
|
|
kfree(rd);
|
|
|
}
|
|
|
return 0;
|
|
@@ -569,7 +575,7 @@ const struct inode_operations hfsplus_dir_inode_operations = {
|
|
|
const struct file_operations hfsplus_dir_operations = {
|
|
|
.fsync = hfsplus_file_fsync,
|
|
|
.read = generic_read_dir,
|
|
|
- .iterate = hfsplus_readdir,
|
|
|
+ .iterate_shared = hfsplus_readdir,
|
|
|
.unlocked_ioctl = hfsplus_ioctl,
|
|
|
.llseek = generic_file_llseek,
|
|
|
.release = hfsplus_dir_release,
|