Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1641753

Question on fscrypt_d_revalidate() and fstest generic/429

From Richard Weinberger <richard@nod.at>
Newsgroups linux.kernel
Subject Question on fscrypt_d_revalidate() and fstest generic/429
Date 2017-05-15 16:40 +0200
Message-ID <tHpke-Uz-5@gated-at.bofh.it> (permalink)
Organization linux.* mail to news gateway

Show all headers | View raw


Hi!

on UBIFS, fstest generic/429 fails due to -ENFILE because the internal orphan
list reaches the maximum size.
When you unlink a file, the inode goes into the orphan list, in UBIFS' evict() function
it is being removed later. So, only unlinked but used inodes should stay in that list.

If a directory is encrypted, evict() is not being called although the inode has no
users anymore.
It turned out evict() is not being called because fscrypt's fscrypt_d_revalidate()
function.
When I omit fscrypt_set_d_op() in UBIFS code, the test works just fine.

Can it be that fscrypt_d_revalidate() misses the case of i_nlink being 0?
It seem to treat unlinked inodes as already gone and they stay.

The following change makes the problem go away here:

diff --git a/fs/crypto/crypto.c b/fs/crypto/crypto.c
index 6d6eca394d4d..d0c19838e513 100644
--- a/fs/crypto/crypto.c
+++ b/fs/crypto/crypto.c
@@ -327,6 +327,7 @@ EXPORT_SYMBOL(fscrypt_decrypt_page);
 static int fscrypt_d_revalidate(struct dentry *dentry, unsigned int flags)
 {
        struct dentry *dir;
+       struct inode *inode = d_inode(dentry);
        int dir_has_key, cached_with_key;

        if (flags & LOOKUP_RCU)
@@ -359,6 +360,10 @@ static int fscrypt_d_revalidate(struct dentry *dentry, unsigned int flags)
                        (!cached_with_key && dir_has_key) ||
                        (cached_with_key && !dir_has_key))
                return 0;
+
+       if (!inode || inode->i_nlink == 0)
+               return 0;
+
        return 1;
 }

Does this change make sense? TBH, I'm not really an expert in this area and it is also
not clear to me why you don't see these issue on ext4 or f2fs.
Maybe UBIFS' limitations kick in much earlier. ;-)

Thanks,
//richard

Back to linux.kernel | Previous | NextNext in thread | Find similar | Unroll thread


Thread

Question on fscrypt_d_revalidate() and fstest generic/429 Richard Weinberger <richard@nod.at> - 2017-05-15 16:40 +0200
  Re: Question on fscrypt_d_revalidate() and fstest generic/429 Eric Biggers <ebiggers3@gmail.com> - 2017-05-15 21:50 +0200
    Re: Question on fscrypt_d_revalidate() and fstest generic/429 Richard Weinberger <richard@nod.at> - 2017-05-15 22:00 +0200
      Re: Question on fscrypt_d_revalidate() and fstest generic/429 Eric Biggers <ebiggers3@gmail.com> - 2017-05-16 01:30 +0200
        Re: Question on fscrypt_d_revalidate() and fstest generic/429 Richard Weinberger <richard@nod.at> - 2017-05-16 08:50 +0200
          Re: Question on fscrypt_d_revalidate() and fstest generic/429 Eric Biggers <ebiggers3@gmail.com> - 2017-05-17 00:10 +0200
            Re: Question on fscrypt_d_revalidate() and fstest generic/429 Richard Weinberger <richard@nod.at> - 2017-05-17 00:30 +0200
      Re: Question on fscrypt_d_revalidate() and fstest generic/429 Al Viro <viro@ZenIV.linux.org.uk> - 2017-05-16 02:00 +0200
        Re: Question on fscrypt_d_revalidate() and fstest generic/429 Richard Weinberger <richard@nod.at> - 2017-05-16 13:30 +0200

csiph-web