Andriy Gapon wrote:
> on 06/02/2013 17:15 Rick Macklem said the following:
> > Well, zfs_vget() returns EOPNOTSUPP for .zfs, so the NFS server
> > knows to
> > switch over to using VOP_LOOKUP(). If the .zfs/snapshot and
> > .zfs/share
> > do the same thing, that should be fine, at least for the NFS server,
> > I think.
>
> Ah, right, but again this is done only for .zfs and .zfs/snapshot.
> .zfs/shares is not special-cased and thus is problematic here too in
> the same
> fashion as zfs_fhtovp.
>
Well, I have no way to test this, but maybe the attached patch is a
start in the right direction.
Maybe you can take a look at it and/or Sergey could test it?
Thanks for all your help with this, rick
> --
> Andriy Gapon
--- cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c.sav 2013-02-06 19:38:41.000000000 -0500
+++ cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c 2013-02-06 20:06:38.000000000 -0500
@@ -2009,7 +2009,8 @@ zfs_vget(vfs_t *vfsp, ino_t ino, int fla
* .zfs/snapshot/ directories, that's why we return EOPNOTSUPP.
* This will make NFS to switch to LOOKUP instead of using VGET.
*/
- if (ino == ZFSCTL_INO_ROOT || ino == ZFSCTL_INO_SNAPDIR)
+ if (ino == ZFSCTL_INO_ROOT || ino == ZFSCTL_INO_SNAPDIR ||
+ ino == zfsvfs->z_shares_dir)
return (EOPNOTSUPP);
ZFS_ENTER(zfsvfs);
@@ -2099,14 +2100,22 @@ zfs_fhtovp(vfs_t *vfsp, fid_t *fidp, int
return (EINVAL);
}
- /* A zero fid_gen means we are in the .zfs control directories */
- if (fid_gen == 0 &&
- (object == ZFSCTL_INO_ROOT || object == ZFSCTL_INO_SNAPDIR)) {
+ /*
+ * A zero fid_gen means we are in .zfs or the .zfs/snapshot
+ * directory tree. If the object == zfsvfs->z_shares_dir, then
+ * we are in the .zfs/shares directory tree.
+ */
+ if ((fid_gen == 0 &&
+ (object == ZFSCTL_INO_ROOT || object == ZFSCTL_INO_SNAPDIR)) ||
+ object == zfsvfs->z_shares_dir) {
*vpp = zfsvfs->z_ctldir;
ASSERT(*vpp != NULL);
if (object == ZFSCTL_INO_SNAPDIR) {
VERIFY(zfsctl_root_lookup(*vpp, "snapshot", vpp, NULL,
0, NULL, NULL, NULL, NULL, NULL) == 0);
+ } else if (object == zfsvfs->z_shares_dir) {
+ VERIFY(zfsctl_root_lookup(*vpp, "shares", vpp, NULL,
+ 0, NULL, NULL, NULL, NULL, NULL) == 0);
} else {
VN_HOLD(*vpp);
}
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "[email protected]"