diff options
Diffstat (limited to 'fs/ubifs/orphan.c')
| -rw-r--r-- | fs/ubifs/orphan.c | 13 | 
1 files changed, 9 insertions, 4 deletions
| diff --git a/fs/ubifs/orphan.c b/fs/ubifs/orphan.c index edf43ddd7dce..283f9eb48410 100644 --- a/fs/ubifs/orphan.c +++ b/fs/ubifs/orphan.c @@ -157,7 +157,7 @@ int ubifs_add_orphan(struct ubifs_info *c, ino_t inum)  	int err = 0;  	ino_t xattr_inum;  	union ubifs_key key; -	struct ubifs_dent_node *xent; +	struct ubifs_dent_node *xent, *pxent = NULL;  	struct fscrypt_name nm = {0};  	struct ubifs_orphan *xattr_orphan;  	struct ubifs_orphan *orphan; @@ -181,11 +181,16 @@ int ubifs_add_orphan(struct ubifs_info *c, ino_t inum)  		xattr_inum = le64_to_cpu(xent->inum);  		xattr_orphan = orphan_add(c, xattr_inum, orphan); -		if (IS_ERR(xattr_orphan)) +		if (IS_ERR(xattr_orphan)) { +			kfree(xent);  			return PTR_ERR(xattr_orphan); +		} +		kfree(pxent); +		pxent = xent;  		key_read(c, &xent->key, &key);  	} +	kfree(pxent);  	return 0;  } @@ -688,14 +693,14 @@ static int do_kill_orphans(struct ubifs_info *c, struct ubifs_scan_leb *sleb,  			ino_key_init(c, &key1, inum);  			err = ubifs_tnc_lookup(c, &key1, ino); -			if (err) +			if (err && err != -ENOENT)  				goto out_free;  			/*  			 * Check whether an inode can really get deleted.  			 * linkat() with O_TMPFILE allows rebirth of an inode.  			 */ -			if (ino->nlink == 0) { +			if (err == 0 && ino->nlink == 0) {  				dbg_rcvry("deleting orphaned inode %lu",  					  (unsigned long)inum); |