Print this page
NEX-17003 Autosnapshots should not be managed via .zfs/snapshot
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
6093 zfsctl_shares_lookup should only VN_RELE() on zfs_zget() success
Reviewed by: Gordon Ross <gwr@nexenta.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: George Wilson <george.wilson@delphix.com>
Approved by: Robert Mustacchi <rm@joyent.com>
5766 Avoid 128K kmem allocations in mzap_upgrade()
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Prakash Surya <prakash.surya@delphix.com>
Reviewed by: George Wilson <george@delphix.com>
Reviewed by: Steven Hartland <killing@multiplay.co.uk>
Approved by: Rich Lowe <richlowe@richlowe.net>
5768 zfsctl_snapshot_inactive() can leak a vnode hold
Reviewed by: George Wilson <george@delphix.com>
Reviewed by: Prakash Surya <prakash.surya@delphix.com>
Reviewed by: Adam Leventhal <adam.leventhal@delphix.com>
Reviewed by: Bayard Bell <buffer.g.overflow@gmail.com>
Approved by: Rich Lowe <richlowe@richlowe.net>
*** 20,29 ****
--- 20,30 ----
*/
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2017 by Delphix. All rights reserved.
* Copyright 2015, OmniTI Computer Consulting, Inc. All rights reserved.
+ * Copyright 2018 Nexenta Systems, Inc. All rights reserved.
*/
/*
* ZFS control directory (a.k.a. ".zfs")
*
*** 75,84 ****
--- 76,86 ----
#include <sys/dmu.h>
#include <sys/dsl_destroy.h>
#include <sys/dsl_deleg.h>
#include <sys/mount.h>
#include <sys/sunddi.h>
+ #include <sys/autosnap.h>
#include "zfs_namecheck.h"
typedef struct zfsctl_node {
gfs_dir_t zc_gfs_private;
*** 739,749 ****
char name[ZFS_MAX_DATASET_NAME_LEN];
int err;
static enum symfollow follow = NO_FOLLOW;
static enum uio_seg seg = UIO_SYSSPACE;
! if (zfs_component_namecheck(dirname, NULL, NULL) != 0)
return (SET_ERROR(EILSEQ));
dmu_objset_name(zfsvfs->z_os, name);
*vpp = NULL;
--- 741,752 ----
char name[ZFS_MAX_DATASET_NAME_LEN];
int err;
static enum symfollow follow = NO_FOLLOW;
static enum uio_seg seg = UIO_SYSSPACE;
! if (zfs_component_namecheck(dirname, NULL, NULL) != 0 ||
! autosnap_check_name(dirname))
return (SET_ERROR(EILSEQ));
dmu_objset_name(zfsvfs->z_os, name);
*vpp = NULL;
*** 868,877 ****
--- 871,887 ----
* forcing EILSEQ to ENOENT.
* Since shell ultimately passes "*" or "?" as name to lookup
*/
return (err == EILSEQ ? ENOENT : err);
}
+
+ if (autosnap_check_name(strchr(snapname, '@'))) {
+ mutex_exit(&sdp->sd_lock);
+ ZFS_EXIT(zfsvfs);
+ return (SET_ERROR(ENOENT));
+ }
+
if (dmu_objset_hold(snapname, FTAG, &snap) != 0) {
mutex_exit(&sdp->sd_lock);
ZFS_EXIT(zfsvfs);
return (SET_ERROR(ENOENT));
}
*** 985,996 ****
--- 995,1008 ----
ZFS_ENTER(zfsvfs);
cookie = *offp;
dsl_pool_config_enter(dmu_objset_pool(zfsvfs->z_os), FTAG);
+ do {
error = dmu_snapshot_list_next(zfsvfs->z_os,
sizeof (snapname), snapname, &id, &cookie, &case_conflict);
+ } while (error == 0 && autosnap_check_name(snapname));
dsl_pool_config_exit(dmu_objset_pool(zfsvfs->z_os), FTAG);
if (error) {
ZFS_EXIT(zfsvfs);
if (error == ENOENT) {
*eofp = 1;