X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;f=module%2Fzfs%2Fzpl_ctldir.c;h=a2d8fa9fedb58d3b905ffd7c93081c9d2d1bea3e;hb=8780c53961e668211682d40ad36946294c3145d8;hp=6c742c9e8c6a636270ab6391b16e89cd79f30dd6;hpb=ebe7e575eae1e03b1faa545a424f008faeac589d;p=zfs.git diff --git a/module/zfs/zpl_ctldir.c b/module/zfs/zpl_ctldir.c index 6c742c9..a2d8fa9 100644 --- a/module/zfs/zpl_ctldir.c +++ b/module/zfs/zpl_ctldir.c @@ -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; @@ -300,7 +310,7 @@ zpl_snapdir_rmdir(struct inode *dip, struct dentry *dentry) } static int -zpl_snapdir_mkdir(struct inode *dip, struct dentry *dentry, int mode) +zpl_snapdir_mkdir(struct inode *dip, struct dentry *dentry, zpl_umode_t mode) { cred_t *cr = CRED(); vattr_t *vap; @@ -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;