diff options
| author | Chris Kirby <Chris.Kirby@sun.com> | 2010-04-08 11:02:22 -0600 |
|---|---|---|
| committer | Chris Kirby <Chris.Kirby@sun.com> | 2010-04-08 11:02:22 -0600 |
| commit | f80ce222af313ec87dc070b2219b29c81c5e5d8c (patch) | |
| tree | 90fb6de5db7dbe13192fc627fbfbeef86f869c6f | |
| parent | 4e567b4443d7a1680a7319275e5288eef2c92319 (diff) | |
| download | illumos-joyent-f80ce222af313ec87dc070b2219b29c81c5e5d8c.tar.gz | |
6891449 zvol_strategy() check for zv == NULL too late
6911444 rebooting off snapshot: assertion failed: vfsp->vfs_count != 0 (common/fs/vfs.c)
6649967 multiple '/' exist in path will confuse zinject
6935668 zvol_minor_lookup() can return wrong zvol
| -rw-r--r-- | usr/src/cmd/zinject/translate.c | 20 | ||||
| -rw-r--r-- | usr/src/uts/common/fs/zfs/zfs_vfsops.c | 6 | ||||
| -rw-r--r-- | usr/src/uts/common/fs/zfs/zvol.c | 10 |
3 files changed, 26 insertions, 10 deletions
diff --git a/usr/src/cmd/zinject/translate.c b/usr/src/cmd/zinject/translate.c index b6ea53c3ee..219ee76bd9 100644 --- a/usr/src/cmd/zinject/translate.c +++ b/usr/src/cmd/zinject/translate.c @@ -19,8 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2010 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved. */ #include <libzfs.h> @@ -67,6 +66,18 @@ ziprintf(const char *fmt, ...) va_end(ap); } +static void +compress_slashes(const char *src, char *dest) +{ + while (*src != '\0') { + *dest = *src++; + while (*dest == '/' && *src == '/') + ++src; + ++dest; + } + *dest = '\0'; +} + /* * Given a full path to a file, translate into a dataset name and a relative * path within the dataset. 'dataset' must be at least MAXNAMELEN characters, @@ -74,13 +85,16 @@ ziprintf(const char *fmt, ...) * buffer, which we need later to get the object ID. */ static int -parse_pathname(const char *fullpath, char *dataset, char *relpath, +parse_pathname(const char *inpath, char *dataset, char *relpath, struct stat64 *statbuf) { struct extmnttab mp; FILE *fp; int match; const char *rel; + char fullpath[MAXPATHLEN]; + + compress_slashes(inpath, fullpath); if (fullpath[0] != '/') { (void) fprintf(stderr, "invalid object '%s': must be full " diff --git a/usr/src/uts/common/fs/zfs/zfs_vfsops.c b/usr/src/uts/common/fs/zfs/zfs_vfsops.c index 6138bf9038..02a9adfb49 100644 --- a/usr/src/uts/common/fs/zfs/zfs_vfsops.c +++ b/usr/src/uts/common/fs/zfs/zfs_vfsops.c @@ -2099,9 +2099,11 @@ zfs_freevfs(vfs_t *vfsp) /* * If this is a snapshot, we have an extra VFS_HOLD on our parent - * from zfs_mount(). Release it here. + * from zfs_mount(). Release it here. If we came through + * zfs_mountroot() instead, we didn't grab an extra hold, so + * skip the VFS_RELE for rootvfs. */ - if (zfsvfs->z_issnap) + if (zfsvfs->z_issnap && (vfsp != rootvfs)) VFS_RELE(zfsvfs->z_parent->z_vfs); zfsvfs_free(zfsvfs); diff --git a/usr/src/uts/common/fs/zfs/zvol.c b/usr/src/uts/common/fs/zfs/zvol.c index bd3dddda41..d957796344 100644 --- a/usr/src/uts/common/fs/zfs/zvol.c +++ b/usr/src/uts/common/fs/zfs/zvol.c @@ -19,8 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2010 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. */ /* @@ -233,10 +232,10 @@ zvol_minor_lookup(const char *name) if (zv == NULL) continue; if (strcmp(zv->zv_name, name) == 0) - break; + return (zv); } - return (zv); + return (NULL); } /* extent mapping arg */ @@ -1136,7 +1135,7 @@ zvol_strategy(buf_t *bp) rl_t *rl; int error = 0; boolean_t doread = bp->b_flags & B_READ; - boolean_t is_dump = zv->zv_flags & ZVOL_DUMPIFIED; + boolean_t is_dump; boolean_t sync; if (zv == NULL) { @@ -1173,6 +1172,7 @@ zvol_strategy(buf_t *bp) return (0); } + is_dump = zv->zv_flags & ZVOL_DUMPIFIED; sync = !(bp->b_flags & B_ASYNC) && !doread && !is_dump && !(zv->zv_flags & ZVOL_WCE) && !zil_disable; |
