Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8d6cecd1 authored by Daniel Rosenberg's avatar Daniel Rosenberg
Browse files

ANDROID: sdcardfs: Fix locking for permission fix up



Iterating over d_subdirs requires taking d_lock.
Removed several unneeded locks.

Change-Id: I5b1588e54c7e6ee19b756d6705171c7f829e2650
Signed-off-by: default avatarDaniel Rosenberg <drosen@google.com>
parent 5d61f892
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -111,15 +111,15 @@ void get_derived_permission(struct dentry *parent, struct dentry *dentry)

void get_derive_permissions_recursive(struct dentry *parent) {
	struct dentry *dentry;
	spin_lock(&parent->d_lock);
	list_for_each_entry(dentry, &parent->d_subdirs, d_child) {
		if (dentry->d_inode) {
			mutex_lock(&dentry->d_inode->i_mutex);
			get_derived_permission(parent, dentry);
			fix_derived_permission(dentry->d_inode);
			get_derive_permissions_recursive(dentry);
			mutex_unlock(&dentry->d_inode->i_mutex);
		}
	}
	spin_unlock(&parent->d_lock);
}

/* main function for updating derived permission */
@@ -135,7 +135,6 @@ inline void update_derived_permission_lock(struct dentry *dentry)
	 * 1. need to check whether the dentry is updated or not
	 * 2. remove the root dentry update
	 */
	mutex_lock(&dentry->d_inode->i_mutex);
	if(IS_ROOT(dentry)) {
		//setup_default_pre_root_state(dentry->d_inode);
	} else {
@@ -146,7 +145,6 @@ inline void update_derived_permission_lock(struct dentry *dentry)
		}
	}
	fix_derived_permission(dentry->d_inode);
	mutex_unlock(&dentry->d_inode->i_mutex);
}

int need_graft_path(struct dentry *dentry)
+0 −2
Original line number Diff line number Diff line
@@ -513,11 +513,9 @@ static int sdcardfs_rename(struct inode *old_dir, struct dentry *old_dentry,
	}
	/* At this point, not all dentry information has been moved, so
	 * we pass along new_dentry for the name.*/
	mutex_lock(&d_inode(old_dentry)->i_mutex);
	get_derived_permission_new(new_dentry->d_parent, old_dentry, new_dentry);
	fix_derived_permission(d_inode(old_dentry));
	get_derive_permissions_recursive(old_dentry);
	mutex_unlock(&d_inode(old_dentry)->i_mutex);
out:
	unlock_rename(lower_old_dir_dentry, lower_new_dir_dentry);
	dput(lower_old_dir_dentry);
+1 −3
Original line number Diff line number Diff line
@@ -387,11 +387,9 @@ struct dentry *sdcardfs_lookup(struct inode *dir, struct dentry *dentry,
	if (dentry->d_inode) {
		fsstack_copy_attr_times(dentry->d_inode,
					sdcardfs_lower_inode(dentry->d_inode));
		/* get drived permission */
		mutex_lock(&dentry->d_inode->i_mutex);
		/* get derived permission */
		get_derived_permission(parent, dentry);
		fix_derived_permission(dentry->d_inode);
		mutex_unlock(&dentry->d_inode->i_mutex);
	}
	/* update parent directory's atime */
	fsstack_copy_attr_atime(parent->d_inode,