]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - fs/hfsplus/catalog.c
hfsplus: add support of manipulation by attributes file
[karo-tx-linux.git] / fs / hfsplus / catalog.c
index 798d9c4c5e71ce8ab50c4d0cdd4597f753b5d814..840d71edd1939856de5eff785f3f01b8cd0e0060 100644 (file)
@@ -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;