fscrypt: move body of fscrypt_prepare_setattr() out-of-line
[linux-2.6-microblaze.git] / fs / crypto / hooks.c
index c582e2d..1c16dba 100644 (file)
@@ -114,6 +114,20 @@ int __fscrypt_prepare_lookup(struct inode *dir, struct dentry *dentry,
 }
 EXPORT_SYMBOL_GPL(__fscrypt_prepare_lookup);
 
+int __fscrypt_prepare_readdir(struct inode *dir)
+{
+       return fscrypt_get_encryption_info(dir);
+}
+EXPORT_SYMBOL_GPL(__fscrypt_prepare_readdir);
+
+int __fscrypt_prepare_setattr(struct dentry *dentry, struct iattr *attr)
+{
+       if (attr->ia_valid & ATTR_SIZE)
+               return fscrypt_require_key(d_inode(dentry));
+       return 0;
+}
+EXPORT_SYMBOL_GPL(__fscrypt_prepare_setattr);
+
 /**
  * fscrypt_prepare_setflags() - prepare to change flags with FS_IOC_SETFLAGS
  * @inode: the inode on which flags are being changed
@@ -129,6 +143,7 @@ int fscrypt_prepare_setflags(struct inode *inode,
                             unsigned int oldflags, unsigned int flags)
 {
        struct fscrypt_info *ci;
+       struct key *key;
        struct fscrypt_master_key *mk;
        int err;
 
@@ -144,13 +159,14 @@ int fscrypt_prepare_setflags(struct inode *inode,
                ci = inode->i_crypt_info;
                if (ci->ci_policy.version != FSCRYPT_POLICY_V2)
                        return -EINVAL;
-               mk = ci->ci_master_key->payload.data[0];
-               down_read(&mk->mk_secret_sem);
+               key = ci->ci_master_key;
+               mk = key->payload.data[0];
+               down_read(&key->sem);
                if (is_master_key_secret_present(&mk->mk_secret))
                        err = fscrypt_derive_dirhash_key(ci, mk);
                else
                        err = -ENOKEY;
-               up_read(&mk->mk_secret_sem);
+               up_read(&key->sem);
                return err;
        }
        return 0;