diff -urN oldtree/fs/ecryptfs/crypto.c newtree/fs/ecryptfs/crypto.c --- oldtree/fs/ecryptfs/crypto.c 2006-08-18 15:01:22.000000000 -0400 +++ newtree/fs/ecryptfs/crypto.c 2006-08-20 04:26:31.020565750 -0400 @@ -97,6 +97,7 @@ int rc = 0; struct scatterlist sg; + mutex_lock(&crypt_stat->cs_md5_tfm_mutex); sg_init_one(&sg, (u8 *)src, len); if (!crypt_stat->md5_tfm) { crypt_stat->md5_tfm = @@ -111,6 +112,7 @@ crypto_digest_init(crypt_stat->md5_tfm); crypto_digest_update(crypt_stat->md5_tfm, &sg, 1); crypto_digest_final(crypt_stat->md5_tfm, dst); + mutex_unlock(&crypt_stat->cs_md5_tfm_mutex); out: return rc; } diff -urN oldtree/fs/ecryptfs/file.c newtree/fs/ecryptfs/file.c --- oldtree/fs/ecryptfs/file.c 2006-08-18 15:01:22.000000000 -0400 +++ newtree/fs/ecryptfs/file.c 2006-08-20 04:26:31.052567750 -0400 @@ -232,12 +232,14 @@ } lower_dentry = ecryptfs_dentry_to_lower(ecryptfs_dentry); crypt_stat = &ecryptfs_inode_to_private(inode)->crypt_stat; + mutex_lock(&crypt_stat->cs_mutex); if (!ECRYPTFS_CHECK_FLAG(crypt_stat->flags, ECRYPTFS_POLICY_APPLIED)) { ecryptfs_printk(KERN_DEBUG, "Setting flags for stat...\n"); /* Policy code enabled in future release */ ECRYPTFS_SET_FLAG(crypt_stat->flags, ECRYPTFS_POLICY_APPLIED); ECRYPTFS_SET_FLAG(crypt_stat->flags, ECRYPTFS_ENCRYPTED); } + mutex_unlock(&crypt_stat->cs_mutex); /* This mntget & dget is undone via fput when the file is released */ dget(lower_dentry); lower_flags = file->f_flags; @@ -263,10 +265,12 @@ rc = 0; goto out; } + mutex_lock(&crypt_stat->cs_mutex); if (i_size_read(lower_inode) == 0) { ecryptfs_printk(KERN_EMERG, "Zero-length lower file; " "ecryptfs_create() had a problem?\n"); rc = -ENOENT; + mutex_unlock(&crypt_stat->cs_mutex); goto out_puts; } else if (!ECRYPTFS_CHECK_FLAG(crypt_stat->flags, ECRYPTFS_POLICY_APPLIED) @@ -283,9 +287,11 @@ * as-is to userspace. For release 0.1, we are * going to default to -EIO. */ rc = -EIO; + mutex_unlock(&crypt_stat->cs_mutex); goto out_puts; } } + mutex_unlock(&crypt_stat->cs_mutex); ecryptfs_printk(KERN_DEBUG, "inode w/ addr = [0x%p], i_ino = [0x%.16x] " "size: [0x%.16x]\n", inode, inode->i_ino, i_size_read(inode));