usr/src/uts/common/fs/zfs/zfs_ctldir.c
changeset 1571 5aae3c7637de
parent 1566 93e41df9efa5
child 1572 0469a7fd3981
equal deleted inserted replaced
1570:f2e087cbb054 1571:5aae3c7637de
   104 };
   104 };
   105 
   105 
   106 typedef struct zfsctl_node {
   106 typedef struct zfsctl_node {
   107 	gfs_dir_t	zc_gfs_private;
   107 	gfs_dir_t	zc_gfs_private;
   108 	uint64_t	zc_id;
   108 	uint64_t	zc_id;
       
   109 	timestruc_t	zc_cmtime;	/* ctime and mtime, always the same */
   109 } zfsctl_node_t;
   110 } zfsctl_node_t;
   110 
   111 
   111 typedef struct zfsctl_snapdir {
   112 typedef struct zfsctl_snapdir {
   112 	zfsctl_node_t	sd_node;
   113 	zfsctl_node_t	sd_node;
   113 	kmutex_t	sd_lock;
   114 	kmutex_t	sd_lock;
   174  * is removed when the ctldir is destroyed in the unmount.
   175  * is removed when the ctldir is destroyed in the unmount.
   175  */
   176  */
   176 void
   177 void
   177 zfsctl_create(zfsvfs_t *zfsvfs)
   178 zfsctl_create(zfsvfs_t *zfsvfs)
   178 {
   179 {
   179 	vnode_t *vp;
   180 	vnode_t *vp, *rvp;
   180 	zfsctl_node_t *zcp;
   181 	zfsctl_node_t *zcp;
   181 
   182 
   182 	ASSERT(zfsvfs->z_ctldir == NULL);
   183 	ASSERT(zfsvfs->z_ctldir == NULL);
   183 
   184 
   184 	vp = gfs_root_create(sizeof (zfsctl_node_t), zfsvfs->z_vfs,
   185 	vp = gfs_root_create(sizeof (zfsctl_node_t), zfsvfs->z_vfs,
   185 	    zfsctl_ops_root, ZFSCTL_INO_ROOT, zfsctl_root_entries,
   186 	    zfsctl_ops_root, ZFSCTL_INO_ROOT, zfsctl_root_entries,
   186 	    zfsctl_root_inode_cb, MAXNAMELEN, NULL, NULL);
   187 	    zfsctl_root_inode_cb, MAXNAMELEN, NULL, NULL);
   187 	zcp = vp->v_data;
   188 	zcp = vp->v_data;
   188 	zcp->zc_id = ZFSCTL_INO_ROOT;
   189 	zcp->zc_id = ZFSCTL_INO_ROOT;
   189 
   190 
       
   191 	VERIFY(VFS_ROOT(zfsvfs->z_vfs, &rvp) == 0);
       
   192 	ZFS_TIME_DECODE(&zcp->zc_cmtime, VTOZ(rvp)->z_phys->zp_crtime);
       
   193 	VN_RELE(rvp);
       
   194 
   190 	/*
   195 	/*
   191 	 * We're only faking the fact that we have a root of a filesystem for
   196 	 * We're only faking the fact that we have a root of a filesystem for
   192 	 * the sake of the GFS interfaces.  Undo the flag manipulation it did
   197 	 * the sake of the GFS interfaces.  Undo the flag manipulation it did
   193 	 * for us.
   198 	 * for us.
   194 	 */
   199 	 */
   262  * Common getattr function.  Fill in basic information.
   267  * Common getattr function.  Fill in basic information.
   263  */
   268  */
   264 static void
   269 static void
   265 zfsctl_common_getattr(vnode_t *vp, vattr_t *vap)
   270 zfsctl_common_getattr(vnode_t *vp, vattr_t *vap)
   266 {
   271 {
   267 	timestruc_t now;
   272 	zfsctl_node_t	*zcp = vp->v_data;
       
   273 	timestruc_t	now;
   268 
   274 
   269 	vap->va_uid = 0;
   275 	vap->va_uid = 0;
   270 	vap->va_gid = 0;
   276 	vap->va_gid = 0;
   271 	vap->va_rdev = 0;
   277 	vap->va_rdev = 0;
   272 	/*
   278 	/*
   279 	vap->va_fsid = vp->v_vfsp->vfs_dev;
   285 	vap->va_fsid = vp->v_vfsp->vfs_dev;
   280 	vap->va_mode = S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP |
   286 	vap->va_mode = S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP |
   281 	    S_IROTH | S_IXOTH;
   287 	    S_IROTH | S_IXOTH;
   282 	vap->va_type = VDIR;
   288 	vap->va_type = VDIR;
   283 	/*
   289 	/*
   284 	 * We live in the now.
   290 	 * We live in the now (for atime).
   285 	 */
   291 	 */
   286 	gethrestime(&now);
   292 	gethrestime(&now);
   287 	vap->va_mtime = vap->va_ctime = vap->va_atime = now;
   293 	vap->va_atime = now;
       
   294 	vap->va_mtime = vap->va_ctime = zcp->zc_cmtime;
   288 }
   295 }
   289 
   296 
   290 static int
   297 static int
   291 zfsctl_common_fid(vnode_t *vp, fid_t *fidp)
   298 zfsctl_common_fid(vnode_t *vp, fid_t *fidp)
   292 {
   299 {
   734 	vp = gfs_dir_create(sizeof (zfsctl_snapdir_t), pvp,
   741 	vp = gfs_dir_create(sizeof (zfsctl_snapdir_t), pvp,
   735 	    zfsctl_ops_snapdir, NULL, NULL, MAXNAMELEN,
   742 	    zfsctl_ops_snapdir, NULL, NULL, MAXNAMELEN,
   736 	    zfsctl_snapdir_readdir_cb, NULL);
   743 	    zfsctl_snapdir_readdir_cb, NULL);
   737 	sdp = vp->v_data;
   744 	sdp = vp->v_data;
   738 	sdp->sd_node.zc_id = ZFSCTL_INO_SNAPDIR;
   745 	sdp->sd_node.zc_id = ZFSCTL_INO_SNAPDIR;
       
   746 	sdp->sd_node.zc_cmtime = ((zfsctl_node_t *)pvp->v_data)->zc_cmtime;
   739 	mutex_init(&sdp->sd_lock, NULL, MUTEX_DEFAULT, NULL);
   747 	mutex_init(&sdp->sd_lock, NULL, MUTEX_DEFAULT, NULL);
   740 	avl_create(&sdp->sd_snaps, snapentry_compare,
   748 	avl_create(&sdp->sd_snaps, snapentry_compare,
   741 	    sizeof (zfs_snapentry_t), offsetof(zfs_snapentry_t, se_node));
   749 	    sizeof (zfs_snapentry_t), offsetof(zfs_snapentry_t, se_node));
   742 	return (vp);
   750 	return (vp);
   743 }
   751 }