diff --git a/src/add-ons/kernel/file_systems/ext2/Inode.cpp b/src/add-ons/kernel/file_systems/ext2/Inode.cpp index 845fded414..6bf73e83cd 100644 --- a/src/add-ons/kernel/file_systems/ext2/Inode.cpp +++ b/src/add-ons/kernel/file_systems/ext2/Inode.cpp @@ -30,6 +30,7 @@ Inode::Inode(Volume* volume, ino_t id) } if (fNode != NULL) { + // TODO: we don't need a cache for short symlinks fCache = file_cache_create(fVolume->ID(), ID(), Size()); fMap = file_map_create(fVolume->ID(), ID(), Size()); } diff --git a/src/add-ons/kernel/file_systems/ext2/ext2.h b/src/add-ons/kernel/file_systems/ext2/ext2.h index 75e47fc2f9..fde4d3155a 100644 --- a/src/add-ons/kernel/file_systems/ext2/ext2.h +++ b/src/add-ons/kernel/file_systems/ext2/ext2.h @@ -6,6 +6,8 @@ #define EXT2_H +#include + #include #include @@ -160,7 +162,11 @@ struct ext2_inode { }; uint32 generation; uint32 file_access_control; - uint32 directory_access_control; + union { + // for directories vs. files + uint32 directory_access_control; + uint32 size_high; + }; uint32 fragment; uint8 fragment_number; uint8 fragment_size; @@ -170,14 +176,24 @@ struct ext2_inode { uint32 _reserved2; uint16 Mode() const { return B_LENDIAN_TO_HOST_INT16(mode); } - uint32 Size() const { return B_LENDIAN_TO_HOST_INT32(size); } uint32 Flags() const { return B_LENDIAN_TO_HOST_INT32(flags); } + uint16 NumLinks() const { return B_LENDIAN_TO_HOST_INT16(num_links); } time_t AccessTime() const { return B_LENDIAN_TO_HOST_INT32(access_time); } time_t CreationTime() const { return B_LENDIAN_TO_HOST_INT32(creation_time); } time_t ModificationTime() const { return B_LENDIAN_TO_HOST_INT32(modification_time); } time_t DeletionTime() const { return B_LENDIAN_TO_HOST_INT32(deletion_time); } + off_t Size() const + { + if (S_ISREG(Mode())) { + return B_LENDIAN_TO_HOST_INT32(size) + | ((off_t)B_LENDIAN_TO_HOST_INT32(size_high) << 32); + } + + return B_LENDIAN_TO_HOST_INT32(size); + } + uint16 UserID() const { return B_LENDIAN_TO_HOST_INT16(uid) diff --git a/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp b/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp index 2d8ec478d6..d46b98b996 100644 --- a/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp @@ -327,7 +327,7 @@ ext2_read_stat(fs_volume* _volume, fs_vnode* _node, struct stat* stat) stat->st_dev = inode->GetVolume()->ID(); stat->st_ino = inode->ID(); - stat->st_nlink = 1; + stat->st_nlink = node.NumLinks(); stat->st_blksize = EXT2_IO_SIZE; stat->st_uid = node.UserID();