Re: [PATCH v5] ceph: do not dencrypt the dentry name twice for readdir

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Xiubo Li <xiubli@xxxxxxxxxx> writes:

> On 3/9/22 5:57 PM, Luís Henriques wrote:
>> Xiubo Li <xiubli@xxxxxxxxxx> writes:
>>
>>> On 3/9/22 1:47 AM, Luís Henriques wrote:
>>>> xiubli@xxxxxxxxxx writes:
>>>>
>>>>> From: Xiubo Li <xiubli@xxxxxxxxxx>
>>>>>
>>>>> For the readdir request the dentries will be pasred and dencrypted
>>>>> in ceph_readdir_prepopulate(). And in ceph_readdir() we could just
>>>>> get the dentry name from the dentry cache instead of parsing and
>>>>> dencrypting them again. This could improve performance.
>>>>>
>>>>> Signed-off-by: Xiubo Li <xiubli@xxxxxxxxxx>
>>>>> ---
>>>>>
>>>>> V5:
>>>>> - fix typo of CEPH_ENCRYPTED_LONG_SNAP_NAME_MAX macro
>>>>> - release the rde->dentry in destroy_reply_info
>>>>>
>>>>>
>>>>>    fs/ceph/crypto.h     |  8 ++++++
>>>>>    fs/ceph/dir.c        | 59 +++++++++++++++++++++-----------------------
>>>>>    fs/ceph/inode.c      |  7 ++++++
>>>>>    fs/ceph/mds_client.c |  2 ++
>>>>>    fs/ceph/mds_client.h |  1 +
>>>>>    5 files changed, 46 insertions(+), 31 deletions(-)
>>>>>
>>>>> diff --git a/fs/ceph/crypto.h b/fs/ceph/crypto.h
>>>>> index 1e08f8a64ad6..c85cb8c8bd79 100644
>>>>> --- a/fs/ceph/crypto.h
>>>>> +++ b/fs/ceph/crypto.h
>>>>> @@ -83,6 +83,14 @@ static inline u32 ceph_fscrypt_auth_len(struct ceph_fscrypt_auth *fa)
>>>>>     */
>>>>>    #define CEPH_NOHASH_NAME_MAX (189 - SHA256_DIGEST_SIZE)
>>>>>    +/*
>>>>> + * The encrypted long snap name will be in format of
>>>>> + * "_${ENCRYPTED-LONG-SNAP-NAME}_${INODE-NUM}". And will set the max longth
>>>>> + * to sizeof('_') + NAME_MAX + sizeof('_') + max of sizeof(${INO}) + extra 7
>>>>> + * bytes to align the total size to 8 bytes.
>>>>> + */
>>>>> +#define CEPH_ENCRYPTED_LONG_SNAP_NAME_MAX (1 + 255 + 1 + 16 + 7)
>>>>> +
>>>> I think this constant needs to be defined in a different way and we need
>>>> to keep the snapshots names length a bit shorter than NAME_MAX.  And I'm
>>>> not talking just about the encrypted snapshots.
>>>>
>>>> Right now, ceph PR#45192 fixes an MDS limitation that is keeping long
>>>> snapshot names smaller than 80 characters.  With this limitation we would
>>>> need to keep the snapshot names < 64:
>>>>
>>>>      '_' + <name> + '_' + '<inode#>' '\0'
>>>>       1  +   64   +  1  +    12     +  1 = 80
>>>>
>>>> Note however that currently clients *do* allow to create snapshots with
>>>> bigger names.  And if we do that we'll get an error when doing an LSSNAP
>>>> on a .snap subdirectory that will contain the corresponding long name:
>>>>
>>>>     # mkdir a/.snap/123456qwertasdfgzxcvb7890yuiophjklnm123456qwertasdfgzxcvb78912345
>>>>     # ls -li a/b/.snap
>>>>     ls: a/b/.snap/_123456qwertasdfgzxcvb7890yuiophjklnm123456qwertasdfgzxcvb78912345_109951162777: No such file or directory
>>>>
>>>> We can limit the snapshot names on creation, but this should probably be
>>>> handled on the MDS side (so that old clients won't break anything).  Does
>>>> this make sense?  I can work on an MDS patch for this but... to which
>>>> length should names be limited? NAME_MAX - (2*'_' + <inode len>)?  Or
>>>> should we take base64-encoded names already into account?
>>>>
>>>> (Sorry, I'm jumping around between PRs and patches, and trying to make any
>>>> sense out of the snapshots code :-/ )
>>> For fscrypt case I think it's okay, because the max len of the encrypted name
>>> will be 189 bytes, so even plusing the extra 2 * sizeof('_') - sizeof(<inode#>)
>>> == 15 bytes with ceph PR#41592 it should work well.
>> Is it really 189 bytes, or 252, which is the result of base64 encoding 189
>> bytes?
>
> Yeah, you are right, I misread that. The 252 is from 189 * 4 / 3, which will be
> the base64 encoded name.
>
> So, I think you should fix this to make the totally of base64 encode name won't
> bigger than 240 = 255 - 15. So the CEPH_NOHASH_NAME_MAX should be:
>
> #define CEPH_NOHASH_NAME_MAX (180 - SHA256_DIGEST_SIZE)
>
> ?

That could be done, but maybe it's not worth it if the MDS returns -EINVAL
when creating a snapshot with a name that breaks this rule.  Thus, we can
still have regular file with 189 bytes names and only the snapshots will
have this extra limitation.  (I've already created PR#45312 for this.)

But I'm OK either way.

Cheers,
-- 
Luís

>
>>   Reading the documentation in the CEPH_NOHASH_NAME_MAX definition
>> it seems to be 252.  And in that case we need to limit the names length
>> even further.
>>
>>> But for none fscrypt case, we must limit the max len to NAME_MAX - 2 *
>>> sizeof('_') - sizeof(<inode#>) == 255 - 2 - 13 == 240. So fixing this in
>>> MDS side makes sense IMO.
>> Yeah, I suppose this makes sense.  I can send out a PR soon with this, and
>> try to document it somewhere.  But it may make sense to merge both PRs at
>> the same time and *backport* them to older releases.
>
> Yeah, make sense.
>
> - Xiubo
>
>> Cheers,
>




[Index of Archives]     [CEPH Users]     [Ceph Large]     [Ceph Dev]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux