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

Commit e21e7095 authored by Al Viro's avatar Al Viro
Browse files

Don't mess with generic_permission() under ->d_lock in hpfs



Just use dentry_unhash() there

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 391e8bbd
Loading
Loading
Loading
Loading
+9 −6
Original line number Diff line number Diff line
@@ -413,22 +413,25 @@ again:

		mutex_unlock(&hpfs_i(dir)->i_mutex);
		mutex_unlock(&hpfs_i(inode)->i_parent_mutex);
		d_drop(dentry);
		spin_lock(&dentry->d_lock);
		if (atomic_read(&dentry->d_count) > 1 ||
		    generic_permission(inode, MAY_WRITE, NULL) ||
		dentry_unhash(dentry);
		if (!d_unhashed(dentry)) {
			dput(dentry);
			unlock_kernel();
			return -ENOSPC;
		}
		if (generic_permission(inode, MAY_WRITE, NULL) ||
		    !S_ISREG(inode->i_mode) ||
		    get_write_access(inode)) {
			spin_unlock(&dentry->d_lock);
			d_rehash(dentry);
			dput(dentry);
		} else {
			struct iattr newattrs;
			spin_unlock(&dentry->d_lock);
			/*printk("HPFS: truncating file before delete.\n");*/
			newattrs.ia_size = 0;
			newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
			err = notify_change(dentry, &newattrs);
			put_write_access(inode);
			dput(dentry);
			if (!err)
				goto again;
		}