mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 04:58:13 +00:00
Kernel: Use TRY() more in Plan9FS
This commit is contained in:
parent
d34f2b643e
commit
18dbafec85
1 changed files with 14 additions and 42 deletions
|
@ -513,10 +513,7 @@ KResult Plan9FS::post_message(Message& message, RefPtr<ReceiveCompletion> comple
|
||||||
return EINTR;
|
return EINTR;
|
||||||
}
|
}
|
||||||
auto data_buffer = UserOrKernelBuffer::for_kernel_buffer(const_cast<u8*>(data));
|
auto data_buffer = UserOrKernelBuffer::for_kernel_buffer(const_cast<u8*>(data));
|
||||||
auto nwritten_or_error = description.write(data_buffer, size);
|
auto nwritten = TRY(description.write(data_buffer, size));
|
||||||
if (nwritten_or_error.is_error())
|
|
||||||
return nwritten_or_error.error();
|
|
||||||
auto nwritten = nwritten_or_error.value();
|
|
||||||
data += nwritten;
|
data += nwritten;
|
||||||
size -= nwritten;
|
size -= nwritten;
|
||||||
}
|
}
|
||||||
|
@ -534,10 +531,7 @@ KResult Plan9FS::do_read(u8* data, size_t size)
|
||||||
return EINTR;
|
return EINTR;
|
||||||
}
|
}
|
||||||
auto data_buffer = UserOrKernelBuffer::for_kernel_buffer(data);
|
auto data_buffer = UserOrKernelBuffer::for_kernel_buffer(data);
|
||||||
auto nread_or_error = description.read(data_buffer, size);
|
auto nread = TRY(description.read(data_buffer, size));
|
||||||
if (nread_or_error.is_error())
|
|
||||||
return nread_or_error.error();
|
|
||||||
auto nread = nread_or_error.value();
|
|
||||||
if (nread == 0)
|
if (nread == 0)
|
||||||
return EIO;
|
return EIO;
|
||||||
data += nread;
|
data += nread;
|
||||||
|
@ -554,18 +548,14 @@ KResult Plan9FS::read_and_dispatch_one_message()
|
||||||
u16 tag;
|
u16 tag;
|
||||||
};
|
};
|
||||||
Header header;
|
Header header;
|
||||||
KResult result = do_read(reinterpret_cast<u8*>(&header), sizeof(header));
|
TRY(do_read(reinterpret_cast<u8*>(&header), sizeof(header)));
|
||||||
if (result.is_error())
|
|
||||||
return result;
|
|
||||||
|
|
||||||
auto buffer = KBuffer::try_create_with_size(header.size, Memory::Region::Access::ReadWrite);
|
auto buffer = KBuffer::try_create_with_size(header.size, Memory::Region::Access::ReadWrite);
|
||||||
if (!buffer)
|
if (!buffer)
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
// Copy the already read header into the buffer.
|
// Copy the already read header into the buffer.
|
||||||
memcpy(buffer->data(), &header, sizeof(header));
|
memcpy(buffer->data(), &header, sizeof(header));
|
||||||
result = do_read(buffer->data() + sizeof(header), header.size - sizeof(header));
|
TRY(do_read(buffer->data() + sizeof(header), header.size - sizeof(header)));
|
||||||
if (result.is_error())
|
|
||||||
return result;
|
|
||||||
|
|
||||||
MutexLocker locker(m_lock);
|
MutexLocker locker(m_lock);
|
||||||
|
|
||||||
|
@ -596,9 +586,7 @@ KResult Plan9FS::post_message_and_wait_for_a_reply(Message& message)
|
||||||
auto request_type = message.type();
|
auto request_type = message.type();
|
||||||
auto tag = message.tag();
|
auto tag = message.tag();
|
||||||
auto completion = adopt_ref(*new ReceiveCompletion(tag));
|
auto completion = adopt_ref(*new ReceiveCompletion(tag));
|
||||||
auto result = post_message(message, completion);
|
TRY(post_message(message, completion));
|
||||||
if (result.is_error())
|
|
||||||
return result;
|
|
||||||
if (Thread::current()->block<Plan9FS::Blocker>({}, *this, message, completion).was_interrupted())
|
if (Thread::current()->block<Plan9FS::Blocker>({}, *this, message, completion).was_interrupted())
|
||||||
return EINTR;
|
return EINTR;
|
||||||
|
|
||||||
|
@ -728,9 +716,7 @@ KResult Plan9FSInode::ensure_open_for_mode(int mode)
|
||||||
|
|
||||||
KResultOr<size_t> Plan9FSInode::read_bytes(off_t offset, size_t size, UserOrKernelBuffer& buffer, FileDescription*) const
|
KResultOr<size_t> Plan9FSInode::read_bytes(off_t offset, size_t size, UserOrKernelBuffer& buffer, FileDescription*) const
|
||||||
{
|
{
|
||||||
auto result = const_cast<Plan9FSInode&>(*this).ensure_open_for_mode(O_RDONLY);
|
TRY(const_cast<Plan9FSInode&>(*this).ensure_open_for_mode(O_RDONLY));
|
||||||
if (result.is_error())
|
|
||||||
return result;
|
|
||||||
|
|
||||||
size = fs().adjust_buffer_size(size);
|
size = fs().adjust_buffer_size(size);
|
||||||
|
|
||||||
|
@ -741,8 +727,7 @@ KResultOr<size_t> Plan9FSInode::read_bytes(off_t offset, size_t size, UserOrKern
|
||||||
bool readlink_succeded = false;
|
bool readlink_succeded = false;
|
||||||
if (fs().m_remote_protocol_version >= Plan9FS::ProtocolVersion::v9P2000L && offset == 0) {
|
if (fs().m_remote_protocol_version >= Plan9FS::ProtocolVersion::v9P2000L && offset == 0) {
|
||||||
message << fid();
|
message << fid();
|
||||||
result = fs().post_message_and_wait_for_a_reply(message);
|
if (auto result = fs().post_message_and_wait_for_a_reply(message); result.is_success()) {
|
||||||
if (result.is_success()) {
|
|
||||||
readlink_succeded = true;
|
readlink_succeded = true;
|
||||||
message >> data;
|
message >> data;
|
||||||
}
|
}
|
||||||
|
@ -751,9 +736,7 @@ KResultOr<size_t> Plan9FSInode::read_bytes(off_t offset, size_t size, UserOrKern
|
||||||
if (!readlink_succeded) {
|
if (!readlink_succeded) {
|
||||||
message = Plan9FS::Message { fs(), Plan9FS::Message::Type::Tread };
|
message = Plan9FS::Message { fs(), Plan9FS::Message::Type::Tread };
|
||||||
message << fid() << (u64)offset << (u32)size;
|
message << fid() << (u64)offset << (u32)size;
|
||||||
result = fs().post_message_and_wait_for_a_reply(message);
|
TRY(fs().post_message_and_wait_for_a_reply(message));
|
||||||
if (result.is_error())
|
|
||||||
return result.error();
|
|
||||||
data = message.read_data();
|
data = message.read_data();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -767,23 +750,15 @@ KResultOr<size_t> Plan9FSInode::read_bytes(off_t offset, size_t size, UserOrKern
|
||||||
|
|
||||||
KResultOr<size_t> Plan9FSInode::write_bytes(off_t offset, size_t size, const UserOrKernelBuffer& data, FileDescription*)
|
KResultOr<size_t> Plan9FSInode::write_bytes(off_t offset, size_t size, const UserOrKernelBuffer& data, FileDescription*)
|
||||||
{
|
{
|
||||||
auto result = ensure_open_for_mode(O_WRONLY);
|
TRY(ensure_open_for_mode(O_WRONLY));
|
||||||
if (result.is_error())
|
|
||||||
return result.error();
|
|
||||||
|
|
||||||
size = fs().adjust_buffer_size(size);
|
size = fs().adjust_buffer_size(size);
|
||||||
|
|
||||||
auto data_copy_or_error = data.try_copy_into_kstring(size); // FIXME: this seems ugly
|
auto data_copy = TRY(data.try_copy_into_kstring(size)); // FIXME: this seems ugly
|
||||||
if (data_copy_or_error.is_error())
|
|
||||||
return data_copy_or_error.error();
|
|
||||||
auto data_copy = data_copy_or_error.release_value();
|
|
||||||
|
|
||||||
Plan9FS::Message message { fs(), Plan9FS::Message::Type::Twrite };
|
Plan9FS::Message message { fs(), Plan9FS::Message::Type::Twrite };
|
||||||
message << fid() << (u64)offset;
|
message << fid() << (u64)offset;
|
||||||
message.append_data(data_copy->view());
|
message.append_data(data_copy->view());
|
||||||
result = fs().post_message_and_wait_for_a_reply(message);
|
TRY(fs().post_message_and_wait_for_a_reply(message));
|
||||||
if (result.is_error())
|
|
||||||
return result.error();
|
|
||||||
|
|
||||||
u32 nwritten;
|
u32 nwritten;
|
||||||
message >> nwritten;
|
message >> nwritten;
|
||||||
|
@ -852,8 +827,6 @@ void Plan9FSInode::flush_metadata()
|
||||||
|
|
||||||
KResult Plan9FSInode::traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)> callback) const
|
KResult Plan9FSInode::traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)> callback) const
|
||||||
{
|
{
|
||||||
KResult result = KSuccess;
|
|
||||||
|
|
||||||
// TODO: Should we synthesize "." and ".." here?
|
// TODO: Should we synthesize "." and ".." here?
|
||||||
|
|
||||||
if (fs().m_remote_protocol_version >= Plan9FS::ProtocolVersion::v9P2000L) {
|
if (fs().m_remote_protocol_version >= Plan9FS::ProtocolVersion::v9P2000L) {
|
||||||
|
@ -862,12 +835,10 @@ KResult Plan9FSInode::traverse_as_directory(Function<bool(FileSystem::DirectoryE
|
||||||
{
|
{
|
||||||
Plan9FS::Message clone_message { fs(), Plan9FS::Message::Type::Twalk };
|
Plan9FS::Message clone_message { fs(), Plan9FS::Message::Type::Twalk };
|
||||||
clone_message << fid() << clone_fid << (u16)0;
|
clone_message << fid() << clone_fid << (u16)0;
|
||||||
result = fs().post_message_and_wait_for_a_reply(clone_message);
|
TRY(fs().post_message_and_wait_for_a_reply(clone_message));
|
||||||
if (result.is_error())
|
|
||||||
return result;
|
|
||||||
Plan9FS::Message open_message { fs(), Plan9FS::Message::Type::Tlopen };
|
Plan9FS::Message open_message { fs(), Plan9FS::Message::Type::Tlopen };
|
||||||
open_message << clone_fid << (u32)0;
|
open_message << clone_fid << (u32)0;
|
||||||
result = fs().post_message_and_wait_for_a_reply(open_message);
|
auto result = fs().post_message_and_wait_for_a_reply(open_message);
|
||||||
if (result.is_error()) {
|
if (result.is_error()) {
|
||||||
Plan9FS::Message close_message { fs(), Plan9FS::Message::Type::Tclunk };
|
Plan9FS::Message close_message { fs(), Plan9FS::Message::Type::Tclunk };
|
||||||
close_message << clone_fid;
|
close_message << clone_fid;
|
||||||
|
@ -879,6 +850,7 @@ KResult Plan9FSInode::traverse_as_directory(Function<bool(FileSystem::DirectoryE
|
||||||
|
|
||||||
u64 offset = 0;
|
u64 offset = 0;
|
||||||
u32 count = fs().adjust_buffer_size(8 * MiB);
|
u32 count = fs().adjust_buffer_size(8 * MiB);
|
||||||
|
KResult result = KSuccess;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
Plan9FS::Message message { fs(), Plan9FS::Message::Type::Treaddir };
|
Plan9FS::Message message { fs(), Plan9FS::Message::Type::Treaddir };
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue