Re: [PATCH] Btrfs: fix error check of btrfs_lookup_dentry()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi, David,

On 2013/12/17 0:27, David Sterba wrote:
On Fri, Dec 13, 2013 at 09:51:42AM +0900, Tsutomu Itoh wrote:
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -4974,10 +4974,17 @@ static void btrfs_dentry_release(struct dentry *dentry)
  static struct dentry *btrfs_lookup(struct inode *dir, struct dentry *dentry,
  				   unsigned int flags)
  {
-	struct dentry *ret;
+	struct inode *inode;

-	ret = d_splice_alias(btrfs_lookup_dentry(dir, dentry), dentry);
-	return ret;
+	inode = btrfs_lookup_dentry(dir, dentry);
+	if (IS_ERR(inode)) {
+		if (PTR_ERR(inode) == -ENOENT)
+			inode = NULL;
+		else
+			return ERR_CAST(inode);
+	}
+
+	return d_splice_alias(inode, dentry);

btrfs_lookup used to be a simple d_splice_alias(btrfs_lookup_dentry ...)
and the expanded back and forth with the DCACHE_NEED_LOOKUP flag.

a66e7cc626f42de6c745963fe0d807518fa49d39 added
39e3c9553f34381a1b664c27b0c696a266a5735e removed

d_splice_alias has been made robust in
a9049376ee05bf966bfe2b081b5071326856890a
"make d_splice_alias(ERR_PTR(err), dentry) = ERR_PTR(err)"

you can drop the error handling from btrfs_lookup completely.

d_splice_alias() is called by the following formats if btrfs_lookup_dentry()
returns NULL before my patch is applied.
  d_splice_alias(NULL, dentry);
However, d_splice_alias() is called by the following formats when
becoming the same situation after my patch is applied.
  d_splice_alias(-ENOENT, dentry);

Therefore, I added the following error handling code.
+       if (IS_ERR(inode)) {
+               if (PTR_ERR(inode) == -ENOENT)
+                       inode = NULL;
+               else
+                       return ERR_CAST(inode);
+       }

Thanks,
Tsutomu


The rest looks ok.




--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Filesystem Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux