fscrypt: replace get_ino_and_lblk_bits with just has_32bit_inodes
[linux-2.6-microblaze.git] / fs / crypto / policy.c
index 7b34949..32709da 100644 (file)
@@ -118,11 +118,11 @@ static bool supported_direct_key_modes(const struct inode *inode,
 }
 
 static bool supported_iv_ino_lblk_policy(const struct fscrypt_policy_v2 *policy,
-                                        const struct inode *inode,
-                                        const char *type, int max_ino_bits)
+                                        const struct inode *inode)
 {
+       const char *type = (policy->flags & FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64)
+                               ? "IV_INO_LBLK_64" : "IV_INO_LBLK_32";
        struct super_block *sb = inode->i_sb;
-       int ino_bits = 64, lblk_bits = 64;
 
        /*
         * IV_INO_LBLK_* exist only because of hardware limitations, and
@@ -149,9 +149,15 @@ static bool supported_iv_ino_lblk_policy(const struct fscrypt_policy_v2 *policy,
                             type, sb->s_id);
                return false;
        }
-       if (sb->s_cop->get_ino_and_lblk_bits)
-               sb->s_cop->get_ino_and_lblk_bits(sb, &ino_bits, &lblk_bits);
-       if (ino_bits > max_ino_bits) {
+
+       /*
+        * IV_INO_LBLK_64 and IV_INO_LBLK_32 both require that inode numbers fit
+        * in 32 bits.  In principle, IV_INO_LBLK_32 could support longer inode
+        * numbers because it hashes the inode number; however, currently the
+        * inode number is gotten from inode::i_ino which is 'unsigned long'.
+        * So for now the implementation limit is 32 bits.
+        */
+       if (!sb->s_cop->has_32bit_inodes) {
                fscrypt_warn(inode,
                             "Can't use %s policy on filesystem '%s' because its inode numbers are too long",
                             type, sb->s_id);
@@ -242,18 +248,9 @@ static bool fscrypt_supported_v2_policy(const struct fscrypt_policy_v2 *policy,
                                        policy->filenames_encryption_mode))
                return false;
 
-       if ((policy->flags & FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64) &&
-           !supported_iv_ino_lblk_policy(policy, inode, "IV_INO_LBLK_64", 32))
-               return false;
-
-       /*
-        * IV_INO_LBLK_32 hashes the inode number, so in principle it can
-        * support any ino_bits.  However, currently the inode number is gotten
-        * from inode::i_ino which is 'unsigned long'.  So for now the
-        * implementation limit is 32 bits.
-        */
-       if ((policy->flags & FSCRYPT_POLICY_FLAG_IV_INO_LBLK_32) &&
-           !supported_iv_ino_lblk_policy(policy, inode, "IV_INO_LBLK_32", 32))
+       if ((policy->flags & (FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64 |
+                             FSCRYPT_POLICY_FLAG_IV_INO_LBLK_32)) &&
+           !supported_iv_ino_lblk_policy(policy, inode))
                return false;
 
        if (memchr_inv(policy->__reserved, 0, sizeof(policy->__reserved))) {