ANDROID: sdcardfs: Check for other cases on path lookup
This fixes a bug where the first lookup of a file or folder created under a different view would not be case insensitive. It will now search through for a case insensitive match if the initial lookup fails. Bug:28024488 Change-Id: I4ff9ce297b9f2f9864b47540e740fd491c545229 Signed-off-by: Daniel Rosenberg <drosen@google.com>
This commit is contained in:
parent
d2c1c16b33
commit
4401aac4e2
1 changed files with 22 additions and 0 deletions
|
@ -240,6 +240,28 @@ static struct dentry *__sdcardfs_lookup(struct dentry *dentry,
|
|||
/* Use vfs_path_lookup to check if the dentry exists or not */
|
||||
err = vfs_path_lookup(lower_dir_dentry, lower_dir_mnt, name, 0,
|
||||
&lower_path);
|
||||
/* check for other cases */
|
||||
if (err == -ENOENT) {
|
||||
struct dentry *child;
|
||||
struct dentry *match = NULL;
|
||||
spin_lock(&lower_dir_dentry->d_lock);
|
||||
list_for_each_entry(child, &lower_dir_dentry->d_subdirs, d_child) {
|
||||
if (child && d_inode(child)) {
|
||||
if (strcasecmp(child->d_name.name, name)==0) {
|
||||
match = dget(child);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
spin_unlock(&lower_dir_dentry->d_lock);
|
||||
if (match) {
|
||||
err = vfs_path_lookup(lower_dir_dentry,
|
||||
lower_dir_mnt,
|
||||
match->d_name.name, 0,
|
||||
&lower_path);
|
||||
dput(match);
|
||||
}
|
||||
}
|
||||
|
||||
/* no error: handle positive dentries */
|
||||
if (!err) {
|
||||
|
|
Loading…
Reference in a new issue