On Fri, 2012-04-20 at 21:48 +0000, Adamson, Dros wrote:
> On Apr 20, 2012, at 5:43 PM, Myklebust, Trond wrote:
>
> > On Fri, 2012-04-20 at 21:38 +0000, Adamson, Dros wrote:
> >
> >> Yes, something like that could work, but we still have the same issue - dentry->d_fsdata never has [] escaping.
> >
> > That's a bug too...
>
> Right! This is what I've been talking about the whole time - I guess I didn't do a good job explaining it :) The original bug (splitting return of nfs_path()) would be trivial to fix if d_fsdata had [] escaping.
>
> So I guess that answers my earlier question - we *do* want to change dev_name to include [] escaping.
>
> -dros
Here is a patch from Jan Kara that does just this. I'll start by
applying that...
--
Trond Myklebust
Linux NFS client maintainer
NetApp
Trond.Myklebust@xxxxxxxxxx
www.netapp.com
--- Begin Message ---
When hostname contains colon (e.g. when it is an IPv6 address) it needs
to be enclosed in brackets to make parsing of NFS device string possible.
Fix nfs_do_root_mount() to enclose hostname properly when needed. NFS code
actually does not need this as it does not parse the string passed by
nfs_do_root_mount() but the device string is exposed to userspace in
/proc/mounts.
CC: Josh Boyer <jwboyer@xxxxxxxxxx>
CC: Trond Myklebust <Trond.Myklebust@xxxxxxxxxx>
Signed-off-by: Jan Kara <jack@xxxxxxx>
---
fs/nfs/super.c | 8 ++++++--
1 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index b961cea..42b74f8 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -2694,11 +2694,15 @@ static struct vfsmount *nfs_do_root_mount(struct file_system_type *fs_type,
char *root_devname;
size_t len;
- len = strlen(hostname) + 3;
+ len = strlen(hostname) + 5;
root_devname = kmalloc(len, GFP_KERNEL);
if (root_devname == NULL)
return ERR_PTR(-ENOMEM);
- snprintf(root_devname, len, "%s:/", hostname);
+ /* Does hostname needs to be enclosed in brackets? */
+ if (strchr(hostname, ':'))
+ snprintf(root_devname, len, "[%s]:/", hostname);
+ else
+ snprintf(root_devname, len, "%s:/", hostname);
root_mnt = vfs_kern_mount(fs_type, flags, root_devname, data);
kfree(root_devname);
return root_mnt;
--
1.7.1
--- End Message ---