From: "Luís Henriques" <lhenriques@suse.de>
To: Xiubo Li <xiubli@redhat.com>
Cc: jlayton@kernel.org, idryomov@gmail.com, vshankar@redhat.com,
ceph-devel@vger.kernel.org
Subject: Re: [PATCH v5] ceph: do not dencrypt the dentry name twice for readdir
Date: Wed, 09 Mar 2022 09:57:13 +0000 [thread overview]
Message-ID: <87v8wn78jq.fsf@brahms.olymp> (raw)
In-Reply-To: <a5d1050b-c922-e5a8-8cee-4b74b4695b73@redhat.com> (Xiubo Li's message of "Wed, 9 Mar 2022 11:21:48 +0800")
Xiubo Li <xiubli@redhat.com> writes:
> On 3/9/22 1:47 AM, Luís Henriques wrote:
>> xiubli@redhat.com writes:
>>
>>> From: Xiubo Li <xiubli@redhat.com>
>>>
>>> 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@redhat.com>
>>> ---
>>>
>>> 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? 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.
Cheers,
--
Luís
next prev parent reply other threads:[~2022-03-09 9:57 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-05 12:25 [PATCH v5] ceph: do not dencrypt the dentry name twice for readdir xiubli
2022-03-08 17:47 ` Luís Henriques
2022-03-09 3:21 ` Xiubo Li
2022-03-09 9:57 ` Luís Henriques [this message]
2022-03-09 10:11 ` Xiubo Li
2022-03-09 11:58 ` Luís Henriques
2022-03-09 12:05 ` Xiubo Li
2022-03-09 10:17 ` Xiubo Li
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87v8wn78jq.fsf@brahms.olymp \
--to=lhenriques@suse.de \
--cc=ceph-devel@vger.kernel.org \
--cc=idryomov@gmail.com \
--cc=jlayton@kernel.org \
--cc=vshankar@redhat.com \
--cc=xiubli@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.