ANDROID: sdcardfs: Check for private data earlier
When an sdcardfs dentry is destroyed, it may not yet have its fsdata initialized. It must be checked before we try to access the paths in its private data. Additionally, when cleaning up the superblock after a failure, we don't have our sb private data, so check for that case. Bug: 77923821 Change-Id: I89caf6e121ed86480b42024664453fe0031bbcf3 Signed-off-by: Daniel Rosenberg <drosen@google.com>
This commit is contained in:
parent
3f9e5a6923
commit
91c9270d11
3 changed files with 3 additions and 3 deletions
|
@ -131,6 +131,8 @@ static int sdcardfs_d_revalidate(struct dentry *dentry, unsigned int flags)
|
||||||
|
|
||||||
static void sdcardfs_d_release(struct dentry *dentry)
|
static void sdcardfs_d_release(struct dentry *dentry)
|
||||||
{
|
{
|
||||||
|
if (!dentry || !dentry->d_fsdata)
|
||||||
|
return;
|
||||||
/* release and reset the lower paths */
|
/* release and reset the lower paths */
|
||||||
if (has_graft_path(dentry))
|
if (has_graft_path(dentry))
|
||||||
sdcardfs_put_reset_orig_path(dentry);
|
sdcardfs_put_reset_orig_path(dentry);
|
||||||
|
|
|
@ -41,8 +41,6 @@ void sdcardfs_destroy_dentry_cache(void)
|
||||||
|
|
||||||
void free_dentry_private_data(struct dentry *dentry)
|
void free_dentry_private_data(struct dentry *dentry)
|
||||||
{
|
{
|
||||||
if (!dentry || !dentry->d_fsdata)
|
|
||||||
return;
|
|
||||||
kmem_cache_free(sdcardfs_dentry_cachep, dentry->d_fsdata);
|
kmem_cache_free(sdcardfs_dentry_cachep, dentry->d_fsdata);
|
||||||
dentry->d_fsdata = NULL;
|
dentry->d_fsdata = NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -422,7 +422,7 @@ void sdcardfs_kill_sb(struct super_block *sb)
|
||||||
{
|
{
|
||||||
struct sdcardfs_sb_info *sbi;
|
struct sdcardfs_sb_info *sbi;
|
||||||
|
|
||||||
if (sb->s_magic == SDCARDFS_SUPER_MAGIC) {
|
if (sb->s_magic == SDCARDFS_SUPER_MAGIC && sb->s_fs_info) {
|
||||||
sbi = SDCARDFS_SB(sb);
|
sbi = SDCARDFS_SB(sb);
|
||||||
mutex_lock(&sdcardfs_super_list_lock);
|
mutex_lock(&sdcardfs_super_list_lock);
|
||||||
list_del(&sbi->list);
|
list_del(&sbi->list);
|
||||||
|
|
Loading…
Reference in a new issue