usr/src/uts/common/fs/zfs/zfs_ctldir.c
author George Wilson <George.Wilson@Sun.COM>
Wed, 19 May 2010 22:59:13 -0700
changeset 12450 c77e20e4e046
parent 12079 13822b941977
child 12906 3ca11e9f39b7
permissions -rw-r--r--
6938089 dedup-induced latency causes FC initiator logouts/FC port resets
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     1
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     2
 * CDDL HEADER START
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     3
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
1512
dad2d74ca2cb 6391609 zfs_fid() missing ZFS_EXIT()
ek110237
parents: 1298
diff changeset
     5
 * Common Development and Distribution License (the "License").
dad2d74ca2cb 6391609 zfs_fid() missing ZFS_EXIT()
ek110237
parents: 1298
diff changeset
     6
 * You may not use this file except in compliance with the License.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     7
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    11
 * and limitations under the License.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    12
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    18
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    19
 * CDDL HEADER END
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    20
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    21
/*
12079
13822b941977 6939941 problem with moving files in zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11935
diff changeset
    22
 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    23
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    24
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    25
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    26
 * ZFS control directory (a.k.a. ".zfs")
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    27
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    28
 * This directory provides a common location for all ZFS meta-objects.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    29
 * Currently, this is only the 'snapshot' directory, but this may expand in the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    30
 * future.  The elements are built using the GFS primitives, as the hierarchy
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    31
 * does not actually exist on disk.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    32
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    33
 * For 'snapshot', we don't want to have all snapshots always mounted, because
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    34
 * this would take up a huge amount of space in /etc/mnttab.  We have three
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    35
 * types of objects:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    36
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    37
 * 	ctldir ------> snapshotdir -------> snapshot
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    38
 *                                             |
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    39
 *                                             |
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    40
 *                                             V
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    41
 *                                         mounted fs
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    42
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    43
 * The 'snapshot' node contains just enough information to lookup '..' and act
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    44
 * as a mountpoint for the snapshot.  Whenever we lookup a specific snapshot, we
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    45
 * perform an automount of the underlying filesystem and return the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    46
 * corresponding vnode.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    47
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    48
 * All mounts are handled automatically by the kernel, but unmounts are
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    49
 * (currently) handled from user land.  The main reason is that there is no
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    50
 * reliable way to auto-unmount the filesystem when it's "no longer in use".
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    51
 * When the user unmounts a filesystem, we call zfsctl_unmount(), which
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    52
 * unmounts any snapshots within the snapshot directory.
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
    53
 *
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
    54
 * The '.zfs', '.zfs/snapshot', and all directories created under
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
    55
 * '.zfs/snapshot' (ie: '.zfs/snapshot/<snapname>') are all GFS nodes and
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
    56
 * share the same vfs_t as the head filesystem (what '.zfs' lives under).
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
    57
 *
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
    58
 * File systems mounted ontop of the GFS nodes '.zfs/snapshot/<snapname>'
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
    59
 * (ie: snapshots) are ZFS nodes and have their own unique vfs_t.
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
    60
 * However, vnodes within these mounted on file systems have their v_vfsp
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
    61
 * fields set to the head filesystem to make NFS happy (see
6068
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
    62
 * zfsctl_snapdir_lookup()). We VFS_HOLD the head filesystem's vfs_t
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
    63
 * so that it cannot be freed until all snapshots have been unmounted.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    64
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    65
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    66
#include <fs/fs_subr.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    67
#include <sys/zfs_ctldir.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    68
#include <sys/zfs_ioctl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    69
#include <sys/zfs_vfsops.h>
3898
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2676
diff changeset
    70
#include <sys/vfs_opreg.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    71
#include <sys/gfs.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    72
#include <sys/stat.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    73
#include <sys/dmu.h>
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
    74
#include <sys/dsl_deleg.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    75
#include <sys/mount.h>
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
    76
#include <sys/sunddi.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    77
6658
468e12a53baf 6700649 zfs_ctldir snapshot creation issues with CIFS clients
marks
parents: 6492
diff changeset
    78
#include "zfs_namecheck.h"
468e12a53baf 6700649 zfs_ctldir snapshot creation issues with CIFS clients
marks
parents: 6492
diff changeset
    79
6068
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
    80
typedef struct zfsctl_node {
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
    81
	gfs_dir_t	zc_gfs_private;
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
    82
	uint64_t	zc_id;
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
    83
	timestruc_t	zc_cmtime;	/* ctime and mtime, always the same */
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
    84
} zfsctl_node_t;
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
    85
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
    86
