Illumos #3086: unnecessarily setting DS_FLAG_INCONSISTENT on async
[zfs.git] / module / zfs / zpl_ctldir.c
index c680e54..a2d8fa9 100644 (file)
@@ -143,7 +143,11 @@ zpl_root_getattr(struct vfsmount *mnt, struct dentry *dentry,
 }
 
 static struct dentry *
+#ifdef HAVE_LOOKUP_NAMEIDATA
 zpl_root_lookup(struct inode *dip, struct dentry *dentry, struct nameidata *nd)
+#else
+zpl_root_lookup(struct inode *dip, struct dentry *dentry, unsigned int flags)
+#endif
 {
        cred_t *cr = CRED();
        struct inode *ip;
@@ -180,8 +184,14 @@ const struct inode_operations zpl_ops_root = {
 };
 
 static struct dentry *
+#ifdef HAVE_LOOKUP_NAMEIDATA
 zpl_snapdir_lookup(struct inode *dip, struct dentry *dentry,
     struct nameidata *nd)
+#else
+zpl_snapdir_lookup(struct inode *dip, struct dentry *dentry,
+    unsigned int flags)
+#endif
+
 {
        cred_t *cr = CRED();
        struct inode *ip;
@@ -347,6 +357,13 @@ zpl_snapdir_automount(struct path *path)
                return ERR_PTR(error);
 
        /*
+        * Ensure path->dentry points to the dentry for the root of the
+        * newly-mounted snapshot, otherwise this function may be called
+        * repeatedly which can lead to an incorrect ELOOP error return.
+        */
+       follow_up(path);
+
+       /*
         * Rather than returning the new vfsmount for the snapshot we must
         * return NULL to indicate a mount collision.  This is done because
         * the user space mount calls do_add_mount() which adds the vfsmount
@@ -410,8 +427,13 @@ const struct dentry_operations zpl_dops_snapdirs = {
 #endif /* HAVE_AUTOMOUNT */
 
 static struct dentry *
+#ifdef HAVE_LOOKUP_NAMEIDATA
 zpl_shares_lookup(struct inode *dip, struct dentry *dentry,
     struct nameidata *nd)
+#else
+zpl_shares_lookup(struct inode *dip, struct dentry *dentry,
+    unsigned int flags)
+#endif
 {
        cred_t *cr = CRED();
        struct inode *ip = NULL;