X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fhfsplus%2Fcatalog.c;h=94712790c8b3f2414e4516fa4f291c19f55a2ff9;hb=f7f1b0f1e2fbadeab12d24236000e778aa9b1ead;hp=03a01a3f6f4bdc9d8cc8b3626462a09d98361e5d;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/fs/hfsplus/catalog.c b/fs/hfsplus/catalog.c index 03a01a3f6..94712790c 100644 --- a/fs/hfsplus/catalog.c +++ b/fs/hfsplus/catalog.c @@ -15,7 +15,7 @@ int hfsplus_cat_cmp_key(hfsplus_btree_key *k1, hfsplus_btree_key *k2) { - u32 k1p, k2p; + __be32 k1p, k2p; k1p = k1->cat.parent; k2p = k2->cat.parent; @@ -25,17 +25,19 @@ int hfsplus_cat_cmp_key(hfsplus_btree_key *k1, hfsplus_btree_key *k2) return hfsplus_unistrcmp(&k1->cat.name, &k2->cat.name); } -void hfsplus_cat_build_key(hfsplus_btree_key *key, u32 parent, - struct qstr *str) +void hfsplus_cat_build_key(struct super_block *sb, hfsplus_btree_key *key, + u32 parent, struct qstr *str) { int len; key->cat.parent = cpu_to_be32(parent); if (str) { - hfsplus_asc2uni(&key->cat.name, str->name, str->len); + hfsplus_asc2uni(sb, &key->cat.name, str->name, str->len); len = be16_to_cpu(key->cat.name.length); - } else - len = key->cat.name.length = 0; + } else { + key->cat.name.length = 0; + len = 0; + } key->key_len = cpu_to_be16(6 + 2 * len); } @@ -111,13 +113,14 @@ static int hfsplus_cat_build_record(hfsplus_cat_entry *entry, u32 cnid, struct i } } -static int hfsplus_fill_cat_thread(hfsplus_cat_entry *entry, int type, +static int hfsplus_fill_cat_thread(struct super_block *sb, + hfsplus_cat_entry *entry, int type, u32 parentid, struct qstr *str) { entry->type = cpu_to_be16(type); entry->thread.reserved = 0; entry->thread.parentID = cpu_to_be32(parentid); - hfsplus_asc2uni(&entry->thread.nodeName, str->name, str->len); + hfsplus_asc2uni(sb, &entry->thread.nodeName, str->name, str->len); return 10 + be16_to_cpu(entry->thread.nodeName.length) * 2; } @@ -129,7 +132,7 @@ int hfsplus_find_cat(struct super_block *sb, u32 cnid, int err; u16 type; - hfsplus_cat_build_key(fd->search_key, cnid, NULL); + hfsplus_cat_build_key(sb, fd->search_key, cnid, NULL); err = hfs_brec_read(fd, &tmp, sizeof(hfsplus_cat_entry)); if (err) return err; @@ -157,37 +160,45 @@ int hfsplus_create_cat(u32 cnid, struct inode *dir, struct qstr *str, struct ino sb = dir->i_sb; hfs_find_init(HFSPLUS_SB(sb).cat_tree, &fd); - hfsplus_cat_build_key(fd.search_key, cnid, NULL); - entry_size = hfsplus_fill_cat_thread(&entry, S_ISDIR(inode->i_mode) ? + hfsplus_cat_build_key(sb, fd.search_key, cnid, NULL); + entry_size = hfsplus_fill_cat_thread(sb, &entry, S_ISDIR(inode->i_mode) ? HFSPLUS_FOLDER_THREAD : HFSPLUS_FILE_THREAD, dir->i_ino, str); err = hfs_brec_find(&fd); if (err != -ENOENT) { if (!err) err = -EEXIST; - goto out; + goto err2; } err = hfs_brec_insert(&fd, &entry, entry_size); if (err) - goto out; + goto err2; - hfsplus_cat_build_key(fd.search_key, dir->i_ino, str); + 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); if (err != -ENOENT) { /* panic? */ if (!err) err = -EEXIST; - goto out; + goto err1; } err = hfs_brec_insert(&fd, &entry, entry_size); - if (!err) { - dir->i_size++; - mark_inode_dirty(dir); - } -out: + if (err) + goto err1; + + dir->i_size++; + dir->i_mtime = dir->i_ctime = CURRENT_TIME_SEC; + mark_inode_dirty(dir); hfs_find_exit(&fd); + return 0; +err1: + hfsplus_cat_build_key(sb, fd.search_key, cnid, NULL); + if (!hfs_brec_find(&fd)) + hfs_brec_remove(&fd); +err2: + hfs_find_exit(&fd); return err; } @@ -207,7 +218,7 @@ int hfsplus_delete_cat(u32 cnid, struct inode *dir, struct qstr *str) if (!str) { int len; - hfsplus_cat_build_key(fd.search_key, cnid, NULL); + hfsplus_cat_build_key(sb, fd.search_key, cnid, NULL); err = hfs_brec_find(&fd); if (err) goto out; @@ -219,7 +230,7 @@ int hfsplus_delete_cat(u32 cnid, struct inode *dir, struct qstr *str) hfs_bnode_read(fd.bnode, &fd.search_key->cat.name.unicode, off + 2, len); fd.search_key->key_len = cpu_to_be16(6 + len); } else - hfsplus_cat_build_key(fd.search_key, dir->i_ino, str); + hfsplus_cat_build_key(sb, fd.search_key, dir->i_ino, str); err = hfs_brec_find(&fd); if (err) @@ -249,7 +260,7 @@ int hfsplus_delete_cat(u32 cnid, struct inode *dir, struct qstr *str) if (err) goto out; - hfsplus_cat_build_key(fd.search_key, cnid, NULL); + hfsplus_cat_build_key(sb, fd.search_key, cnid, NULL); err = hfs_brec_find(&fd); if (err) goto out; @@ -259,6 +270,7 @@ int hfsplus_delete_cat(u32 cnid, struct inode *dir, struct qstr *str) goto out; dir->i_size--; + dir->i_mtime = dir->i_ctime = CURRENT_TIME_SEC; mark_inode_dirty(dir); out: hfs_find_exit(&fd); @@ -283,7 +295,7 @@ int hfsplus_rename_cat(u32 cnid, dst_fd = src_fd; /* find the old dir entry and read the data */ - hfsplus_cat_build_key(src_fd.search_key, src_dir->i_ino, src_name); + hfsplus_cat_build_key(sb, src_fd.search_key, src_dir->i_ino, src_name); err = hfs_brec_find(&src_fd); if (err) goto out; @@ -292,7 +304,7 @@ int hfsplus_rename_cat(u32 cnid, src_fd.entrylength); /* create new dir entry with the data from the old entry */ - hfsplus_cat_build_key(dst_fd.search_key, dst_dir->i_ino, dst_name); + hfsplus_cat_build_key(sb, dst_fd.search_key, dst_dir->i_ino, dst_name); err = hfs_brec_find(&dst_fd); if (err != -ENOENT) { if (!err) @@ -304,10 +316,11 @@ int hfsplus_rename_cat(u32 cnid, if (err) goto out; dst_dir->i_size++; + dst_dir->i_mtime = dst_dir->i_ctime = CURRENT_TIME_SEC; mark_inode_dirty(dst_dir); /* finally remove the old entry */ - hfsplus_cat_build_key(src_fd.search_key, src_dir->i_ino, src_name); + hfsplus_cat_build_key(sb, src_fd.search_key, src_dir->i_ino, src_name); err = hfs_brec_find(&src_fd); if (err) goto out; @@ -315,10 +328,11 @@ int hfsplus_rename_cat(u32 cnid, if (err) goto out; src_dir->i_size--; + src_dir->i_mtime = src_dir->i_ctime = CURRENT_TIME_SEC; mark_inode_dirty(src_dir); /* remove old thread entry */ - hfsplus_cat_build_key(src_fd.search_key, cnid, NULL); + hfsplus_cat_build_key(sb, src_fd.search_key, cnid, NULL); err = hfs_brec_find(&src_fd); if (err) goto out; @@ -328,8 +342,8 @@ int hfsplus_rename_cat(u32 cnid, goto out; /* create new thread entry */ - hfsplus_cat_build_key(dst_fd.search_key, cnid, NULL); - entry_size = hfsplus_fill_cat_thread(&entry, type, dst_dir->i_ino, dst_name); + 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); if (err != -ENOENT) { if (!err)