Author: avg
Date: Wed Mar  6 11:11:18 2013
New Revision: 247889
URL: http://svnweb.freebsd.org/changeset/base/247889

Log:
  MFC r246532: zfs_vget, zfs_fhtovp: properly handle the z_shares_dir object

Modified:
  stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/cddl/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)

Modified: stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
==============================================================================
--- stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c        
Wed Mar  6 11:11:02 2013        (r247888)
+++ stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c        
Wed Mar  6 11:11:18 2013        (r247889)
@@ -2018,7 +2018,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 ||
+           (zfsvfs->z_shares_dir != 0 && ino == zfsvfs->z_shares_dir))
                return (EOPNOTSUPP);
 
        ZFS_ENTER(zfsvfs);
@@ -2108,14 +2109,22 @@ zfs_fhtovp(vfs_t *vfsp, fid_t *fidp, vno
                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)) ||
+           (zfsvfs->z_shares_dir != 0 && 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);
                }
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to