Thank you for continuing the discussion.
The reply was delayed to summarize the arguing points.
> I already gave my comment on previous thread, and I prefer de array handling
> I sent instead of only two entries.
We haven't discussed enough yet and I have some questions.
I still don't understand what's technically problem.
> It will avoid repetitive loops to get entries from cache buffer.
Is that loop the first verification and name extraction?
I don't understand why you can avoid the repetitive loop by using arrays.
I think getting from an array is equivalent to getting it via a function.
A = obj->array[idx];
B = get(obj, idx);
For using, what's the difference between A and B?
> I think it is also suitable for function definition and union type entry
> structure.
I, too, think the combination is not bad.
However, it has no advantage compared to other methods.
(Can you give me any example?)
Also, as I said in my previous mail, union has the problem of too flexible for
type.
(Especially file-de and stream-de are easy to confuse)
So I want to avoid to access union directly from the upper function, as
possible.
> If you send the patches included this change again, I will actively look into
> your patches.
It will take some time as I haven't come up with a good idea yet.
We have discussed it so far, but there are still some unclear points.
First, I would like to clarify them.
1. About the need for TYPE_NAME-validation in exfat_get_dentry_set().
My opinion is
> It is possible to correctly determine that
> "Immediately follow the Stream Extension directory entry as a consecutive
> series"
> whether the TYPE_NAME check is implemented exfat_get_uniname_from_ext_entry()
> or
> exfat_get_dentry_set().
> It's functionally same, so it is also right to validate in either.
Your opinion is
> We have not checked the problem when it is removed because it was implemented
> according to the specification from the beginning.
I understand that you haven't thought about it yet.
What happens if I don't check here?
Please imagine if you can.
2. About TYPE_NAME-validation in exfat_get_uniname_from_ext_entry()
Below are the changes in '[PATCH v4 1/5] exfat: integrates dir-entry getting
and validation'
> - for (i = 2; i < es->num_entries; i++) {
> - struct exfat_dentry *ep = exfat_get_dentry_cached(es, i);
> -
> - /* end of name entry */
> - if (exfat_get_entry_type(ep) != TYPE_EXTEND)
> - break;
>
> + i = ES_INDEX_NAME;
> + while ((ep = exfat_get_validated_dentry(es, i++, TYPE_NAME))) {
> exfat_extract_uni_name(ep, uniname);
> uniname += EXFAT_FILE_NAME_LEN;
> }
Your request for this change is
> Please find the way to access name entries like ep_file, ep_stream
> without calling exfat_get_validated_dentry().
What is the reason(or rationale) for such a request?
Please explain what the problem is with this change, if you can.
As I explained before, the reason for validating TYPE_NAME here is
> name-length and type validation and name-extraction should not be separated.
> These are closely related, so these should be placed physically and
> temporally close.
Please explain why you shouldn't validate TYPE_NAME here.
3. About using exfat_get_validated_dentry() in
exfat_update_dir_chksum_with_entry_set()
Below are the changes in '[PATCH v4 1/5] exfat: integrates dir-entry getting
and validation'
> for (i = 0; i < es->num_entries; i++) {
> - ep = exfat_get_dentry_cached(es, i);
> + ep = exfat_get_validated_dentry(es, i, TYPE_ALL);
> chksum = exfat_calc_chksum16(ep, DENTRY_SIZE, chksum,
> chksum_type);
Your request for this change is
> Ditto, You do not need to repeatedly call exfat_get_validated_dentry() for
> the entries
> which got from exfat_get_dentry_set().
Even if the entry was got from exfat_get_dentry_set(), we need to get the ep
again to calculate the checksum.
exfat_get_validated_dentry() with TYPE_ALL is the same as
exfat_get_dentry_cached() because it allows all TYPEs.
Please elaborate on what the problem is.
4. About double-checking name entries as TYPE_SECONDARY and TYPE_NAME.
You said in 'RE: [PATCH v3] exfat: integrates dir-entry getting and validation'.
> your v3 patch are
> already checking the name entries as TYPE_SECONDARY. And it check them with
> TYPE_NAME again in exfat_get_uniname_from_ext_entry(). If you check TYPE_NAME
> with stream->name_len, We don't need to perform the loop for extracting
> filename from the name entries if stream->name_len or name entry is invalid.
It is rare case that stream->name_len or name-entry are invalid.
Perform the loop to extract filename when stream->name_len or name-entry is
invalid has little effect.
What is the probrem with perform the loop for extract filename when
stream->name_len or name-entry are invalid?
5. About validate flags as argument of exfat_get_dentry_set().
You suggested
> You can add a validate flags as argument of exfat_get_dentry_set(), e.g.
> none, basic and strict.
> So as I suggested earlier, You can make it with an argument flags so that we
> skip the validation.
What are the advantages of skipping validation with this flag?
I don't think there's any advantage worth the complexity of the code.
This discussion may take some time, but I hope you continue the discussion.
BR
---
Tetsuhiro Kohada <[email protected]>