[syslinux] [PATCH] xfs: Add support for v3 directories
Gene Cumm
gene.cumm at gmail.com
Thu Jan 21 03:09:47 PST 2016
On Mon, Jan 18, 2016 at 8:06 AM, Paulo Alcantara <pcacjr at zytor.com> wrote:
>
> On Mon, January 18, 2016 10:51 am, Gene Cumm wrote:
>> On Mon, Dec 14, 2015 at 7:54 PM, Paulo Alcantara <pcacjr at gmail.com> wrote:
>>> Besides supporting newer version of xfs file system, this patch also
>>> does some code refactoring and fix completely broken listing and
>>> searching on v2-3 node directories.
>>>
>>> Cc: Gene Cumm <gene.cumm at gmail.com>
>>> Cc: H. Peter Anvin <hpa at zytor.com>
>>> Cc: Raphael S. Carvalho <raphael.scarv at gmail.com>
>>> Cc: Ady <ady-sf at hotmail.com>
>>> Signed-off-by: Paulo Alcantara <pcacjr at zytor.com>
>>> ---
>>> core/fs/xfs/xfs.c | 19 +--
>>> core/fs/xfs/xfs.h | 155 +++++++++++++++++++-----
>>> core/fs/xfs/xfs_dinode.c | 2 +-
>>> core/fs/xfs/xfs_dir2.c | 296
>>> +++++++++++++++++++++++++---------------------
>>> core/fs/xfs/xfs_dir2.h | 6 +-
>>> core/fs/xfs/xfs_readdir.c | 151 ++++++++++++++---------
>>> 6 files changed, 399 insertions(+), 230 deletions(-)
>>
>>> diff --git a/core/fs/xfs/xfs_dir2.c b/core/fs/xfs/xfs_dir2.c
>>> index de37ef7..f738a58 100644
>>
>>> --- a/core/fs/xfs/xfs_dir2.c
>>> +++ b/core/fs/xfs/xfs_dir2.c
>>
>>> @@ -593,110 +628,99 @@ struct inode *xfs_dir2_node_find_entry(const char
>>> *dname, struct inode *parent,
>>> xfs_dinode_t *core)
>>> {
>>
>>> - uint32_t hash = 0;
>>> + uint32_t hash;
>>
>>> + uint16_t count;
>>
>>> - int mid = 0;
>>> + int mid;
>>
>>
>>> + if (be16_to_cpu(lhdr->info.magic) == XFS_DIR2_LEAFN_MAGIC) {
>>> + count = be16_to_cpu(lhdr->count);
>>> + ents = (xfs_dir2_leaf_entry_t *)((uint8_t *)lhdr +
>>> + sizeof(struct
>>> xfs_dir2_leaf_hdr));
>>> + } else if (be16_to_cpu(lhdr->info.magic) == XFS_DIR3_LEAFN_MAGIC) {
>>> + count = be16_to_cpu(((xfs_dir3_leaf_hdr_t *)lhdr)->count);
>>> + ents = (xfs_dir2_leaf_entry_t *)((uint8_t *)lhdr +
>>> + sizeof(struct
>>> xfs_dir3_leaf_hdr));
>>> + } else {
>>> + xfs_error("Leaf's magic number does not match (0x%04x)!",
>>> + be16_to_cpu(lhdr->info.magic));
>>> goto out;
>>> }
>>>
>>> - if (!leaf->hdr.count)
>>> - goto out;
>>> + if (!count)
>>> + goto out;
>>>
>>> - for (lep = leaf->ents, low = 0, high = be16_to_cpu(leaf->hdr.count)
>>> - 1;
>>> - low <= high; ) {
>>> + lep = ents;
>>> + low = 0;
>>> + high = count - 1;
>>> + while (low <= high) {
>>> mid = (low + high) >> 1;
>>> -
>>> if ((hash = be32_to_cpu(lep[mid].hashval)) == hashwant)
>>> break;
>>> if (hash < hashwant)
>>
>> Paulo, the initialization to zero of hash and mid silences the
>> compiler's warning about potentially unitialized variables since some
>> versions aren't intelligent enough to realize you've checked for the
>> case of (count == 0), initialized low to 0 and therefore high must be
>> equal to or greater than low.
>>
>> Other than this, it should be good.
>
> Gene, thanks for pointing it out. Could you fix that for me, please? You
> might want to checkout my 'xfs-v3-support' branch to make your life
> easier.
>
> Thanks,
>
> Paulo
>
> --
> Paulo Alcantara, HP Inc.
> Speaking for myself only.
Done and merged.
--
-Gene
More information about the Syslinux
mailing list