From 9a84f57b3f5354d0bcf5393259e68310e37bd671 Mon Sep 17 00:00:00 2001 From: brjhaiku Date: Thu, 11 Jul 2019 04:10:35 +0530 Subject: [PATCH] btrfs: implemented btrfs_unlink MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I3ccb6be54ba3e42136fa7093f35e16aaecc5a540 Reviewed-on: https://review.haiku-os.org/c/haiku/+/1589 Reviewed-by: Chế Vũ Gia Hy Reviewed-by: Adrien Destugues --- .../file_systems/btrfs/kernel_interface.cpp | 47 ++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/src/add-ons/kernel/file_systems/btrfs/kernel_interface.cpp b/src/add-ons/kernel/file_systems/btrfs/kernel_interface.cpp index 8fe9bd493c..84927a1eb0 100644 --- a/src/add-ons/kernel/file_systems/btrfs/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/btrfs/kernel_interface.cpp @@ -483,6 +483,51 @@ btrfs_read_link(fs_volume* _volume, fs_vnode* _node, char* buffer, } +status_t +btrfs_unlink(fs_volume* _volume, fs_vnode* _directory, const char* name) +{ + if (!strcmp(name, "..") || !strcmp(name, ".")) + return B_NOT_ALLOWED; + + Volume* volume = (Volume*)_volume->private_volume; + Inode* directory = (Inode*)_directory->private_node; + + status_t status = directory->CheckPermissions(W_OK); + if (status < B_OK) + return status; + + Transaction transaction(volume); + BTree::Path path(volume->FSTree()); + + ino_t id; + status = DirectoryIterator(directory).Lookup(name, strlen(name), &id); + if (status != B_OK) + return status; + + Inode inode(volume, id); + status = inode.InitCheck(); + if (status != B_OK) + return status; + + status = inode.Remove(transaction, &path); + if (status != B_OK) + return status; + status = inode.Dereference(transaction, &path, directory->ID(), name); + if (status != B_OK) + return status; + + entry_cache_remove(volume->ID(), directory->ID(), name); + + status = transaction.Done(); + if (status == B_OK) + notify_entry_removed(volume->ID(), directory->ID(), name, id); + else + entry_cache_add(volume->ID(), directory->ID(), name, id); + + return status; +} + + // #pragma mark - Directory functions @@ -973,7 +1018,7 @@ fs_vnode_ops gBtrfsVnodeOps = { NULL, // fs_create_symlink, NULL, // fs_link, - NULL, // fs_unlink, + &btrfs_unlink, NULL, // fs_rename, &btrfs_access,