Commit 9fbb76ce authored by Al Viro's avatar Al Viro
Browse files

[PATCH] get rid of on-stack dentry in udf



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent ad76cbc6
Loading
Loading
Loading
Loading
+11 −15
Original line number Original line Diff line number Diff line
@@ -142,7 +142,7 @@ int udf_write_fi(struct inode *inode, struct fileIdentDesc *cfi,
}
}


static struct fileIdentDesc *udf_find_entry(struct inode *dir,
static struct fileIdentDesc *udf_find_entry(struct inode *dir,
					    struct dentry *dentry,
					    struct qstr *child,
					    struct udf_fileident_bh *fibh,
					    struct udf_fileident_bh *fibh,
					    struct fileIdentDesc *cfi)
					    struct fileIdentDesc *cfi)
{
{
@@ -159,8 +159,8 @@ static struct fileIdentDesc *udf_find_entry(struct inode *dir,
	sector_t offset;
	sector_t offset;
	struct extent_position epos = {};
	struct extent_position epos = {};
	struct udf_inode_info *dinfo = UDF_I(dir);
	struct udf_inode_info *dinfo = UDF_I(dir);
	int isdotdot = dentry->d_name.len == 2 &&
	int isdotdot = child->len == 2 &&
		dentry->d_name.name[0] == '.' && dentry->d_name.name[1] == '.';
		child->name[0] == '.' && child->name[1] == '.';


	size = udf_ext0_offset(dir) + dir->i_size;
	size = udf_ext0_offset(dir) + dir->i_size;
	f_pos = udf_ext0_offset(dir);
	f_pos = udf_ext0_offset(dir);
@@ -238,8 +238,7 @@ static struct fileIdentDesc *udf_find_entry(struct inode *dir,
			continue;
			continue;


		flen = udf_get_filename(dir->i_sb, nameptr, fname, lfi);
		flen = udf_get_filename(dir->i_sb, nameptr, fname, lfi);
		if (flen && udf_match(flen, fname, dentry->d_name.len,
		if (flen && udf_match(flen, fname, child->len, child->name))
				      dentry->d_name.name))
			goto out_ok;
			goto out_ok;
	}
	}


@@ -283,7 +282,7 @@ static struct dentry *udf_lookup(struct inode *dir, struct dentry *dentry,
	} else
	} else
#endif /* UDF_RECOVERY */
#endif /* UDF_RECOVERY */


	if (udf_find_entry(dir, dentry, &fibh, &cfi)) {
	if (udf_find_entry(dir, &dentry->d_name, &fibh, &cfi)) {
		if (fibh.sbh != fibh.ebh)
		if (fibh.sbh != fibh.ebh)
			brelse(fibh.ebh);
			brelse(fibh.ebh);
		brelse(fibh.sbh);
		brelse(fibh.sbh);
@@ -783,7 +782,7 @@ static int udf_rmdir(struct inode *dir, struct dentry *dentry)


	retval = -ENOENT;
	retval = -ENOENT;
	lock_kernel();
	lock_kernel();
	fi = udf_find_entry(dir, dentry, &fibh, &cfi);
	fi = udf_find_entry(dir, &dentry->d_name, &fibh, &cfi);
	if (!fi)
	if (!fi)
		goto out;
		goto out;


@@ -829,7 +828,7 @@ static int udf_unlink(struct inode *dir, struct dentry *dentry)


	retval = -ENOENT;
	retval = -ENOENT;
	lock_kernel();
	lock_kernel();
	fi = udf_find_entry(dir, dentry, &fibh, &cfi);
	fi = udf_find_entry(dir, &dentry->d_name, &fibh, &cfi);
	if (!fi)
	if (!fi)
		goto out;
		goto out;


@@ -1113,7 +1112,7 @@ static int udf_rename(struct inode *old_dir, struct dentry *old_dentry,
	struct udf_inode_info *old_iinfo = UDF_I(old_inode);
	struct udf_inode_info *old_iinfo = UDF_I(old_inode);


	lock_kernel();
	lock_kernel();
	ofi = udf_find_entry(old_dir, old_dentry, &ofibh, &ocfi);
	ofi = udf_find_entry(old_dir, &old_dentry->d_name, &ofibh, &ocfi);
	if (ofi) {
	if (ofi) {
		if (ofibh.sbh != ofibh.ebh)
		if (ofibh.sbh != ofibh.ebh)
			brelse(ofibh.ebh);
			brelse(ofibh.ebh);
@@ -1124,7 +1123,7 @@ static int udf_rename(struct inode *old_dir, struct dentry *old_dentry,
	    != old_inode->i_ino)
	    != old_inode->i_ino)
		goto end_rename;
		goto end_rename;


	nfi = udf_find_entry(new_dir, new_dentry, &nfibh, &ncfi);
	nfi = udf_find_entry(new_dir, &new_dentry->d_name, &nfibh, &ncfi);
	if (nfi) {
	if (nfi) {
		if (!new_inode) {
		if (!new_inode) {
			if (nfibh.sbh != nfibh.ebh)
			if (nfibh.sbh != nfibh.ebh)
@@ -1192,7 +1191,7 @@ static int udf_rename(struct inode *old_dir, struct dentry *old_dentry,
	udf_write_fi(new_dir, &ncfi, nfi, &nfibh, NULL, NULL);
	udf_write_fi(new_dir, &ncfi, nfi, &nfibh, NULL, NULL);


	/* The old fid may have moved - find it again */
	/* The old fid may have moved - find it again */
	ofi = udf_find_entry(old_dir, old_dentry, &ofibh, &ocfi);
	ofi = udf_find_entry(old_dir, &old_dentry->d_name, &ofibh, &ocfi);
	udf_delete_entry(old_dir, ofi, &ofibh, &ocfi);
	udf_delete_entry(old_dir, ofi, &ofibh, &ocfi);


	if (new_inode) {
	if (new_inode) {
@@ -1244,13 +1243,10 @@ static int udf_rename(struct inode *old_dir, struct dentry *old_dentry,
static struct dentry *udf_get_parent(struct dentry *child)
static struct dentry *udf_get_parent(struct dentry *child)
{
{
	struct inode *inode = NULL;
	struct inode *inode = NULL;
	struct dentry dotdot;
	struct qstr dotdot = {.name = "..", .len = 2};
	struct fileIdentDesc cfi;
	struct fileIdentDesc cfi;
	struct udf_fileident_bh fibh;
	struct udf_fileident_bh fibh;


	dotdot.d_name.name = "..";
	dotdot.d_name.len = 2;

	lock_kernel();
	lock_kernel();
	if (!udf_find_entry(child->d_inode, &dotdot, &fibh, &cfi))
	if (!udf_find_entry(child->d_inode, &dotdot, &fibh, &cfi))
		goto out_unlock;
		goto out_unlock;