|
@@ -45,7 +45,8 @@ void hfsplus_cat_build_key(struct super_block *sb, hfsplus_btree_key *key,
|
|
|
|
|
|
key->cat.parent = cpu_to_be32(parent);
|
|
|
if (str) {
|
|
|
- hfsplus_asc2uni(sb, &key->cat.name, str->name, str->len);
|
|
|
+ hfsplus_asc2uni(sb, &key->cat.name, HFSPLUS_MAX_STRLEN,
|
|
|
+ str->name, str->len);
|
|
|
len = be16_to_cpu(key->cat.name.length);
|
|
|
} else {
|
|
|
key->cat.name.length = 0;
|
|
@@ -167,7 +168,8 @@ static int hfsplus_fill_cat_thread(struct super_block *sb,
|
|
|
entry->type = cpu_to_be16(type);
|
|
|
entry->thread.reserved = 0;
|
|
|
entry->thread.parentID = cpu_to_be32(parentid);
|
|
|
- hfsplus_asc2uni(sb, &entry->thread.nodeName, str->name, str->len);
|
|
|
+ hfsplus_asc2uni(sb, &entry->thread.nodeName, HFSPLUS_MAX_STRLEN,
|
|
|
+ str->name, str->len);
|
|
|
return 10 + be16_to_cpu(entry->thread.nodeName.length) * 2;
|
|
|
}
|
|
|
|
|
@@ -198,7 +200,7 @@ int hfsplus_find_cat(struct super_block *sb, u32 cnid,
|
|
|
hfsplus_cat_build_key_uni(fd->search_key,
|
|
|
be32_to_cpu(tmp.thread.parentID),
|
|
|
&tmp.thread.nodeName);
|
|
|
- return hfs_brec_find(fd);
|
|
|
+ return hfs_brec_find(fd, hfs_find_rec_by_key);
|
|
|
}
|
|
|
|
|
|
int hfsplus_create_cat(u32 cnid, struct inode *dir,
|
|
@@ -221,7 +223,7 @@ int hfsplus_create_cat(u32 cnid, struct inode *dir,
|
|
|
S_ISDIR(inode->i_mode) ?
|
|
|
HFSPLUS_FOLDER_THREAD : HFSPLUS_FILE_THREAD,
|
|
|
dir->i_ino, str);
|
|
|
- err = hfs_brec_find(&fd);
|
|
|
+ err = hfs_brec_find(&fd, hfs_find_rec_by_key);
|
|
|
if (err != -ENOENT) {
|
|
|
if (!err)
|
|
|
err = -EEXIST;
|
|
@@ -233,7 +235,7 @@ int hfsplus_create_cat(u32 cnid, struct inode *dir,
|
|
|
|
|
|
hfsplus_cat_build_key(sb, fd.search_key, dir->i_ino, str);
|
|
|
entry_size = hfsplus_cat_build_record(&entry, cnid, inode);
|
|
|
- err = hfs_brec_find(&fd);
|
|
|
+ err = hfs_brec_find(&fd, hfs_find_rec_by_key);
|
|
|
if (err != -ENOENT) {
|
|
|
/* panic? */
|
|
|
if (!err)
|
|
@@ -253,7 +255,7 @@ int hfsplus_create_cat(u32 cnid, struct inode *dir,
|
|
|
|
|
|
err1:
|
|
|
hfsplus_cat_build_key(sb, fd.search_key, cnid, NULL);
|
|
|
- if (!hfs_brec_find(&fd))
|
|
|
+ if (!hfs_brec_find(&fd, hfs_find_rec_by_key))
|
|
|
hfs_brec_remove(&fd);
|
|
|
err2:
|
|
|
hfs_find_exit(&fd);
|
|
@@ -279,7 +281,7 @@ int hfsplus_delete_cat(u32 cnid, struct inode *dir, struct qstr *str)
|
|
|
int len;
|
|
|
|
|
|
hfsplus_cat_build_key(sb, fd.search_key, cnid, NULL);
|
|
|
- err = hfs_brec_find(&fd);
|
|
|
+ err = hfs_brec_find(&fd, hfs_find_rec_by_key);
|
|
|
if (err)
|
|
|
goto out;
|
|
|
|
|
@@ -296,7 +298,7 @@ int hfsplus_delete_cat(u32 cnid, struct inode *dir, struct qstr *str)
|
|
|
} else
|
|
|
hfsplus_cat_build_key(sb, fd.search_key, dir->i_ino, str);
|
|
|
|
|
|
- err = hfs_brec_find(&fd);
|
|
|
+ err = hfs_brec_find(&fd, hfs_find_rec_by_key);
|
|
|
if (err)
|
|
|
goto out;
|
|
|
|
|
@@ -326,7 +328,7 @@ int hfsplus_delete_cat(u32 cnid, struct inode *dir, struct qstr *str)
|
|
|
goto out;
|
|
|
|
|
|
hfsplus_cat_build_key(sb, fd.search_key, cnid, NULL);
|
|
|
- err = hfs_brec_find(&fd);
|
|
|
+ err = hfs_brec_find(&fd, hfs_find_rec_by_key);
|
|
|
if (err)
|
|
|
goto out;
|
|
|
|
|
@@ -337,6 +339,12 @@ int hfsplus_delete_cat(u32 cnid, struct inode *dir, struct qstr *str)
|
|
|
dir->i_size--;
|
|
|
dir->i_mtime = dir->i_ctime = CURRENT_TIME_SEC;
|
|
|
hfsplus_mark_inode_dirty(dir, HFSPLUS_I_CAT_DIRTY);
|
|
|
+
|
|
|
+ if (type == HFSPLUS_FILE || type == HFSPLUS_FOLDER) {
|
|
|
+ if (HFSPLUS_SB(sb)->attr_tree)
|
|
|
+ hfsplus_delete_all_attrs(dir, cnid);
|
|
|
+ }
|
|
|
+
|
|
|
out:
|
|
|
hfs_find_exit(&fd);
|
|
|
|
|
@@ -363,7 +371,7 @@ int hfsplus_rename_cat(u32 cnid,
|
|
|
|
|
|
/* find the old dir entry and read the data */
|
|
|
hfsplus_cat_build_key(sb, src_fd.search_key, src_dir->i_ino, src_name);
|
|
|
- err = hfs_brec_find(&src_fd);
|
|
|
+ err = hfs_brec_find(&src_fd, hfs_find_rec_by_key);
|
|
|
if (err)
|
|
|
goto out;
|
|
|
if (src_fd.entrylength > sizeof(entry) || src_fd.entrylength < 0) {
|
|
@@ -376,7 +384,7 @@ int hfsplus_rename_cat(u32 cnid,
|
|
|
|
|
|
/* create new dir entry with the data from the old entry */
|
|
|
hfsplus_cat_build_key(sb, dst_fd.search_key, dst_dir->i_ino, dst_name);
|
|
|
- err = hfs_brec_find(&dst_fd);
|
|
|
+ err = hfs_brec_find(&dst_fd, hfs_find_rec_by_key);
|
|
|
if (err != -ENOENT) {
|
|
|
if (!err)
|
|
|
err = -EEXIST;
|
|
@@ -391,7 +399,7 @@ int hfsplus_rename_cat(u32 cnid,
|
|
|
|
|
|
/* finally remove the old entry */
|
|
|
hfsplus_cat_build_key(sb, src_fd.search_key, src_dir->i_ino, src_name);
|
|
|
- err = hfs_brec_find(&src_fd);
|
|
|
+ err = hfs_brec_find(&src_fd, hfs_find_rec_by_key);
|
|
|
if (err)
|
|
|
goto out;
|
|
|
err = hfs_brec_remove(&src_fd);
|
|
@@ -402,7 +410,7 @@ int hfsplus_rename_cat(u32 cnid,
|
|
|
|
|
|
/* remove old thread entry */
|
|
|
hfsplus_cat_build_key(sb, src_fd.search_key, cnid, NULL);
|
|
|
- err = hfs_brec_find(&src_fd);
|
|
|
+ err = hfs_brec_find(&src_fd, hfs_find_rec_by_key);
|
|
|
if (err)
|
|
|
goto out;
|
|
|
type = hfs_bnode_read_u16(src_fd.bnode, src_fd.entryoffset);
|
|
@@ -414,7 +422,7 @@ int hfsplus_rename_cat(u32 cnid,
|
|
|
hfsplus_cat_build_key(sb, dst_fd.search_key, cnid, NULL);
|
|
|
entry_size = hfsplus_fill_cat_thread(sb, &entry, type,
|
|
|
dst_dir->i_ino, dst_name);
|
|
|
- err = hfs_brec_find(&dst_fd);
|
|
|
+ err = hfs_brec_find(&dst_fd, hfs_find_rec_by_key);
|
|
|
if (err != -ENOENT) {
|
|
|
if (!err)
|
|
|
err = -EEXIST;
|