diff --git a/src/add-ons/kernel/file_systems/bfs/Attribute.cpp b/src/add-ons/kernel/file_systems/bfs/Attribute.cpp index e6fea33e3a..3bfa15bf07 100644 --- a/src/add-ons/kernel/file_systems/bfs/Attribute.cpp +++ b/src/add-ons/kernel/file_systems/bfs/Attribute.cpp @@ -9,8 +9,8 @@ #include "Attribute.h" -// ToDo: clean this up, find a better separation between Inode and this class -// ToDo: even after Create(), the attribute cannot be stat() for until the first write +// TODO: clean this up, find a better separation between Inode and this class +// TODO: even after Create(), the attribute cannot be stat() for until the first write extern void fill_stat_buffer(Inode *inode, struct stat &stat); @@ -111,13 +111,14 @@ Attribute::Put() status_t -Attribute::Create(const char *name, type_code type, int openMode, attr_cookie **_cookie) +Attribute::Create(const char *name, type_code type, int openMode, + attr_cookie **_cookie) { status_t status = CheckAccess(name, openMode); if (status < B_OK) return status; - attr_cookie *cookie = (attr_cookie *)malloc(sizeof(attr_cookie)); + attr_cookie *cookie = new(std::nothrow) attr_cookie; if (cookie == NULL) RETURN_ERROR(B_NO_MEMORY); @@ -150,7 +151,7 @@ Attribute::Open(const char *name, int openMode, attr_cookie **_cookie) if (status < B_OK) return status; - attr_cookie *cookie = (attr_cookie *)malloc(sizeof(attr_cookie)); + attr_cookie *cookie = new(std::nothrow) attr_cookie; if (cookie == NULL) RETURN_ERROR(B_NO_MEMORY); @@ -223,7 +224,8 @@ Attribute::_Truncate() if (fAttribute != NULL) { WriteLocker locker(fAttribute->Lock()); - Transaction transaction(fAttribute->GetVolume(), fAttribute->BlockNumber()); + Transaction transaction(fAttribute->GetVolume(), + fAttribute->BlockNumber()); status_t status = fAttribute->SetFileSize(transaction, 0); if (status >= B_OK) diff --git a/src/add-ons/kernel/file_systems/bfs/Inode.cpp b/src/add-ons/kernel/file_systems/bfs/Inode.cpp index 614b277bbc..142db07687 100644 --- a/src/add-ons/kernel/file_systems/bfs/Inode.cpp +++ b/src/add-ons/kernel/file_systems/bfs/Inode.cpp @@ -2111,6 +2111,8 @@ Inode::Sync() if (IsSymLink() && (Flags() & INODE_LONG_SYMLINK) == 0) return B_OK; + ReadLocker locker(Lock()); + data_stream *data = &Node().data; status_t status = B_OK; diff --git a/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp b/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp index 7cba30a671..ada65d8db9 100644 --- a/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp @@ -66,7 +66,7 @@ bfs_identify_partition(int fd, partition_data *partition, void **_cookie) if (status != B_OK) return status; - identify_cookie *cookie = new identify_cookie; + identify_cookie *cookie = new(std::nothrow) identify_cookie; memcpy(&cookie->super_block, &superBlock, sizeof(disk_super_block)); *_cookie = cookie; @@ -96,7 +96,6 @@ static void bfs_free_identify_partition_cookie(partition_data *partition, void *_cookie) { identify_cookie *cookie = (identify_cookie *)_cookie; - delete cookie; } @@ -110,7 +109,7 @@ bfs_mount(fs_volume *_volume, const char *device, uint32 flags, { FUNCTION(); - Volume *volume = new Volume(_volume); + Volume *volume = new(std::nothrow) Volume(_volume); if (volume == NULL) return B_NO_MEMORY; @@ -241,7 +240,7 @@ bfs_get_vnode(fs_volume *_volume, ino_t id, fs_vnode *_node, int *_type, return status; } - Inode *inode = new Inode(volume, id); + Inode *inode = new(std::nothrow) Inode(volume, id); if (inode == NULL) return B_NO_MEMORY; @@ -545,7 +544,7 @@ bfs_ioctl(fs_volume *_volume, fs_vnode *_node, void *_cookie, ulong cmd, check_control *control = (check_control *)buffer; status_t status = allocator.StartChecking(control); - if (status == B_OK && inode != NULL) + if (status == B_OK) inode->Node().flags |= HOST_ENDIAN_TO_BFS_INT32(INODE_CHKBFS_RUNNING); return status; @@ -557,7 +556,7 @@ bfs_ioctl(fs_volume *_volume, fs_vnode *_node, void *_cookie, ulong cmd, check_control *control = (check_control *)buffer; status_t status = allocator.StopChecking(control); - if (status == B_OK && inode != NULL) + if (status == B_OK) inode->Node().flags &= HOST_ENDIAN_TO_BFS_INT32(~INODE_CHKBFS_RUNNING); return status; @@ -602,19 +601,6 @@ bfs_ioctl(fs_volume *_volume, fs_vnode *_node, void *_cookie, ulong cmd, } return B_OK; } - case 56743: - dump_super_block(&volume->SuperBlock()); - return B_OK; - case 56744: - if (inode != NULL) - dump_inode(&inode->Node()); - return B_OK; - case 56745: - if (inode != NULL) { - NodeGetter node(volume, inode); - dump_block((const char *)node.Node(), volume->BlockSize()); - } - return B_OK; #endif } return B_BAD_VALUE; @@ -641,15 +627,8 @@ static status_t bfs_fsync(fs_volume *_volume, fs_vnode *_node) { FUNCTION(); - if (_node == NULL) - return B_BAD_VALUE; Inode *inode = (Inode *)_node->private_node; - ReadLocker locker(inode->Lock()); - - if (!locker.IsLocked()) - RETURN_ERROR(B_ERROR); - return inode->Sync(); } @@ -660,7 +639,6 @@ bfs_read_stat(fs_volume *_volume, fs_vnode *_node, struct stat *stat) FUNCTION(); Inode *inode = (Inode *)_node->private_node; - fill_stat_buffer(inode, *stat); return B_OK; } @@ -776,7 +754,7 @@ bfs_create(fs_volume *_volume, fs_vnode *_directory, const char *name, // We are creating the cookie at this point, so that we don't have // to remove the inode if we don't have enough free memory later... - file_cookie *cookie = (file_cookie *)malloc(sizeof(file_cookie)); + file_cookie *cookie = new(std::nothrow) file_cookie; if (cookie == NULL) RETURN_ERROR(B_NO_MEMORY); @@ -802,7 +780,7 @@ bfs_create(fs_volume *_volume, fs_vnode *_directory, const char *name, *_vnodeID); } } else - free(cookie); + delete cookie; return status; } @@ -1135,7 +1113,7 @@ bfs_open(fs_volume *_volume, fs_vnode *_node, int openMode, void **_cookie) // This could greatly speed up continuous reads of big files, especially // in the indirect block section. - file_cookie *cookie = (file_cookie *)malloc(sizeof(file_cookie)); + file_cookie *cookie = new(std::nothrow) file_cookie; if (cookie == NULL) RETURN_ERROR(B_NO_MEMORY); @@ -1163,7 +1141,7 @@ bfs_open(fs_volume *_volume, fs_vnode *_node, int openMode, void **_cookie) if (status < B_OK) { // bfs_free_cookie() is only called if this function is successful - free(cookie); + delete cookie; return status; } @@ -1219,11 +1197,9 @@ bfs_write(fs_volume *_volume, fs_vnode *_node, void *_cookie, off_t pos, status_t status = inode->WriteAt(transaction, pos, (const uint8 *)buffer, _length); - - if (status == B_OK) + if (status == B_OK) { transaction.Done(); - if (status == B_OK) { ReadLocker locker(inode->Lock()); // periodically notify if the file size has changed @@ -1323,7 +1299,7 @@ bfs_free_cookie(fs_volume *_volume, fs_vnode *_node, void *_cookie) volume->Allocator().StopChecking(NULL); } - free(cookie); + delete cookie; return B_OK; } @@ -1462,7 +1438,7 @@ bfs_open_dir(fs_volume *_volume, fs_vnode *_node, void **_cookie) if (inode->GetTree(&tree) != B_OK) RETURN_ERROR(B_BAD_VALUE); - TreeIterator *iterator = new TreeIterator(tree); + TreeIterator *iterator = new(std::nothrow) TreeIterator(tree); if (iterator == NULL) RETURN_ERROR(B_NO_MEMORY); @@ -1538,7 +1514,7 @@ bfs_open_attr_dir(fs_volume *_volume, fs_vnode *_node, void **_cookie) FUNCTION(); - AttributeIterator *iterator = new AttributeIterator(inode); + AttributeIterator *iterator = new(std::nothrow) AttributeIterator(inode); if (iterator == NULL) RETURN_ERROR(B_NO_MEMORY); @@ -1561,9 +1537,6 @@ bfs_free_attr_dir_cookie(fs_volume *_volume, fs_vnode *node, void *_cookie) FUNCTION(); AttributeIterator *iterator = (AttributeIterator *)_cookie; - if (iterator == NULL) - RETURN_ERROR(B_BAD_VALUE); - delete iterator; return B_OK; } @@ -1575,9 +1548,6 @@ bfs_rewind_attr_dir(fs_volume *_volume, fs_vnode *_node, void *_cookie) FUNCTION(); AttributeIterator *iterator = (AttributeIterator *)_cookie; - if (iterator == NULL) - RETURN_ERROR(B_BAD_VALUE); - RETURN_ERROR(iterator->Rewind()); } @@ -1650,7 +1620,7 @@ bfs_close_attr(fs_volume *_volume, fs_vnode *_file, void *cookie) static status_t bfs_free_attr_cookie(fs_volume *_volume, fs_vnode *_file, void *cookie) { - free(cookie); + delete (attr_cookie*)cookie; return B_OK; } @@ -1818,8 +1788,10 @@ bfs_open_index_dir(fs_volume *_volume, void **_cookie) Volume *volume = (Volume *)_volume->private_volume; - if (volume->IndicesNode() == NULL) + if (volume->IndicesNode() == NULL) { + // This volume does not have any indices RETURN_ERROR(B_ENTRY_NOT_FOUND); + } // Since the indices root node is just a directory, and we are storing // a pointer to it in our Volume object, we can just use the directory @@ -1828,8 +1800,6 @@ bfs_open_index_dir(fs_volume *_volume, void **_cookie) fs_vnode indicesNode; indicesNode.private_node = volume->IndicesNode(); - if (indicesNode.private_node == NULL) - return B_ENTRY_NOT_FOUND; RETURN_ERROR(bfs_open_dir(_volume, &indicesNode, _cookie)); } @@ -1844,8 +1814,6 @@ bfs_close_index_dir(fs_volume *_volume, void *_cookie) fs_vnode indicesNode; indicesNode.private_node = volume->IndicesNode(); - if (indicesNode.private_node == NULL) - return B_ENTRY_NOT_FOUND; RETURN_ERROR(bfs_close_dir(_volume, &indicesNode, _cookie)); } @@ -1860,8 +1828,6 @@ bfs_free_index_dir_cookie(fs_volume *_volume, void *_cookie) fs_vnode indicesNode; indicesNode.private_node = volume->IndicesNode(); - if (indicesNode.private_node == NULL) - return B_ENTRY_NOT_FOUND; RETURN_ERROR(bfs_free_dir_cookie(_volume, &indicesNode, _cookie)); } @@ -1876,8 +1842,6 @@ bfs_rewind_index_dir(fs_volume *_volume, void *_cookie) fs_vnode indicesNode; indicesNode.private_node = volume->IndicesNode(); - if (indicesNode.private_node == NULL) - return B_ENTRY_NOT_FOUND; RETURN_ERROR(bfs_rewind_dir(_volume, &indicesNode, _cookie)); } @@ -1893,8 +1857,6 @@ bfs_read_index_dir(fs_volume *_volume, void *_cookie, struct dirent *dirent, fs_vnode indicesNode; indicesNode.private_node = volume->IndicesNode(); - if (indicesNode.private_node == NULL) - return B_ENTRY_NOT_FOUND; RETURN_ERROR(bfs_read_dir(_volume, &indicesNode, _cookie, dirent, bufferSize, _num)); @@ -1942,8 +1904,8 @@ bfs_remove_index(fs_volume *_volume, const char *name) if (geteuid() != 0) return B_NOT_ALLOWED; - Inode *indices; - if ((indices = volume->IndicesNode()) == NULL) + Inode *indices = volume->IndicesNode(); + if (indices == NULL) return B_ENTRY_NOT_FOUND; Transaction transaction(volume, volume->Indices()); @@ -2001,7 +1963,7 @@ bfs_open_query(fs_volume *_volume, const char *queryString, uint32 flags, Volume *volume = (Volume *)_volume->private_volume; - Expression *expression = new Expression((char *)queryString); + Expression *expression = new(std::nothrow) Expression((char *)queryString); if (expression == NULL) RETURN_ERROR(B_NO_MEMORY); @@ -2013,7 +1975,7 @@ bfs_open_query(fs_volume *_volume, const char *queryString, uint32 flags, RETURN_ERROR(B_BAD_VALUE); } - Query *query = new Query(volume, expression, flags); + Query *query = new(std::nothrow) Query(volume, expression, flags); if (query == NULL) { delete expression; RETURN_ERROR(B_NO_MEMORY); @@ -2072,10 +2034,8 @@ static status_t bfs_rewind_query(fs_volume * /*_volume*/, void *cookie) { FUNCTION(); - Query *query = (Query *)cookie; - if (query == NULL) - RETURN_ERROR(B_BAD_VALUE); + Query *query = (Query *)cookie; return query->Rewind(); } diff --git a/src/add-ons/kernel/file_systems/bfs/system_dependencies.h b/src/add-ons/kernel/file_systems/bfs/system_dependencies.h index 2e61092004..e7ff9508a2 100644 --- a/src/add-ons/kernel/file_systems/bfs/system_dependencies.h +++ b/src/add-ons/kernel/file_systems/bfs/system_dependencies.h @@ -39,6 +39,7 @@ #include #include +#include #include #include #include