| From 133b8f9d632cc23715c6d72d1c5ac449e054a12a Mon Sep 17 00:00:00 2001 |
| From: Jeff Mahoney <jeffm@jeffreymahoney.com> |
| Date: Fri, 19 Mar 2010 15:35:46 -0400 |
| Subject: ecryptfs: fix use with tmpfs by removing d_drop from ecryptfs_destroy_inode |
| |
| From: Jeff Mahoney <jeffm@jeffreymahoney.com> |
| |
| commit 133b8f9d632cc23715c6d72d1c5ac449e054a12a upstream. |
| |
| Since tmpfs has no persistent storage, it pins all its dentries in memory |
| so they have d_count=1 when other file systems would have d_count=0. |
| ->lookup is only used to create new dentries. If the caller doesn't |
| instantiate it, it's freed immediately at dput(). ->readdir reads |
| directly from the dcache and depends on the dentries being hashed. |
| |
| When an ecryptfs mount is mounted, it associates the lower file and dentry |
| with the ecryptfs files as they're accessed. When it's umounted and |
| destroys all the in-memory ecryptfs inodes, it fput's the lower_files and |
| d_drop's the lower_dentries. Commit 4981e081 added this and a d_delete in |
| 2008 and several months later commit caeeeecf removed the d_delete. I |
| believe the d_drop() needs to be removed as well. |
| |
| The d_drop effectively hides any file that has been accessed via ecryptfs |
| from the underlying tmpfs since it depends on it being hashed for it to |
| be accessible. I've removed the d_drop on my development node and see no |
| ill effects with basic testing on both tmpfs and persistent storage. |
| |
| As a side effect, after ecryptfs d_drops the dentries on tmpfs, tmpfs |
| BUGs on umount. This is due to the dentries being unhashed. |
| tmpfs->kill_sb is kill_litter_super which calls d_genocide to drop |
| the reference pinning the dentry. It skips unhashed and negative dentries, |
| but shrink_dcache_for_umount_subtree doesn't. Since those dentries |
| still have an elevated d_count, we get a BUG(). |
| |
| This patch removes the d_drop call and fixes both issues. |
| |
| This issue was reported at: |
| https://bugzilla.novell.com/show_bug.cgi?id=567887 |
| |
| Reported-by: Árpád Bíró <biroa@demasz.hu> |
| Signed-off-by: Jeff Mahoney <jeffm@suse.com> |
| Cc: Dustin Kirkland <kirkland@canonical.com> |
| Signed-off-by: Tyler Hicks <tyhicks@linux.vnet.ibm.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| fs/ecryptfs/super.c | 1 - |
| 1 file changed, 1 deletion(-) |
| |
| --- a/fs/ecryptfs/super.c |
| +++ b/fs/ecryptfs/super.c |
| @@ -85,7 +85,6 @@ static void ecryptfs_destroy_inode(struc |
| if (lower_dentry->d_inode) { |
| fput(inode_info->lower_file); |
| inode_info->lower_file = NULL; |
| - d_drop(lower_dentry); |
| } |
| } |
| ecryptfs_destroy_crypt_stat(&inode_info->crypt_stat); |