typedef struct zfsctl_snapdir {
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
    87
	zfsctl_node_t	sd_node;
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
    88
	kmutex_t	sd_lock;
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
    89
	avl_tree_t	sd_snaps;
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
    90
} zfsctl_snapdir_t;
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
    91
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    92
typedef struct {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    93
	char		*se_name;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    94
	vnode_t		*se_root;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    95
	avl_node_t	se_node;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    96
} zfs_snapentry_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    97
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    98
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    99
snapentry_compare(const void *a, const void *b)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   100
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   101
	const zfs_snapentry_t *sa = a;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   102
	const zfs_snapentry_t *sb = b;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   103
	int ret = strcmp(sa->se_name, sb->se_name);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   104
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   105
	if (ret < 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   106
		return (-1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   107
	else if (ret > 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   108
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   109
	else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   110
		return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   111
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   112
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   113
vnodeops_t *zfsctl_ops_root;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   114
vnodeops_t *zfsctl_ops_snapdir;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   115
vnodeops_t *zfsctl_ops_snapshot;
8845
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   116
vnodeops_t *zfsctl_ops_shares;
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   117
vnodeops_t *zfsctl_ops_shares_dir;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   118
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   119
static const fs_operation_def_t zfsctl_tops_root[];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   120
static const fs_operation_def_t zfsctl_tops_snapdir[];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   121
static const fs_operation_def_t zfsctl_tops_snapshot[];
8845
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   122
static const fs_operation_def_t zfsctl_tops_shares[];
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   123
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   124
static vnode_t *zfsctl_mknode_snapdir(vnode_t *);
8845
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   125
static vnode_t *zfsctl_mknode_shares(vnode_t *);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   126
static vnode_t *zfsctl_snapshot_mknode(vnode_t *, uint64_t objset);
6068
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   127
static int zfsctl_unmount_snap(zfs_snapentry_t *, int, cred_t *);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   128
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   129
static gfs_opsvec_t zfsctl_opsvec[] = {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   130
	{ ".zfs", zfsctl_tops_root, &zfsctl_ops_root },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   131
	{ ".zfs/snapshot", zfsctl_tops_snapdir, &zfsctl_ops_snapdir },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   132
	{ ".zfs/snapshot/vnode", zfsctl_tops_snapshot, &zfsctl_ops_snapshot },
8845
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   133
	{ ".zfs/shares", zfsctl_tops_shares, &zfsctl_ops_shares_dir },
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   134
	{ ".zfs/shares/vnode", zfsctl_tops_shares, &zfsctl_ops_shares },
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   135
	{ NULL }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   136
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   137
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   138
/*
8845
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   139
 * Root directory elements.  We only have two entries
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   140
 * snapshot and shares.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   141
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   142
static gfs_dirent_t zfsctl_root_entries[] = {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   143
	{ "snapshot", zfsctl_mknode_snapdir, GFS_CACHE_VNODE },
8845
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   144
	{ "shares", zfsctl_mknode_shares, GFS_CACHE_VNODE },
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   145
	{ NULL }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   146
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   147
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   148
/* include . and .. in the calculation */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   149
#define	NROOT_ENTRIES	((sizeof (zfsctl_root_entries) / \
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   150
    sizeof (gfs_dirent_t)) + 1)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   151
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   152
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   153
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   154
 * Initialize the various GFS pieces we'll need to create and manipulate .zfs
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   155
 * directories.  This is called from the ZFS init routine, and initializes the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   156
 * vnode ops vectors that we'll be using.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   157
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   158
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   159
zfsctl_init(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   160
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   161
	VERIFY(gfs_make_opsvec(zfsctl_opsvec) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   162
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   163
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   164
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   165
zfsctl_fini(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   166
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   167
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   168
	 * Remove vfsctl vnode ops
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   169
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   170
	if (zfsctl_ops_root)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   171
		vn_freevnodeops(zfsctl_ops_root);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   172
	if (zfsctl_ops_snapdir)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   173
		vn_freevnodeops(zfsctl_ops_snapdir);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   174
	if (zfsctl_ops_snapshot)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   175
		vn_freevnodeops(zfsctl_ops_snapshot);
8845
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   176
	if (zfsctl_ops_shares)
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   177
		vn_freevnodeops(zfsctl_ops_shares);
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   178
	if (zfsctl_ops_shares_dir)
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   179
		vn_freevnodeops(zfsctl_ops_shares_dir);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   180
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   181
	zfsctl_ops_root = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   182
	zfsctl_ops_snapdir = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   183
	zfsctl_ops_snapshot = NULL;
8845
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   184
	zfsctl_ops_shares = NULL;
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   185
	zfsctl_ops_shares_dir = NULL;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   186
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   187
12079
13822b941977 6939941 problem with moving files in zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11935
diff changeset
   188
boolean_t
13822b941977 6939941 problem with moving files in zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11935
diff changeset
   189
zfsctl_is_node(vnode_t *vp)
13822b941977 6939941 problem with moving files in zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11935
diff changeset
   190
{
13822b941977 6939941 problem with moving files in zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11935
diff changeset
   191
	return (vn_matchops(vp, zfsctl_ops_root) ||
13822b941977 6939941 problem with moving files in zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11935
diff changeset
   192
	    vn_matchops(vp, zfsctl_ops_snapdir) ||
13822b941977 6939941 problem with moving files in zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11935
diff changeset
   193
	    vn_matchops(vp, zfsctl_ops_snapshot) ||
13822b941977 6939941 problem with moving files in zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11935
diff changeset
   194
	    vn_matchops(vp, zfsctl_ops_shares) ||
13822b941977 6939941 problem with moving files in zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11935
diff changeset
   195
	    vn_matchops(vp, zfsctl_ops_shares_dir));
13822b941977 6939941 problem with moving files in zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11935
diff changeset
   196
13822b941977 6939941 problem with moving files in zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11935
diff changeset
   197
}
13822b941977 6939941 problem with moving files in zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11935
diff changeset
   198
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   199
/*
8845
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   200
 * Return the inode number associated with the 'snapshot' or
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   201
 * 'shares' directory.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   202
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   203
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   204
static ino64_t
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   205
zfsctl_root_inode_cb(vnode_t *vp, int index)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   206
{
8845
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   207
	zfsvfs_t *zfsvfs = vp->v_vfsp->vfs_data;
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   208
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   209
	ASSERT(index <= 2);
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   210
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   211
	if (index == 0)
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   212
		return (ZFSCTL_INO_SNAPDIR);
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   213
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   214
	return (zfsvfs->z_shares_dir);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   215
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   216
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   217
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   218
 * Create the '.zfs' directory.  This directory is cached as part of the VFS
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   219
 * structure.  This results in a hold on the vfs_t.  The code in zfs_umount()
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   220
 * therefore checks against a vfs_count of 2 instead of 1.  This reference
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   221
 * is removed when the ctldir is destroyed in the unmount.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   222
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   223
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   224
zfsctl_create(zfsvfs_t *zfsvfs)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   225
{
1571
5aae3c7637de 6349516 surprise: .zfs & .zfs/snapshot keep changing
ek110237
parents: 1566
diff changeset
   226
	vnode_t *vp, *rvp;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   227
	zfsctl_node_t *zcp;
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 10373
diff changeset
   228
	uint64_t crtime[2];
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   229
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   230
	ASSERT(zfsvfs->z_ctldir == NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   231
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   232
	vp = gfs_root_create(sizeof (zfsctl_node_t), zfsvfs->z_vfs,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   233
	    zfsctl_ops_root, ZFSCTL_INO_ROOT, zfsctl_root_entries,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   234
	    zfsctl_root_inode_cb, MAXNAMELEN, NULL, NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   235
	zcp = vp->v_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   236
	zcp->zc_id = ZFSCTL_INO_ROOT;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   237
1571
5aae3c7637de 6349516 surprise: .zfs & .zfs/snapshot keep changing
ek110237
parents: 1566
diff changeset
   238
	VERIFY(VFS_ROOT(zfsvfs->z_vfs, &rvp) == 0);
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 10373
diff changeset
   239
	VERIFY(0 == sa_lookup(VTOZ(rvp)->z_sa_hdl, SA_ZPL_CRTIME(zfsvfs),
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 10373
diff changeset
   240
	    &crtime, sizeof (crtime)));
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 10373
diff changeset
   241
	ZFS_TIME_DECODE(&zcp->zc_cmtime, crtime);
1571
5aae3c7637de 6349516 surprise: .zfs & .zfs/snapshot keep changing
ek110237
parents: 1566
diff changeset
   242
	VN_RELE(rvp);
5aae3c7637de 6349516 surprise: .zfs & .zfs/snapshot keep changing
ek110237
parents: 1566
diff changeset
   243
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   244
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   245
	 * We're only faking the fact that we have a root of a filesystem for
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   246
	 * the sake of the GFS interfaces.  Undo the flag manipulation it did
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   247
	 * for us.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   248
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   249
	vp->v_flag &= ~(VROOT | VNOCACHE | VNOMAP | VNOSWAP | VNOMOUNT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   250
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   251
	zfsvfs->z_ctldir = vp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   252
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   253
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   254
/*
1298
1a70f57b62f0 6368181 some memleaks found related to zfs mount
perrin
parents: 1154
diff changeset
   255
 * Destroy the '.zfs' directory.  Only called when the filesystem is unmounted.
1a70f57b62f0 6368181 some memleaks found related to zfs mount
perrin
parents: 1154
diff changeset
   256
 * There might still be more references if we were force unmounted, but only
1a70f57b62f0 6368181 some memleaks found related to zfs mount
perrin
parents: 1154
diff changeset
   257
 * new zfs_inactive() calls can occur and they don't reference .zfs
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   258
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   259
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   260
zfsctl_destroy(zfsvfs_t *zfsvfs)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   261
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   262
	VN_RELE(zfsvfs->z_ctldir);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   263
	zfsvfs->z_ctldir = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   264
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   265
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   266
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   267
 * Given a root znode, retrieve the associated .zfs directory.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   268
 * Add a hold to the vnode and return it.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   269
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   270
vnode_t *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   271
zfsctl_root(znode_t *zp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   272
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   273
	ASSERT(zfs_has_ctldir(zp));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   274
	VN_HOLD(zp->z_zfsvfs->z_ctldir);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   275
	return (zp->z_zfsvfs->z_ctldir);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   276
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   277
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   278
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   279
 * Common open routine.  Disallow any write access.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   280
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   281
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   282
static int
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   283
zfsctl_common_open(vnode_t **vpp, int flags, cred_t *cr, caller_context_t *ct)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   284
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   285
	if (flags & FWRITE)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   286
		return (EACCES);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   287
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   288
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   289
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   290
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   291
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   292
 * Common close routine.  Nothing to do here.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   293
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   294
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   295
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   296
zfsctl_common_close(vnode_t *vpp, int flags, int count, offset_t off,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   297
    cred_t *cr, caller_context_t *ct)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   298
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   299
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   300
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   301
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   302
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   303
 * Common access routine.  Disallow writes.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   304
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   305
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   306
static int
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   307
zfsctl_common_access(vnode_t *vp, int mode, int flags, cred_t *cr,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   308
    caller_context_t *ct)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   309
{
8547
bcc7b46e5ff7 6792884 Vista clients cannot access .zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7229
diff changeset
   310
	if (flags & V_ACE_MASK) {
bcc7b46e5ff7 6792884 Vista clients cannot access .zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7229
diff changeset
   311
		if (mode & ACE_ALL_WRITE_PERMS)
bcc7b46e5ff7 6792884 Vista clients cannot access .zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7229
diff changeset
   312
			return (EACCES);
bcc7b46e5ff7 6792884 Vista clients cannot access .zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7229
diff changeset
   313
	} else {
bcc7b46e5ff7 6792884 Vista clients cannot access .zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7229
diff changeset
   314
		if (mode & VWRITE)
bcc7b46e5ff7 6792884 Vista clients cannot access .zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7229
diff changeset
   315
			return (EACCES);
bcc7b46e5ff7 6792884 Vista clients cannot access .zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7229
diff changeset
   316
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   317
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   318
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   319
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   320
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   321
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   322
 * Common getattr function.  Fill in basic information.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   323
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   324
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   325
zfsctl_common_getattr(vnode_t *vp, vattr_t *vap)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   326
{
1571
5aae3c7637de 6349516 surprise: .zfs & .zfs/snapshot keep changing
ek110237
parents: 1566
diff changeset
   327
	timestruc_t	now;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   328
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   329
	vap->va_uid = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   330
	vap->va_gid = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   331
	vap->va_rdev = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   332
	/*
10373
bcf97ee54990 6395956 snapshot dir needs real c/mtime
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
   333
	 * We are a purely virtual object, so we have no
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   334
	 * blocksize or allocated blocks.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   335
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   336
	vap->va_blksize = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   337
	vap->va_nblocks = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   338
	vap->va_seq = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   339
	vap->va_fsid = vp->v_vfsp->vfs_dev;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   340
	vap->va_mode = S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP |
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   341
	    S_IROTH | S_IXOTH;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   342
	vap->va_type = VDIR;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   343
	/*
1571
5aae3c7637de 6349516 surprise: .zfs & .zfs/snapshot keep changing
ek110237
parents: 1566
diff changeset
   344
	 * We live in the now (for atime).
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   345
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   346
	gethrestime(&now);
1571
5aae3c7637de 6349516 surprise: .zfs & .zfs/snapshot keep changing
ek110237
parents: 1566
diff changeset
   347
	vap->va_atime = now;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   348
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   349
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   350
/*ARGSUSED*/
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   351
static int
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   352
zfsctl_common_fid(vnode_t *vp, fid_t *fidp, caller_context_t *ct)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   353
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   354
	zfsvfs_t	*zfsvfs = vp->v_vfsp->vfs_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   355
	zfsctl_node_t	*zcp = vp->v_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   356
	uint64_t	object = zcp->zc_id;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   357
	zfid_short_t	*zfid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   358
	int		i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   359
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   360
	ZFS_ENTER(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   361
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   362
	if (fidp->fid_len < SHORT_FID_LEN) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   363
		fidp->fid_len = SHORT_FID_LEN;
1512
dad2d74ca2cb 6391609 zfs_fid() missing ZFS_EXIT()
ek110237
parents: 1298
diff changeset
   364
		ZFS_EXIT(zfsvfs);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   365
		return (ENOSPC);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   366
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   367
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   368
	zfid = (zfid_short_t *)fidp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   369
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   370
	zfid->zf_len = SHORT_FID_LEN;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   371
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   372
	for (i = 0; i < sizeof (zfid->zf_object); i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   373
		zfid->zf_object[i] = (uint8_t)(object >> (8 * i));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   374
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   375
	/* .zfs znodes always have a generation number of 0 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   376
	for (i = 0; i < sizeof (zfid->zf_gen); i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   377
		zfid->zf_gen[i] = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   378
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   379
	ZFS_EXIT(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   380
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   381
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   382
8845
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   383
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   384
/*ARGSUSED*/
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   385
static int
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   386
zfsctl_shares_fid(vnode_t *vp, fid_t *fidp, caller_context_t *ct)
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   387
{
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   388
	zfsvfs_t	*zfsvfs = vp->v_vfsp->vfs_data;
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   389
	znode_t		*dzp;
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   390
	int		error;
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   391
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   392
	ZFS_ENTER(zfsvfs);
9030
243fd360d81f 6815893 hang mounting a dataset after booting into a new boot environment
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8845
diff changeset
   393
243fd360d81f 6815893 hang mounting a dataset after booting into a new boot environment
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8845
diff changeset
   394
	if (zfsvfs->z_shares_dir == 0) {
243fd360d81f 6815893 hang mounting a dataset after booting into a new boot environment
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8845
diff changeset
   395
		ZFS_EXIT(zfsvfs);
243fd360d81f 6815893 hang mounting a dataset after booting into a new boot environment
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8845
diff changeset
   396
		return (ENOTSUP);
243fd360d81f 6815893 hang mounting a dataset after booting into a new boot environment
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8845
diff changeset
   397
	}
243fd360d81f 6815893 hang mounting a dataset after booting into a new boot environment
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8845
diff changeset
   398
8845
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   399
	if ((error = zfs_zget(zfsvfs, zfsvfs->z_shares_dir, &dzp)) == 0) {
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   400
		error = VOP_FID(ZTOV(dzp), fidp, ct);
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   401
		VN_RELE(ZTOV(dzp));
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   402
	}
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   403
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   404
	ZFS_EXIT(zfsvfs);
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   405
	return (error);
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   406
}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   407
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   408
 * .zfs inode namespace
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   409
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   410
 * We need to generate unique inode numbers for all files and directories
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   411
 * within the .zfs pseudo-filesystem.  We use the following scheme:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   412
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   413
 * 	ENTRY			ZFSCTL_INODE
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   414
 * 	.zfs			1
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   415
 * 	.zfs/snapshot		2
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   416
 * 	.zfs/snapshot/<snap>	objectid(snap)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   417
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   418
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   419
#define	ZFSCTL_INO_SNAP(id)	(id)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   420
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   421
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   422
 * Get root directory attributes.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   423
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   424
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   425
static int
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   426
zfsctl_root_getattr(vnode_t *vp, vattr_t *vap, int flags, cred_t *cr,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   427
    caller_context_t *ct)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   428
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   429
	zfsvfs_t *zfsvfs = vp->v_vfsp->vfs_data;
10373
bcf97ee54990 6395956 snapshot dir needs real c/mtime
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
   430
	zfsctl_node_t *zcp = vp->v_data;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   431
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   432
	ZFS_ENTER(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   433
	vap->va_nodeid = ZFSCTL_INO_ROOT;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   434
	vap->va_nlink = vap->va_size = NROOT_ENTRIES;
10373
bcf97ee54990 6395956 snapshot dir needs real c/mtime
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
   435
	vap->va_mtime = vap->va_ctime = zcp->zc_cmtime;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   436
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   437
	zfsctl_common_getattr(vp, vap);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   438
	ZFS_EXIT(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   439
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   440
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   441
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   442
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   443
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   444
 * Special case the handling of "..".
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   445
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   446
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   447
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   448
zfsctl_root_lookup(vnode_t *dvp, char *nm, vnode_t **vpp, pathname_t *pnp,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   449
    int flags, vnode_t *rdir, cred_t *cr, caller_context_t *ct,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   450
    int *direntflags, pathname_t *realpnp)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   451
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   452
	zfsvfs_t *zfsvfs = dvp->v_vfsp->vfs_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   453
	int err;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   454
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   455
	/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   456
	 * No extended attributes allowed under .zfs
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   457
	 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   458
	if (flags & LOOKUP_XATTR)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   459
		return (EINVAL);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   460
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   461
	ZFS_ENTER(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   462
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   463
	if (strcmp(nm, "..") == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   464
		err = VFS_ROOT(dvp->v_vfsp, vpp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   465
	} else {
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   466
		err = gfs_vop_lookup(dvp, nm, vpp, pnp, flags, rdir,
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   467
		    cr, ct, direntflags, realpnp);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   468
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   469
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   470
	ZFS_EXIT(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   471
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   472
	return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   473
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   474
8547
bcc7b46e5ff7 6792884 Vista clients cannot access .zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7229
diff changeset
   475
static int
bcc7b46e5ff7 6792884 Vista clients cannot access .zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7229
diff changeset
   476
zfsctl_pathconf(vnode_t *vp, int cmd, ulong_t *valp, cred_t *cr,
bcc7b46e5ff7 6792884 Vista clients cannot access .zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7229
diff changeset
   477
    caller_context_t *ct)
bcc7b46e5ff7 6792884 Vista clients cannot access .zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7229
diff changeset
   478
{
bcc7b46e5ff7 6792884 Vista clients cannot access .zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7229
diff changeset
   479
	/*
bcc7b46e5ff7 6792884 Vista clients cannot access .zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7229
diff changeset
   480
	 * We only care about ACL_ENABLED so that libsec can
bcc7b46e5ff7 6792884 Vista clients cannot access .zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7229
diff changeset
   481
	 * display ACL correctly and not default to POSIX draft.
bcc7b46e5ff7 6792884 Vista clients cannot access .zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7229
diff changeset
   482
	 */
bcc7b46e5ff7 6792884 Vista clients cannot access .zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7229
diff changeset
   483
	if (cmd == _PC_ACL_ENABLED) {
bcc7b46e5ff7 6792884 Vista clients cannot access .zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7229
diff changeset
   484
		*valp = _ACL_ACE_ENABLED;
bcc7b46e5ff7 6792884 Vista clients cannot access .zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7229
diff changeset
   485
		return (0);
bcc7b46e5ff7 6792884 Vista clients cannot access .zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7229
diff changeset
   486
	}
bcc7b46e5ff7 6792884 Vista clients cannot access .zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7229
diff changeset
   487
bcc7b46e5ff7 6792884 Vista clients cannot access .zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7229
diff changeset
   488
	return (fs_pathconf(vp, cmd, valp, cr, ct));
bcc7b46e5ff7 6792884 Vista clients cannot access .zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7229
diff changeset
   489
}
bcc7b46e5ff7 6792884 Vista clients cannot access .zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7229
diff changeset
   490
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   491
static const fs_operation_def_t zfsctl_tops_root[] = {
3898
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2676
diff changeset
   492
	{ VOPNAME_OPEN,		{ .vop_open = zfsctl_common_open }	},
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2676
diff changeset
   493
	{ VOPNAME_CLOSE,	{ .vop_close = zfsctl_common_close }	},
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2676
diff changeset
   494
	{ VOPNAME_IOCTL,	{ .error = fs_inval }			},
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2676
diff changeset
   495
	{ VOPNAME_GETATTR,	{ .vop_getattr = zfsctl_root_getattr }	},
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2676
diff changeset
   496
	{ VOPNAME_ACCESS,	{ .vop_access = zfsctl_common_access }	},
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2676
diff changeset
   497
	{ VOPNAME_READDIR,	{ .vop_readdir = gfs_vop_readdir } 	},
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2676
diff changeset
   498
	{ VOPNAME_LOOKUP,	{ .vop_lookup = zfsctl_root_lookup }	},
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2676
diff changeset
   499
	{ VOPNAME_SEEK,		{ .vop_seek = fs_seek }			},
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2676
diff changeset
   500
	{ VOPNAME_INACTIVE,	{ .vop_inactive = gfs_vop_inactive }	},
8547
bcc7b46e5ff7 6792884 Vista clients cannot access .zfs
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7229
diff changeset
   501
	{ VOPNAME_PATHCONF,	{ .vop_pathconf = zfsctl_pathconf }	},
3898
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2676
diff changeset
   502
	{ VOPNAME_FID,		{ .vop_fid = zfsctl_common_fid	}	},
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   503
	{ NULL }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   504
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   505
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   506
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   507
zfsctl_snapshot_zname(vnode_t *vp, const char *name, int len, char *zname)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   508
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   509
	objset_t *os = ((zfsvfs_t *)((vp)->v_vfsp->vfs_data))->z_os;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   510
6658
468e12a53baf 6700649 zfs_ctldir snapshot creation issues with CIFS clients
marks
parents: 6492
diff changeset
   511
	if (snapshot_namecheck(name, NULL, NULL) != 0)
468e12a53baf 6700649 zfs_ctldir snapshot creation issues with CIFS clients
marks
parents: 6492
diff changeset
   512
		return (EILSEQ);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   513
	dmu_objset_name(os, zname);
1154
08f3f98286fe 6359739 panic in zfsctl_snapshot_zname()
maybee
parents: 816
diff changeset
   514
	if (strlen(zname) + 1 + strlen(name) >= len)
08f3f98286fe 6359739 panic in zfsctl_snapshot_zname()
maybee
parents: 816
diff changeset
   515
		return (ENAMETOOLONG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   516
	(void) strcat(zname, "@");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   517
	(void) strcat(zname, name);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   518
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   519
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   520
6068
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   521
static int
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   522
zfsctl_unmount_snap(zfs_snapentry_t *sep, int fflags, cred_t *cr)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   523
{
6068
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   524
	vnode_t *svp = sep->se_root;
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   525
	int error;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   526
6068
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   527
	ASSERT(vn_ismntpt(svp));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   528
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   529
	/* this will be dropped by dounmount() */
6068
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   530
	if ((error = vn_vfswlock(svp)) != 0)
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   531
		return (error);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   532
6068
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   533
	VN_HOLD(svp);
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   534
	error = dounmount(vn_mountedvfs(svp), fflags, cr);
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   535
	if (error) {
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   536
		VN_RELE(svp);
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   537
		return (error);
1589
64c230a17c47 6395526 assertion failed: refcount_count(&ab->b_refcnt) == 1 (0x2 == 0x1)
maybee
parents: 1572
diff changeset
   538
	}
9214
8d350e5d04aa 6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents: 9030
diff changeset
   539
6068
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   540
	/*
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   541
	 * We can't use VN_RELE(), as that will try to invoke
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   542
	 * zfsctl_snapdir_inactive(), which would cause us to destroy
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   543
	 * the sd_lock mutex held by our caller.
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   544
	 */
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   545
	ASSERT(svp->v_count == 1);
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   546
	gfs_vop_inactive(svp, cr, NULL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   547
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   548
	kmem_free(sep->se_name, strlen(sep->se_name) + 1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   549
	kmem_free(sep, sizeof (zfs_snapentry_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   550
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   551
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   552
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   553
1154
08f3f98286fe 6359739 panic in zfsctl_snapshot_zname()
maybee
parents: 816
diff changeset
   554
static void
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   555
zfsctl_rename_snap(zfsctl_snapdir_t *sdp, zfs_snapentry_t *sep, const char *nm)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   556
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   557
	avl_index_t where;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   558
	vfs_t *vfsp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   559
	refstr_t *pathref;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   560
	char newpath[MAXNAMELEN];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   561
	char *tail;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   562
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   563
	ASSERT(MUTEX_HELD(&sdp->sd_lock));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   564
	ASSERT(sep != NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   565
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   566
	vfsp = vn_mountedvfs(sep->se_root);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   567
	ASSERT(vfsp != NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   568
1154
08f3f98286fe 6359739 panic in zfsctl_snapshot_zname()
maybee
parents: 816
diff changeset
   569
	vfs_lock_wait(vfsp);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   570
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   571
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   572
	 * Change the name in the AVL tree.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   573
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   574
	avl_remove(&sdp->sd_snaps, sep);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   575
	kmem_free(sep->se_name, strlen(sep->se_name) + 1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   576
	sep->se_name = kmem_alloc(strlen(nm) + 1, KM_SLEEP);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   577
	(void) strcpy(sep->se_name, nm);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   578
	VERIFY(avl_find(&sdp->sd_snaps, sep, &where) == NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   579
	avl_insert(&sdp->sd_snaps, sep, where);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   580
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   581
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   582
	 * Change the current mountpoint info:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   583
	 * 	- update the tail of the mntpoint path
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   584
	 *	- update the tail of the resource path
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   585
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   586
	pathref = vfs_getmntpoint(vfsp);
2417
694d5de97348 6444346 zfs promote fails in zone
ahrens
parents: 1589
diff changeset
   587
	(void) strncpy(newpath, refstr_value(pathref), sizeof (newpath));
694d5de97348 6444346 zfs promote fails in zone
ahrens
parents: 1589
diff changeset
   588
	VERIFY((tail = strrchr(newpath, '/')) != NULL);
694d5de97348 6444346 zfs promote fails in zone
ahrens
parents: 1589
diff changeset
   589
	*(tail+1) = '\0';
694d5de97348 6444346 zfs promote fails in zone
ahrens
parents: 1589
diff changeset
   590
	ASSERT3U(strlen(newpath) + strlen(nm), <, sizeof (newpath));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   591
	(void) strcat(newpath, nm);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   592
	refstr_rele(pathref);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   593
	vfs_setmntpoint(vfsp, newpath);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   594
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   595
	pathref = vfs_getresource(vfsp);
2417
694d5de97348 6444346 zfs promote fails in zone
ahrens
parents: 1589
diff changeset
   596
	(void) strncpy(newpath, refstr_value(pathref), sizeof (newpath));
694d5de97348 6444346 zfs promote fails in zone
ahrens
parents: 1589
diff changeset
   597
	VERIFY((tail = strrchr(newpath, '@')) != NULL);
694d5de97348 6444346 zfs promote fails in zone
ahrens
parents: 1589
diff changeset
   598
	*(tail+1) = '\0';
694d5de97348 6444346 zfs promote fails in zone
ahrens
parents: 1589
diff changeset
   599
	ASSERT3U(strlen(newpath) + strlen(nm), <, sizeof (newpath));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   600
	(void) strcat(newpath, nm);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   601
	refstr_rele(pathref);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   602
	vfs_setresource(vfsp, newpath);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   603
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   604
	vfs_unlock(vfsp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   605
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   606
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   607
/*ARGSUSED*/
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   608
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   609
zfsctl_snapdir_rename(vnode_t *sdvp, char *snm, vnode_t *tdvp, char *tnm,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   610
    cred_t *cr, caller_context_t *ct, int flags)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   611
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   612
	zfsctl_snapdir_t *sdp = sdvp->v_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   613
	zfs_snapentry_t search, *sep;
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   614
	zfsvfs_t *zfsvfs;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   615
	avl_index_t where;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   616
	char from[MAXNAMELEN], to[MAXNAMELEN];
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   617
	char real[MAXNAMELEN];
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   618
	int err;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   619
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   620
	zfsvfs = sdvp->v_vfsp->vfs_data;
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   621
	ZFS_ENTER(zfsvfs);
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   622
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   623
	if ((flags & FIGNORECASE) || zfsvfs->z_case == ZFS_CASE_INSENSITIVE) {
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   624
		err = dmu_snapshot_realname(zfsvfs->z_os, snm, real,
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   625
		    MAXNAMELEN, NULL);
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   626
		if (err == 0) {
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   627
			snm = real;
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   628
		} else if (err != ENOTSUP) {
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   629
			ZFS_EXIT(zfsvfs);
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   630
			return (err);
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   631
		}
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   632
	}
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   633
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   634
	ZFS_EXIT(zfsvfs);
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   635
1154
08f3f98286fe 6359739 panic in zfsctl_snapshot_zname()
maybee
parents: 816
diff changeset
   636
	err = zfsctl_snapshot_zname(sdvp, snm, MAXNAMELEN, from);
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   637
	if (!err)
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   638
		err = zfsctl_snapshot_zname(tdvp, tnm, MAXNAMELEN, to);
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   639
	if (!err)
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   640
		err = zfs_secpolicy_rename_perms(from, to, cr);
1154
08f3f98286fe 6359739 panic in zfsctl_snapshot_zname()
maybee
parents: 816
diff changeset
   641
	if (err)
08f3f98286fe 6359739 panic in zfsctl_snapshot_zname()
maybee
parents: 816
diff changeset
   642
		return (err);
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   643
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   644
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   645
	 * Cannot move snapshots out of the snapdir.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   646
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   647
	if (sdvp != tdvp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   648
		return (EINVAL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   649
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   650
	if (strcmp(snm, tnm) == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   651
		return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   652
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   653
	mutex_enter(&sdp->sd_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   654
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   655
	search.se_name = (char *)snm;
1154
08f3f98286fe 6359739 panic in zfsctl_snapshot_zname()
maybee
parents: 816
diff changeset
   656
	if ((sep = avl_find(&sdp->sd_snaps, &search, &where)) == NULL) {
08f3f98286fe 6359739 panic in zfsctl_snapshot_zname()
maybee
parents: 816
diff changeset
   657
		mutex_exit(&sdp->sd_lock);
08f3f98286fe 6359739 panic in zfsctl_snapshot_zname()
maybee
parents: 816
diff changeset
   658
		return (ENOENT);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   659
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   660
4007
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3898
diff changeset
   661
	err = dmu_objset_rename(from, to, B_FALSE);
1154
08f3f98286fe 6359739 panic in zfsctl_snapshot_zname()
maybee
parents: 816
diff changeset
   662
	if (err == 0)
08f3f98286fe 6359739 panic in zfsctl_snapshot_zname()
maybee
parents: 816
diff changeset
   663
		zfsctl_rename_snap(sdp, sep, tnm);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   664
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   665
	mutex_exit(&sdp->sd_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   666
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   667
	return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   668
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   669
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   670
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   671
static int
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   672
zfsctl_snapdir_remove(vnode_t *dvp, char *name, vnode_t *cwd, cred_t *cr,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   673
    caller_context_t *ct, int flags)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   674
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   675
	zfsctl_snapdir_t *sdp = dvp->v_data;
6068
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   676
	zfs_snapentry_t *sep;
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   677
	zfs_snapentry_t search;
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   678
	zfsvfs_t *zfsvfs;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   679
	char snapname[MAXNAMELEN];
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   680
	char real[MAXNAMELEN];
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   681
	int err;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   682
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   683
	zfsvfs = dvp->v_vfsp->vfs_data;
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   684
	ZFS_ENTER(zfsvfs);
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   685
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   686
	if ((flags & FIGNORECASE) || zfsvfs->z_case == ZFS_CASE_INSENSITIVE) {
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   687
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   688
		err = dmu_snapshot_realname(zfsvfs->z_os, name, real,
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   689
		    MAXNAMELEN, NULL);
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   690
		if (err == 0) {
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   691
			name = real;
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   692
		} else if (err != ENOTSUP) {
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   693
			ZFS_EXIT(zfsvfs);
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   694
			return (err);
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   695
		}
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   696
	}
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   697
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   698
	ZFS_EXIT(zfsvfs);
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   699
1154
08f3f98286fe 6359739 panic in zfsctl_snapshot_zname()
maybee
parents: 816
diff changeset
   700
	err = zfsctl_snapshot_zname(dvp, name, MAXNAMELEN, snapname);
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   701
	if (!err)
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   702
		err = zfs_secpolicy_destroy_perms(snapname, cr);
1154
08f3f98286fe 6359739 panic in zfsctl_snapshot_zname()
maybee
parents: 816
diff changeset
   703
	if (err)
08f3f98286fe 6359739 panic in zfsctl_snapshot_zname()
maybee
parents: 816
diff changeset
   704
		return (err);
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   705
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   706
	mutex_enter(&sdp->sd_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   707
6068
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   708
	search.se_name = name;
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   709
	sep = avl_find(&sdp->sd_snaps, &search, NULL);
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   710
	if (sep) {
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   711
		avl_remove(&sdp->sd_snaps, sep);
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   712
		err = zfsctl_unmount_snap(sep, MS_FORCE, cr);
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   713
		if (err)
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   714
			avl_add(&sdp->sd_snaps, sep);
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   715
		else
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 9355
diff changeset
   716
			err = dmu_objset_destroy(snapname, B_FALSE);
6068
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   717
	} else {
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   718
		err = ENOENT;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   719
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   720
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   721
	mutex_exit(&sdp->sd_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   722
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   723
	return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   724
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   725
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
   726
/*
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
   727
 * This creates a snapshot under '.zfs/snapshot'.
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
   728
 */
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   729
/* ARGSUSED */
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   730
static int
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   731
zfsctl_snapdir_mkdir(vnode_t *dvp, char *dirname, vattr_t *vap, vnode_t  **vpp,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   732
    cred_t *cr, caller_context_t *cc, int flags, vsecattr_t *vsecp)
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   733
{
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   734
	zfsvfs_t *zfsvfs = dvp->v_vfsp->vfs_data;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   735
	char name[MAXNAMELEN];
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   736
	int err;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   737
	static enum symfollow follow = NO_FOLLOW;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   738
	static enum uio_seg seg = UIO_SYSSPACE;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   739
6658
468e12a53baf 6700649 zfs_ctldir snapshot creation issues with CIFS clients
marks
parents: 6492
diff changeset
   740
	if (snapshot_namecheck(dirname, NULL, NULL) != 0)
468e12a53baf 6700649 zfs_ctldir snapshot creation issues with CIFS clients
marks
parents: 6492
diff changeset
   741
		return (EILSEQ);
468e12a53baf 6700649 zfs_ctldir snapshot creation issues with CIFS clients
marks
parents: 6492
diff changeset
   742
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   743
	dmu_objset_name(zfsvfs->z_os, name);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   744
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   745
	*vpp = NULL;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   746
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   747
	err = zfs_secpolicy_snapshot_perms(name, cr);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   748
	if (err)
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   749
		return (err);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   750
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   751
	if (err == 0) {
9355
09928982c591 6818183 zfs snapshot -r is slow due to set_snap_props() doing txg_wait_synced() for each new snapshot
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9214
diff changeset
   752
		err = dmu_objset_snapshot(name, dirname, NULL, B_FALSE);
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   753
		if (err)
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   754
			return (err);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   755
		err = lookupnameat(dirname, seg, follow, NULL, vpp, dvp);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   756
	}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   757
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   758
	return (err);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   759
}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
   760
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   761
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   762
 * Lookup entry point for the 'snapshot' directory.  Try to open the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   763
 * snapshot if it exist, creating the pseudo filesystem vnode as necessary.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   764
 * Perform a mount of the associated dataset on top of the vnode.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   765
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   766
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   767
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   768
zfsctl_snapdir_lookup(vnode_t *dvp, char *nm, vnode_t **vpp, pathname_t *pnp,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   769
    int flags, vnode_t *rdir, cred_t *cr, caller_context_t *ct,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   770
    int *direntflags, pathname_t *realpnp)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   771
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   772
	zfsctl_snapdir_t *sdp = dvp->v_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   773
	objset_t *snap;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   774
	char snapname[MAXNAMELEN];
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   775
	char real[MAXNAMELEN];
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   776
	char *mountpoint;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   777
	zfs_snapentry_t *sep, search;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   778
	struct mounta margs;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   779
	vfs_t *vfsp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   780
	size_t mountpoint_len;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   781
	avl_index_t where;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   782
	zfsvfs_t *zfsvfs = dvp->v_vfsp->vfs_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   783
	int err;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   784
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   785
	/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   786
	 * No extended attributes allowed under .zfs
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   787
	 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   788
	if (flags & LOOKUP_XATTR)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   789
		return (EINVAL);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   790
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   791
	ASSERT(dvp->v_type == VDIR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   792
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   793
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   794
	 * If we get a recursive call, that means we got called
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   795
	 * from the domount() code while it was trying to look up the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   796
	 * spec (which looks like a local path for zfs).  We need to
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   797
	 * add some flag to domount() to tell it not to do this lookup.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   798
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   799
	if (MUTEX_HELD(&sdp->sd_lock))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   800
		return (ENOENT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   801
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   802
	ZFS_ENTER(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   803
9214
8d350e5d04aa 6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents: 9030
diff changeset
   804
	if (gfs_lookup_dot(vpp, dvp, zfsvfs->z_ctldir, nm) == 0) {
8d350e5d04aa 6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents: 9030
diff changeset
   805
		ZFS_EXIT(zfsvfs);
8d350e5d04aa 6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents: 9030
diff changeset
   806
		return (0);
8d350e5d04aa 6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents: 9030
diff changeset
   807
	}
8d350e5d04aa 6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents: 9030
diff changeset
   808
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   809
	if (flags & FIGNORECASE) {
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   810
		boolean_t conflict = B_FALSE;
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   811
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   812
		err = dmu_snapshot_realname(zfsvfs->z_os, nm, real,
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   813
		    MAXNAMELEN, &conflict);
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   814
		if (err == 0) {
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   815
			nm = real;
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   816
		} else if (err != ENOTSUP) {
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   817
			ZFS_EXIT(zfsvfs);
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   818
			return (err);
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   819
		}
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   820
		if (realpnp)
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   821
			(void) strlcpy(realpnp->pn_buf, nm,
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   822
			    realpnp->pn_bufsize);
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   823
		if (conflict && direntflags)
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   824
			*direntflags = ED_CASE_CONFLICT;
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   825
	}
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
   826
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   827
	mutex_enter(&sdp->sd_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   828
	search.se_name = (char *)nm;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   829
	if ((sep = avl_find(&sdp->sd_snaps, &search, &where)) != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   830
		*vpp = sep->se_root;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   831
		VN_HOLD(*vpp);
1589
64c230a17c47 6395526 assertion failed: refcount_count(&ab->b_refcnt) == 1 (0x2 == 0x1)
maybee
parents: 1572
diff changeset
   832
		err = traverse(vpp);
64c230a17c47 6395526 assertion failed: refcount_count(&ab->b_refcnt) == 1 (0x2 == 0x1)
maybee
parents: 1572
diff changeset
   833
		if (err) {
64c230a17c47 6395526 assertion failed: refcount_count(&ab->b_refcnt) == 1 (0x2 == 0x1)
maybee
parents: 1572
diff changeset
   834
			VN_RELE(*vpp);
64c230a17c47 6395526 assertion failed: refcount_count(&ab->b_refcnt) == 1 (0x2 == 0x1)
maybee
parents: 1572
diff changeset
   835
			*vpp = NULL;
64c230a17c47 6395526 assertion failed: refcount_count(&ab->b_refcnt) == 1 (0x2 == 0x1)
maybee
parents: 1572
diff changeset
   836
		} else if (*vpp == sep->se_root) {
64c230a17c47 6395526 assertion failed: refcount_count(&ab->b_refcnt) == 1 (0x2 == 0x1)
maybee
parents: 1572
diff changeset
   837
			/*
64c230a17c47 6395526 assertion failed: refcount_count(&ab->b_refcnt) == 1 (0x2 == 0x1)
maybee
parents: 1572
diff changeset
   838
			 * The snapshot was unmounted behind our backs,
64c230a17c47 6395526 assertion failed: refcount_count(&ab->b_refcnt) == 1 (0x2 == 0x1)
maybee
parents: 1572
diff changeset
   839
			 * try to remount it.
64c230a17c47 6395526 assertion failed: refcount_count(&ab->b_refcnt) == 1 (0x2 == 0x1)
maybee
parents: 1572
diff changeset
   840
			 */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   841
			goto domount;
6068
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   842
		} else {
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   843
			/*
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   844
			 * VROOT was set during the traverse call.  We need
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   845
			 * to clear it since we're pretending to be part
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   846
			 * of our parent's vfs.
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   847
			 */
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
   848
			(*vpp)->v_flag &= ~VROOT;
1566
93e41df9efa5 6355162 'zfs restore -d' should not succeed upon a volume
maybee
parents: 1512
diff changeset
   849
		}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   850
		mutex_exit(&sdp->sd_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   851
		ZFS_EXIT(zfsvfs);
1589
64c230a17c47 6395526 assertion failed: refcount_count(&ab->b_refcnt) == 1 (0x2 == 0x1)
maybee
parents: 1572
diff changeset
   852
		return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   853
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   854
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   855
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   856
	 * The requested snapshot is not currently mounted, look it up.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   857
	 */
1154
08f3f98286fe 6359739 panic in zfsctl_snapshot_zname()
maybee
parents: 816
diff changeset
   858
	err = zfsctl_snapshot_zname(dvp, nm, MAXNAMELEN, snapname);
08f3f98286fe 6359739 panic in zfsctl_snapshot_zname()
maybee
parents: 816
diff changeset
   859
	if (err) {
08f3f98286fe 6359739 panic in zfsctl_snapshot_zname()
maybee
parents: 816
diff changeset
   860
		mutex_exit(&sdp->sd_lock);
08f3f98286fe 6359739 panic in zfsctl_snapshot_zname()
maybee
parents: 816
diff changeset
   861
		ZFS_EXIT(zfsvfs);
7229
7836e02dc984 6731778 'ls *' in empty zfs snapshot directory returns EILSEQ vs. ENOENT we get in other empty directories
marks
parents: 6689
diff changeset
   862
		/*
7836e02dc984 6731778 'ls *' in empty zfs snapshot directory returns EILSEQ vs. ENOENT we get in other empty directories
marks
parents: 6689
diff changeset
   863
		 * handle "ls *" or "?" in a graceful manner,
7836e02dc984 6731778 'ls *' in empty zfs snapshot directory returns EILSEQ vs. ENOENT we get in other empty directories
marks
parents: 6689
diff changeset
   864
		 * forcing EILSEQ to ENOENT.
7836e02dc984 6731778 'ls *' in empty zfs snapshot directory returns EILSEQ vs. ENOENT we get in other empty directories
marks
parents: 6689
diff changeset
   865
		 * Since shell ultimately passes "*" or "?" as name to lookup
7836e02dc984 6731778 'ls *' in empty zfs snapshot directory returns EILSEQ vs. ENOENT we get in other empty directories
marks
parents: 6689
diff changeset
   866
		 */
7836e02dc984 6731778 'ls *' in empty zfs snapshot directory returns EILSEQ vs. ENOENT we get in other empty directories
marks
parents: 6689
diff changeset
   867
		return (err == EILSEQ ? ENOENT : err);
1154
08f3f98286fe 6359739 panic in zfsctl_snapshot_zname()
maybee
parents: 816
diff changeset
   868
	}
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10242
diff changeset
   869
	if (dmu_objset_hold(snapname, FTAG, &snap) != 0) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   870
		mutex_exit(&sdp->sd_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   871
		ZFS_EXIT(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   872
		return (ENOENT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   873
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   874
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   875
	sep = kmem_alloc(sizeof (zfs_snapentry_t), KM_SLEEP);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   876
	sep->se_name = kmem_alloc(strlen(nm) + 1, KM_SLEEP);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   877
	(void) strcpy(sep->se_name, nm);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   878
	*vpp = sep->se_root = zfsctl_snapshot_mknode(dvp, dmu_objset_id(snap));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   879
	avl_insert(&sdp->sd_snaps, sep, where);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   880
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10242
diff changeset
   881
	dmu_objset_rele(snap, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   882
domount:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   883
	mountpoint_len = strlen(refstr_value(dvp->v_vfsp->vfs_mntpt)) +
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   884
	    strlen("/.zfs/snapshot/") + strlen(nm) + 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   885
	mountpoint = kmem_alloc(mountpoint_len, KM_SLEEP);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   886
	(void) snprintf(mountpoint, mountpoint_len, "%s/.zfs/snapshot/%s",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   887
	    refstr_value(dvp->v_vfsp->vfs_mntpt), nm);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   888
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   889
	margs.spec = snapname;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   890
	margs.dir = mountpoint;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   891
	margs.flags = MS_SYSSPACE | MS_NOMNTTAB;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   892
	margs.fstype = "zfs";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   893
	margs.dataptr = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   894
	margs.datalen = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   895
	margs.optptr = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   896
	margs.optlen = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   897
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   898
	err = domount("zfs", &margs, *vpp, kcred, &vfsp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   899
	kmem_free(mountpoint, mountpoint_len);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   900
816
4a2d51f7b961 6344201 Assertion failed: err == 0 (0x1 == 0x0), file: ../../common/fs/zfs/zfs_ctldir.c, line: 659
maybee
parents: 789
diff changeset
   901
	if (err == 0) {
4a2d51f7b961 6344201 Assertion failed: err == 0 (0x1 == 0x0), file: ../../common/fs/zfs/zfs_ctldir.c, line: 659
maybee
parents: 789
diff changeset
   902
		/*
4a2d51f7b961 6344201 Assertion failed: err == 0 (0x1 == 0x0), file: ../../common/fs/zfs/zfs_ctldir.c, line: 659
maybee
parents: 789
diff changeset
   903
		 * Return the mounted root rather than the covered mount point.
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
   904
		 * Takes the GFS vnode at .zfs/snapshot/<snapname> and returns
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
   905
		 * the ZFS vnode mounted on top of the GFS node.  This ZFS
9214
8d350e5d04aa 6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents: 9030
diff changeset
   906
		 * vnode is the root of the newly created vfsp.
816
4a2d51f7b961 6344201 Assertion failed: err == 0 (0x1 == 0x0), file: ../../common/fs/zfs/zfs_ctldir.c, line: 659
maybee
parents: 789
diff changeset
   907
		 */
4a2d51f7b961 6344201 Assertion failed: err == 0 (0x1 == 0x0), file: ../../common/fs/zfs/zfs_ctldir.c, line: 659
maybee
parents: 789
diff changeset
   908
		VFS_RELE(vfsp);
4a2d51f7b961 6344201 Assertion failed: err == 0 (0x1 == 0x0), file: ../../common/fs/zfs/zfs_ctldir.c, line: 659
maybee
parents: 789
diff changeset
   909
		err = traverse(vpp);
4a2d51f7b961 6344201 Assertion failed: err == 0 (0x1 == 0x0), file: ../../common/fs/zfs/zfs_ctldir.c, line: 659
maybee
parents: 789
diff changeset
   910
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   911
816
4a2d51f7b961 6344201 Assertion failed: err == 0 (0x1 == 0x0), file: ../../common/fs/zfs/zfs_ctldir.c, line: 659
maybee
parents: 789
diff changeset
   912
	if (err == 0) {
4a2d51f7b961 6344201 Assertion failed: err == 0 (0x1 == 0x0), file: ../../common/fs/zfs/zfs_ctldir.c, line: 659
maybee
parents: 789
diff changeset
   913
		/*
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
   914
		 * Fix up the root vnode mounted on .zfs/snapshot/<snapname>.
4736
f8714efb3e12 6509628 unmount of a snapshot (from 'zfs destroy') is slow
ek110237
parents: 4543
diff changeset
   915
		 *
f8714efb3e12 6509628 unmount of a snapshot (from 'zfs destroy') is slow
ek110237
parents: 4543
diff changeset
   916
		 * This is where we lie about our v_vfsp in order to
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
   917
		 * make .zfs/snapshot/<snapname> accessible over NFS
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
   918
		 * without requiring manual mounts of <snapname>.
816
4a2d51f7b961 6344201 Assertion failed: err == 0 (0x1 == 0x0), file: ../../common/fs/zfs/zfs_ctldir.c, line: 659
maybee
parents: 789
diff changeset
   919
		 */
4a2d51f7b961 6344201 Assertion failed: err == 0 (0x1 == 0x0), file: ../../common/fs/zfs/zfs_ctldir.c, line: 659
maybee
parents: 789
diff changeset
   920
		ASSERT(VTOZ(*vpp)->z_zfsvfs != zfsvfs);
4a2d51f7b961 6344201 Assertion failed: err == 0 (0x1 == 0x0), file: ../../common/fs/zfs/zfs_ctldir.c, line: 659
maybee
parents: 789
diff changeset
   921
		VTOZ(*vpp)->z_zfsvfs->z_parent = zfsvfs;
4a2d51f7b961 6344201 Assertion failed: err == 0 (0x1 == 0x0), file: ../../common/fs/zfs/zfs_ctldir.c, line: 659
maybee
parents: 789
diff changeset
   922
		(*vpp)->v_vfsp = zfsvfs->z_vfs;
4a2d51f7b961 6344201 Assertion failed: err == 0 (0x1 == 0x0), file: ../../common/fs/zfs/zfs_ctldir.c, line: 659
maybee
parents: 789
diff changeset
   923
		(*vpp)->v_flag &= ~VROOT;
4a2d51f7b961 6344201 Assertion failed: err == 0 (0x1 == 0x0), file: ../../common/fs/zfs/zfs_ctldir.c, line: 659
maybee
parents: 789
diff changeset
   924
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   925
	mutex_exit(&sdp->sd_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   926
	ZFS_EXIT(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   927
1566
93e41df9efa5 6355162 'zfs restore -d' should not succeed upon a volume
maybee
parents: 1512
diff changeset
   928
	/*
93e41df9efa5 6355162 'zfs restore -d' should not succeed upon a volume
maybee
parents: 1512
diff changeset
   929
	 * If we had an error, drop our hold on the vnode and
93e41df9efa5 6355162 'zfs restore -d' should not succeed upon a volume
maybee
parents: 1512
diff changeset
   930
	 * zfsctl_snapshot_inactive() will clean up.
93e41df9efa5 6355162 'zfs restore -d' should not succeed upon a volume
maybee
parents: 1512
diff changeset
   931
	 */
93e41df9efa5 6355162 'zfs restore -d' should not succeed upon a volume
maybee
parents: 1512
diff changeset
   932
	if (err) {
816
4a2d51f7b961 6344201 Assertion failed: err == 0 (0x1 == 0x0), file: ../../common/fs/zfs/zfs_ctldir.c, line: 659
maybee
parents: 789
diff changeset
   933
		VN_RELE(*vpp);
1566
93e41df9efa5 6355162 'zfs restore -d' should not succeed upon a volume
maybee
parents: 1512
diff changeset
   934
		*vpp = NULL;
93e41df9efa5 6355162 'zfs restore -d' should not succeed upon a volume
maybee
parents: 1512
diff changeset
   935
	}
816
4a2d51f7b961 6344201 Assertion failed: err == 0 (0x1 == 0x0), file: ../../common/fs/zfs/zfs_ctldir.c, line: 659
maybee
parents: 789
diff changeset
   936
	return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   937
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   938
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   939
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   940
static int
8845
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   941
zfsctl_shares_lookup(vnode_t *dvp, char *nm, vnode_t **vpp, pathname_t *pnp,
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   942
    int flags, vnode_t *rdir, cred_t *cr, caller_context_t *ct,
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   943
    int *direntflags, pathname_t *realpnp)
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   944
{
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   945
	zfsvfs_t *zfsvfs = dvp->v_vfsp->vfs_data;
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   946
	znode_t *dzp;
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   947
	int error;
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   948
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   949
	ZFS_ENTER(zfsvfs);
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   950
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   951
	if (gfs_lookup_dot(vpp, dvp, zfsvfs->z_ctldir, nm) == 0) {
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   952
		ZFS_EXIT(zfsvfs);
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   953
		return (0);
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   954
	}
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   955
9030
243fd360d81f 6815893 hang mounting a dataset after booting into a new boot environment
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8845
diff changeset
   956
	if (zfsvfs->z_shares_dir == 0) {
243fd360d81f 6815893 hang mounting a dataset after booting into a new boot environment
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8845
diff changeset
   957
		ZFS_EXIT(zfsvfs);
243fd360d81f 6815893 hang mounting a dataset after booting into a new boot environment
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8845
diff changeset
   958
		return (ENOTSUP);
243fd360d81f 6815893 hang mounting a dataset after booting into a new boot environment
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8845
diff changeset
   959
	}
8845
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   960
	if ((error = zfs_zget(zfsvfs, zfsvfs->z_shares_dir, &dzp)) == 0)
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   961
		error = VOP_LOOKUP(ZTOV(dzp), nm, vpp, pnp,
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   962
		    flags, rdir, cr, ct, direntflags, realpnp);
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   963
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   964
	VN_RELE(ZTOV(dzp));
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   965
	ZFS_EXIT(zfsvfs);
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   966
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   967
	return (error);
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   968
}
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   969
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   970
/* ARGSUSED */
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
   971
static int
5663
029cc4273b57 6627223 gfs needs to support extended dirent flags
ck153898
parents: 5331
diff changeset
   972
zfsctl_snapdir_readdir_cb(vnode_t *vp, void *dp, int *eofp,
029cc4273b57 6627223 gfs needs to support extended dirent flags
ck153898
parents: 5331
diff changeset
   973
    offset_t *offp, offset_t *nextp, void *data, int flags)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   974
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   975
	zfsvfs_t *zfsvfs = vp->v_vfsp->vfs_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   976
	char snapname[MAXNAMELEN];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   977
	uint64_t id, cookie;
5663
029cc4273b57 6627223 gfs needs to support extended dirent flags
ck153898
parents: 5331
diff changeset
   978
	boolean_t case_conflict;
029cc4273b57 6627223 gfs needs to support extended dirent flags
ck153898
parents: 5331
diff changeset
   979
	int error;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   980
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   981
	ZFS_ENTER(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   982
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   983
	cookie = *offp;
5663
029cc4273b57 6627223 gfs needs to support extended dirent flags
ck153898
parents: 5331
diff changeset
   984
	error = dmu_snapshot_list_next(zfsvfs->z_os, MAXNAMELEN, snapname, &id,
029cc4273b57 6627223 gfs needs to support extended dirent flags
ck153898
parents: 5331
diff changeset
   985
	    &cookie, &case_conflict);
029cc4273b57 6627223 gfs needs to support extended dirent flags
ck153898
parents: 5331
diff changeset
   986
	if (error) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   987
		ZFS_EXIT(zfsvfs);
5663
029cc4273b57 6627223 gfs needs to support extended dirent flags
ck153898
parents: 5331
diff changeset
   988
		if (error == ENOENT) {
029cc4273b57 6627223 gfs needs to support extended dirent flags
ck153898
parents: 5331
diff changeset
   989
			*eofp = 1;
029cc4273b57 6627223 gfs needs to support extended dirent flags
ck153898
parents: 5331
diff changeset
   990
			return (0);
029cc4273b57 6627223 gfs needs to support extended dirent flags
ck153898
parents: 5331
diff changeset
   991
		}
029cc4273b57 6627223 gfs needs to support extended dirent flags
ck153898
parents: 5331
diff changeset
   992
		return (error);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   993
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   994
5663
029cc4273b57 6627223 gfs needs to support extended dirent flags
ck153898
parents: 5331
diff changeset
   995
	if (flags & V_RDDIR_ENTFLAGS) {
029cc4273b57 6627223 gfs needs to support extended dirent flags
ck153898
parents: 5331
diff changeset
   996
		edirent_t *eodp = dp;
029cc4273b57 6627223 gfs needs to support extended dirent flags
ck153898
parents: 5331
diff changeset
   997
029cc4273b57 6627223 gfs needs to support extended dirent flags
ck153898
parents: 5331
diff changeset
   998
		(void) strcpy(eodp->ed_name, snapname);
029cc4273b57 6627223 gfs needs to support extended dirent flags
ck153898
parents: 5331
diff changeset
   999
		eodp->ed_ino = ZFSCTL_INO_SNAP(id);
029cc4273b57 6627223 gfs needs to support extended dirent flags
ck153898
parents: 5331
diff changeset
  1000
		eodp->ed_eflags = case_conflict ? ED_CASE_CONFLICT : 0;
029cc4273b57 6627223 gfs needs to support extended dirent flags
ck153898
parents: 5331
diff changeset
  1001
	} else {
029cc4273b57 6627223 gfs needs to support extended dirent flags
ck153898
parents: 5331
diff changeset
  1002
		struct dirent64 *odp = dp;
029cc4273b57 6627223 gfs needs to support extended dirent flags
ck153898
parents: 5331
diff changeset
  1003
029cc4273b57 6627223 gfs needs to support extended dirent flags
ck153898
parents: 5331
diff changeset
  1004
		(void) strcpy(odp->d_name, snapname);
029cc4273b57 6627223 gfs needs to support extended dirent flags
ck153898
parents: 5331
diff changeset
  1005
		odp->d_ino = ZFSCTL_INO_SNAP(id);
029cc4273b57 6627223 gfs needs to support extended dirent flags
ck153898
parents: 5331
diff changeset
  1006
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1007
	*nextp = cookie;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1008
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1009
	ZFS_EXIT(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1010
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1011
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1012
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1013
8845
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1014
/* ARGSUSED */
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1015
static int
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1016
zfsctl_shares_readdir(vnode_t *vp, uio_t *uiop, cred_t *cr, int *eofp,
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1017
    caller_context_t *ct, int flags)
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1018
{
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1019
	zfsvfs_t *zfsvfs = vp->v_vfsp->vfs_data;
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1020
	znode_t *dzp;
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1021
	int error;
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1022
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1023
	ZFS_ENTER(zfsvfs);
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1024
9030
243fd360d81f 6815893 hang mounting a dataset after booting into a new boot environment
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8845
diff changeset
  1025
	if (zfsvfs->z_shares_dir == 0) {
243fd360d81f 6815893 hang mounting a dataset after booting into a new boot environment
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8845
diff changeset
  1026
		ZFS_EXIT(zfsvfs);
243fd360d81f 6815893 hang mounting a dataset after booting into a new boot environment
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8845
diff changeset
  1027
		return (ENOTSUP);
243fd360d81f 6815893 hang mounting a dataset after booting into a new boot environment
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8845
diff changeset
  1028
	}
8845
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1029
	if ((error = zfs_zget(zfsvfs, zfsvfs->z_shares_dir, &dzp)) == 0) {
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1030
		error = VOP_READDIR(ZTOV(dzp), uiop, cr, eofp, ct, flags);
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1031
		VN_RELE(ZTOV(dzp));
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1032
	} else {
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1033
		*eofp = 1;
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1034
		error = ENOENT;
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1035
	}
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1036
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1037
	ZFS_EXIT(zfsvfs);
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1038
	return (error);
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1039
}
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1040
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
  1041
/*
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
  1042
 * pvp is the '.zfs' directory (zfsctl_node_t).
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
  1043
 * Creates vp, which is '.zfs/snapshot' (zfsctl_snapdir_t).
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
  1044
 *
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
  1045
 * This function is the callback to create a GFS vnode for '.zfs/snapshot'
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
  1046
 * when a lookup is performed on .zfs for "snapshot".
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
  1047
 */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1048
vnode_t *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1049
zfsctl_mknode_snapdir(vnode_t *pvp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1050
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1051
	vnode_t *vp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1052
	zfsctl_snapdir_t *sdp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1053
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1054
	vp = gfs_dir_create(sizeof (zfsctl_snapdir_t), pvp,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1055
	    zfsctl_ops_snapdir, NULL, NULL, MAXNAMELEN,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1056
	    zfsctl_snapdir_readdir_cb, NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1057
	sdp = vp->v_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1058
	sdp->sd_node.zc_id = ZFSCTL_INO_SNAPDIR;
1571
5aae3c7637de 6349516 surprise: .zfs & .zfs/snapshot keep changing
ek110237
parents: 1566
diff changeset
  1059
	sdp->sd_node.zc_cmtime = ((zfsctl_node_t *)pvp->v_data)->zc_cmtime;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1060
	mutex_init(&sdp->sd_lock, NULL, MUTEX_DEFAULT, NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1061
	avl_create(&sdp->sd_snaps, snapentry_compare,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1062
	    sizeof (zfs_snapentry_t), offsetof(zfs_snapentry_t, se_node));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1063
	return (vp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1064
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1065
8845
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1066
vnode_t *
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1067
zfsctl_mknode_shares(vnode_t *pvp)
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1068
{
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1069
	vnode_t *vp;
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1070
	zfsctl_node_t *sdp;
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1071
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1072
	vp = gfs_dir_create(sizeof (zfsctl_node_t), pvp,
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1073
	    zfsctl_ops_shares, NULL, NULL, MAXNAMELEN,
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1074
	    NULL, NULL);
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1075
	sdp = vp->v_data;
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1076
	sdp->zc_cmtime = ((zfsctl_node_t *)pvp->v_data)->zc_cmtime;
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1077
	return (vp);
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1078
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1079
}
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1080
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1081
/* ARGSUSED */
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1082
static int
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1083
zfsctl_shares_getattr(vnode_t *vp, vattr_t *vap, int flags, cred_t *cr,
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1084
    caller_context_t *ct)
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1085
{
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1086
	zfsvfs_t *zfsvfs = vp->v_vfsp->vfs_data;
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1087
	znode_t *dzp;
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1088
	int error;
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1089
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1090
	ZFS_ENTER(zfsvfs);
9030
243fd360d81f 6815893 hang mounting a dataset after booting into a new boot environment
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8845
diff changeset
  1091
	if (zfsvfs->z_shares_dir == 0) {
243fd360d81f 6815893 hang mounting a dataset after booting into a new boot environment
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8845
diff changeset
  1092
		ZFS_EXIT(zfsvfs);
243fd360d81f 6815893 hang mounting a dataset after booting into a new boot environment
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8845
diff changeset
  1093
		return (ENOTSUP);
243fd360d81f 6815893 hang mounting a dataset after booting into a new boot environment
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8845
diff changeset
  1094
	}
8845
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1095
	if ((error = zfs_zget(zfsvfs, zfsvfs->z_shares_dir, &dzp)) == 0) {
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1096
		error = VOP_GETATTR(ZTOV(dzp), vap, flags, cr, ct);
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1097
		VN_RELE(ZTOV(dzp));
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1098
	}
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1099
	ZFS_EXIT(zfsvfs);
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1100
	return (error);
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1101
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1102
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1103
}
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1104
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1105
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1106
static int
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
  1107
zfsctl_snapdir_getattr(vnode_t *vp, vattr_t *vap, int flags, cred_t *cr,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
  1108
    caller_context_t *ct)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1109
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1110
	zfsvfs_t *zfsvfs = vp->v_vfsp->vfs_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1111
	zfsctl_snapdir_t *sdp = vp->v_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1112
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1113
	ZFS_ENTER(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1114
	zfsctl_common_getattr(vp, vap);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1115
	vap->va_nodeid = gfs_file_inode(vp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1116
	vap->va_nlink = vap->va_size = avl_numnodes(&sdp->sd_snaps) + 2;
10373
bcf97ee54990 6395956 snapshot dir needs real c/mtime
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
  1117
	vap->va_ctime = vap->va_mtime = dmu_objset_snap_cmtime(zfsvfs->z_os);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1118
	ZFS_EXIT(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1119
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1120
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1121
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1122
1566
93e41df9efa5 6355162 'zfs restore -d' should not succeed upon a volume
maybee
parents: 1512
diff changeset
  1123
/* ARGSUSED */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1124
static void
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
  1125
zfsctl_snapdir_inactive(vnode_t *vp, cred_t *cr, caller_context_t *ct)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1126
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1127
	zfsctl_snapdir_t *sdp = vp->v_data;
1566
93e41df9efa5 6355162 'zfs restore -d' should not succeed upon a volume
maybee
parents: 1512
diff changeset
  1128
	void *private;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1129
1566
93e41df9efa5 6355162 'zfs restore -d' should not succeed upon a volume
maybee
parents: 1512
diff changeset
  1130
	private = gfs_dir_inactive(vp);
93e41df9efa5 6355162 'zfs restore -d' should not succeed upon a volume
maybee
parents: 1512
diff changeset
  1131
	if (private != NULL) {
93e41df9efa5 6355162 'zfs restore -d' should not succeed upon a volume
maybee
parents: 1512
diff changeset
  1132
		ASSERT(avl_numnodes(&sdp->sd_snaps) == 0);
93e41df9efa5 6355162 'zfs restore -d' should not succeed upon a volume
maybee
parents: 1512
diff changeset
  1133
		mutex_destroy(&sdp->sd_lock);
93e41df9efa5 6355162 'zfs restore -d' should not succeed upon a volume
maybee
parents: 1512
diff changeset
  1134
		avl_destroy(&sdp->sd_snaps);
93e41df9efa5 6355162 'zfs restore -d' should not succeed upon a volume
maybee
parents: 1512
diff changeset
  1135
		kmem_free(private, sizeof (zfsctl_snapdir_t));
93e41df9efa5 6355162 'zfs restore -d' should not succeed upon a volume
maybee
parents: 1512
diff changeset
  1136
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1137
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1138
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1139
static const fs_operation_def_t zfsctl_tops_snapdir[] = {
3898
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2676
diff changeset
  1140
	{ VOPNAME_OPEN,		{ .vop_open = zfsctl_common_open }	},
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2676
diff changeset
  1141
	{ VOPNAME_CLOSE,	{ .vop_close = zfsctl_common_close }	},
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2676
diff changeset
  1142
	{ VOPNAME_IOCTL,	{ .error = fs_inval }			},
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2676
diff changeset
  1143
	{ VOPNAME_GETATTR,	{ .vop_getattr = zfsctl_snapdir_getattr } },
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2676
diff changeset
  1144
	{ VOPNAME_ACCESS,	{ .vop_access = zfsctl_common_access }	},
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2676
diff changeset
  1145
	{ VOPNAME_RENAME,	{ .vop_rename = zfsctl_snapdir_rename }	},
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2676
diff changeset
  1146
	{ VOPNAME_RMDIR,	{ .vop_rmdir = zfsctl_snapdir_remove }	},
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4007
diff changeset
  1147
	{ VOPNAME_MKDIR,	{ .vop_mkdir = zfsctl_snapdir_mkdir }	},
3898
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2676
diff changeset
  1148
	{ VOPNAME_READDIR,	{ .vop_readdir = gfs_vop_readdir }	},
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2676
diff changeset
  1149
	{ VOPNAME_LOOKUP,	{ .vop_lookup = zfsctl_snapdir_lookup }	},
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2676
diff changeset
  1150
	{ VOPNAME_SEEK,		{ .vop_seek = fs_seek }			},
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2676
diff changeset
  1151
	{ VOPNAME_INACTIVE,	{ .vop_inactive = zfsctl_snapdir_inactive } },
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2676
diff changeset
  1152
	{ VOPNAME_FID,		{ .vop_fid = zfsctl_common_fid }	},
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1153
	{ NULL }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1154
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1155
8845
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1156
static const fs_operation_def_t zfsctl_tops_shares[] = {
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1157
	{ VOPNAME_OPEN,		{ .vop_open = zfsctl_common_open }	},
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1158
	{ VOPNAME_CLOSE,	{ .vop_close = zfsctl_common_close }	},
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1159
	{ VOPNAME_IOCTL,	{ .error = fs_inval }			},
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1160
	{ VOPNAME_GETATTR,	{ .vop_getattr = zfsctl_shares_getattr } },
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1161
	{ VOPNAME_ACCESS,	{ .vop_access = zfsctl_common_access }	},
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1162
	{ VOPNAME_READDIR,	{ .vop_readdir = zfsctl_shares_readdir } },
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1163
	{ VOPNAME_LOOKUP,	{ .vop_lookup = zfsctl_shares_lookup }	},
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1164
	{ VOPNAME_SEEK,		{ .vop_seek = fs_seek }			},
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1165
	{ VOPNAME_INACTIVE,	{ .vop_inactive = gfs_vop_inactive } },
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1166
	{ VOPNAME_FID,		{ .vop_fid = zfsctl_shares_fid } },
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1167
	{ NULL }
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1168
};
91af0d9c0790 6800942 smb_session_create() incorrectly stores IP addresses
Alan Wright <amw@Sun.COM>
parents: 8547
diff changeset
  1169
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
  1170
/*
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
  1171
 * pvp is the GFS vnode '.zfs/snapshot'.
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
  1172
 *
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
  1173
 * This creates a GFS node under '.zfs/snapshot' representing each
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
  1174
 * snapshot.  This newly created GFS node is what we mount snapshot
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
  1175
 * vfs_t's ontop of.
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
  1176
 */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1177
static vnode_t *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1178
zfsctl_snapshot_mknode(vnode_t *pvp, uint64_t objset)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1179
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1180
	vnode_t *vp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1181
	zfsctl_node_t *zcp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1182
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1183
	vp = gfs_dir_create(sizeof (zfsctl_node_t), pvp,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1184
	    zfsctl_ops_snapshot, NULL, NULL, MAXNAMELEN, NULL, NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1185
	zcp = vp->v_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1186
	zcp->zc_id = objset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1187
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1188
	return (vp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1189
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1190
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1191
static void
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
  1192
zfsctl_snapshot_inactive(vnode_t *vp, cred_t *cr, caller_context_t *ct)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1193
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1194
	zfsctl_snapdir_t *sdp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1195
	zfs_snapentry_t *sep, *next;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1196
	vnode_t *dvp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1197
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6068
diff changeset
  1198
	VERIFY(gfs_dir_lookup(vp, "..", &dvp, cr, 0, NULL, NULL) == 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1199
	sdp = dvp->v_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1200
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1201
	mutex_enter(&sdp->sd_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1202
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1203
	if (vp->v_count > 1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1204
		mutex_exit(&sdp->sd_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1205
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1206
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1207
	ASSERT(!vn_ismntpt(vp));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1208
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1209
	sep = avl_first(&sdp->sd_snaps);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1210
	while (sep != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1211
		next = AVL_NEXT(&sdp->sd_snaps, sep);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1212
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1213
		if (sep->se_root == vp) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1214
			avl_remove(&sdp->sd_snaps, sep);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1215
			kmem_free(sep->se_name, strlen(sep->se_name) + 1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1216
			kmem_free(sep, sizeof (zfs_snapentry_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1217
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1218
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1219
		sep = next;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1220
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1221
	ASSERT(sep != NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1222
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1223
	mutex_exit(&sdp->sd_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1224
	VN_RELE(dvp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1225
1566
93e41df9efa5 6355162 'zfs restore -d' should not succeed upon a volume
maybee
parents: 1512
diff changeset
  1226
	/*
93e41df9efa5 6355162 'zfs restore -d' should not succeed upon a volume
maybee
parents: 1512
diff changeset
  1227
	 * Dispose of the vnode for the snapshot mount point.
93e41df9efa5 6355162 'zfs restore -d' should not succeed upon a volume
maybee
parents: 1512
diff changeset
  1228
	 * This is safe to do because once this entry has been removed
93e41df9efa5 6355162 'zfs restore -d' should not succeed upon a volume
maybee
parents: 1512
diff changeset
  1229
	 * from the AVL tree, it can't be found again, so cannot become
93e41df9efa5 6355162 'zfs restore -d' should not succeed upon a volume
maybee
parents: 1512
diff changeset
  1230
	 * "active".  If we lookup the same name again we will end up
93e41df9efa5 6355162 'zfs restore -d' should not succeed upon a volume
maybee
parents: 1512
diff changeset
  1231
	 * creating a new vnode.
93e41df9efa5 6355162 'zfs restore -d' should not succeed upon a volume
maybee
parents: 1512
diff changeset
  1232
	 */
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
  1233
	gfs_vop_inactive(vp, cr, ct);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1234
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1235
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1236
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1237
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1238
 * These VP's should never see the light of day.  They should always
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1239
 * be covered.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1240
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1241
static const fs_operation_def_t zfsctl_tops_snapshot[] = {
3898
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2676
diff changeset
  1242
	VOPNAME_INACTIVE, { .vop_inactive =  zfsctl_snapshot_inactive },
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1243
	NULL, NULL
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1244
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1245
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1246
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1247
zfsctl_lookup_objset(vfs_t *vfsp, uint64_t objsetid, zfsvfs_t **zfsvfsp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1248
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1249
	zfsvfs_t *zfsvfs = vfsp->vfs_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1250
	vnode_t *dvp, *vp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1251
	zfsctl_snapdir_t *sdp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1252
	zfsctl_node_t *zcp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1253
	zfs_snapentry_t *sep;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1254
	int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1255
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1256
	ASSERT(zfsvfs->z_ctldir != NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1257
	error = zfsctl_root_lookup(zfsvfs->z_ctldir, "snapshot", &dvp,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
  1258
	    NULL, 0, NULL, kcred, NULL, NULL, NULL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1259
	if (error != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1260
		return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1261
	sdp = dvp->v_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1262
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1263
	mutex_enter(&sdp->sd_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1264
	sep = avl_first(&sdp->sd_snaps);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1265
	while (sep != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1266
		vp = sep->se_root;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1267
		zcp = vp->v_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1268
		if (zcp->zc_id == objsetid)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1269
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1270
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1271
		sep = AVL_NEXT(&sdp->sd_snaps, sep);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1272
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1273
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1274
	if (sep != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1275
		VN_HOLD(vp);
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
  1276
		/*
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
  1277
		 * Return the mounted root rather than the covered mount point.
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
  1278
		 * Takes the GFS vnode at .zfs/snapshot/<snapshot objsetid>
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
  1279
		 * and returns the ZFS vnode mounted on top of the GFS node.
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
  1280
		 * This ZFS vnode is the root of the vfs for objset 'objsetid'.
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 4736
diff changeset
  1281
		 */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1282
		error = traverse(&vp);
1589
64c230a17c47 6395526 assertion failed: refcount_count(&ab->b_refcnt) == 1 (0x2 == 0x1)
maybee
parents: 1572
diff changeset
  1283
		if (error == 0) {
64c230a17c47 6395526 assertion failed: refcount_count(&ab->b_refcnt) == 1 (0x2 == 0x1)
maybee
parents: 1572
diff changeset
  1284
			if (vp == sep->se_root)
64c230a17c47 6395526 assertion failed: refcount_count(&ab->b_refcnt) == 1 (0x2 == 0x1)
maybee
parents: 1572
diff changeset
  1285
				error = EINVAL;
64c230a17c47 6395526 assertion failed: refcount_count(&ab->b_refcnt) == 1 (0x2 == 0x1)
maybee
parents: 1572
diff changeset
  1286
			else
64c230a17c47 6395526 assertion failed: refcount_count(&ab->b_refcnt) == 1 (0x2 == 0x1)
maybee
parents: 1572
diff changeset
  1287
				*zfsvfsp = VTOZ(vp)->z_zfsvfs;
64c230a17c47 6395526 assertion failed: refcount_count(&ab->b_refcnt) == 1 (0x2 == 0x1)
maybee
parents: 1572
diff changeset
  1288
		}
1572
0469a7fd3981 6390579 panic: recursive mutex_enter, at zfs:zfsctl_snapshot_inactive
nd150628
parents: 1571
diff changeset
  1289
		mutex_exit(&sdp->sd_lock);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1290
		VN_RELE(vp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1291
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1292
		error = EINVAL;
1572
0469a7fd3981 6390579 panic: recursive mutex_enter, at zfs:zfsctl_snapshot_inactive
nd150628
parents: 1571
diff changeset
  1293
		mutex_exit(&sdp->sd_lock);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1294
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1295
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1296
	VN_RELE(dvp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1297
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1298
	return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1299
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1300
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1301
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1302
 * Unmount any snapshots for the given filesystem.  This is called from
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1303
 * zfs_umount() - if we have a ctldir, then go through and unmount all the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1304
 * snapshots.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1305
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1306
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1307
zfsctl_umount_snapshots(vfs_t *vfsp, int fflags, cred_t *cr)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1308
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1309
	zfsvfs_t *zfsvfs = vfsp->vfs_data;
6068
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
  1310
	vnode_t *dvp;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1311
	zfsctl_snapdir_t *sdp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1312
	zfs_snapentry_t *sep, *next;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1313
	int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1314
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1315
	ASSERT(zfsvfs->z_ctldir != NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1316
	error = zfsctl_root_lookup(zfsvfs->z_ctldir, "snapshot", &dvp,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
  1317
	    NULL, 0, NULL, cr, NULL, NULL, NULL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1318
	if (error != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1319
		return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1320
	sdp = dvp->v_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1321
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1322
	mutex_enter(&sdp->sd_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1323
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1324
	sep = avl_first(&sdp->sd_snaps);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1325
	while (sep != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1326
		next = AVL_NEXT(&sdp->sd_snaps, sep);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1327
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1328
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1329
		 * If this snapshot is not mounted, then it must
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1330
		 * have just been unmounted by somebody else, and
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1331
		 * will be cleaned up by zfsctl_snapdir_inactive().
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1332
		 */
6068
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
  1333
		if (vn_ismntpt(sep->se_root)) {
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
  1334
			avl_remove(&sdp->sd_snaps, sep);
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
  1335
			error = zfsctl_unmount_snap(sep, fflags, cr);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1336
			if (error) {
6068
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
  1337
				avl_add(&sdp->sd_snaps, sep);
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
  1338
				break;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1339
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1340
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1341
		sep = next;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1342
	}
6068
44728d72cfec 6564619 panic after a filesystem with snapshots that have files open was destroyed or umounted
ck153898
parents: 5663
diff changeset
  1343
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1344
	mutex_exit(&sdp->sd_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1345
	VN_RELE(dvp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1346
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1347
	return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1348
}