nsc_freeze.c revision fcf3ce441efd61da9bb2884968af01cb7c1452cc
d29b2c4438482eb00488be49a1f5d6835f455546ab * CDDL HEADER START
d29b2c4438482eb00488be49a1f5d6835f455546ab * The contents of this file are subject to the terms of the
d29b2c4438482eb00488be49a1f5d6835f455546ab * Common Development and Distribution License (the "License").
d29b2c4438482eb00488be49a1f5d6835f455546ab * You may not use this file except in compliance with the License.
d29b2c4438482eb00488be49a1f5d6835f455546ab * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d29b2c4438482eb00488be49a1f5d6835f455546ab * See the License for the specific language governing permissions
d29b2c4438482eb00488be49a1f5d6835f455546ab * and limitations under the License.
d29b2c4438482eb00488be49a1f5d6835f455546ab * When distributing Covered Code, include this CDDL HEADER in each
d29b2c4438482eb00488be49a1f5d6835f455546ab * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
d29b2c4438482eb00488be49a1f5d6835f455546ab * If applicable, add the following below this CDDL HEADER, with the
d29b2c4438482eb00488be49a1f5d6835f455546ab * fields enclosed by brackets "[]" replaced with your own identifying
d29b2c4438482eb00488be49a1f5d6835f455546ab * information: Portions Copyright [yyyy] [name of copyright owner]
d29b2c4438482eb00488be49a1f5d6835f455546ab * CDDL HEADER END
d29b2c4438482eb00488be49a1f5d6835f455546ab * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami * Use is subject to license terms.
d29b2c4438482eb00488be49a1f5d6835f455546ab#include "../nsctl.h"
d29b2c4438482eb00488be49a1f5d6835f455546ab * (Un)Freeze Module
d29b2c4438482eb00488be49a1f5d6835f455546ab * This module provides a means to 'freeze' a device and ensure
d29b2c4438482eb00488be49a1f5d6835f455546ab * that no SP software has an open reference to that device. Later
d29b2c4438482eb00488be49a1f5d6835f455546ab * the device can be 'unfrozen' and the SP software can resume
d29b2c4438482eb00488be49a1f5d6835f455546ab * normal operations.
d29b2c4438482eb00488be49a1f5d6835f455546ab * This module is required because it is possible to place a virtual
d29b2c4438482eb00488be49a1f5d6835f455546ab * volume driver (RAID-0, 1 or 5) into a state whereby it needs to be
d29b2c4438482eb00488be49a1f5d6835f455546ab * disabled for corrective action. The (un)freeze facility provides a
d29b2c4438482eb00488be49a1f5d6835f455546ab * method of doing this without downtime.
d29b2c4438482eb00488be49a1f5d6835f455546ab * A device that is frozen should be frozen on all nodes. It is the
d29b2c4438482eb00488be49a1f5d6835f455546ab * responsibility of the management software or the user to perform
d29b2c4438482eb00488be49a1f5d6835f455546ab * the freeze and unfreeze on the required nodes.
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef struct _nsc_frz_s {
d29b2c4438482eb00488be49a1f5d6835f455546abextern int _nsc_frz_stop(char *, int *); /* forward decl */
d29b2c4438482eb00488be49a1f5d6835f455546ab cmn_err(CE_WARN, "nsctl: _nsc_init_frz: register failed");
d29b2c4438482eb00488be49a1f5d6835f455546ab * int _nsc_frz_start(char *path, int *rvp)
d29b2c4438482eb00488be49a1f5d6835f455546ab * Freeze a device
d29b2c4438482eb00488be49a1f5d6835f455546ab * Must be called from a context that can block.
d29b2c4438482eb00488be49a1f5d6835f455546ab * Returns 0 for success, or one of the following error codes:
d29b2c4438482eb00488be49a1f5d6835f455546ab * EINVAL - invalid 'path' argument
d29b2c4438482eb00488be49a1f5d6835f455546ab * ENOMEM - failed to allocate memory
d29b2c4438482eb00488be49a1f5d6835f455546ab * EALREADY - 'path' is already frozen
d29b2c4438482eb00488be49a1f5d6835f455546ab * Description:
d29b2c4438482eb00488be49a1f5d6835f455546ab * Registers 'path' to be accessed through the NSC_FREEZE_ID
d29b2c4438482eb00488be49a1f5d6835f455546ab * io module, and forces any open file descriptors for 'path'
d29b2c4438482eb00488be49a1f5d6835f455546ab * to be re-opened as appropriate.
d29b2c4438482eb00488be49a1f5d6835f455546ab frz = nsc_kmem_zalloc(sizeof (*frz), KM_SLEEP, _nsc_local_mem);
d29b2c4438482eb00488be49a1f5d6835f455546ab frz->token = nsc_register_path(path, NSC_DEVICE, _nsc_frz_io);
d29b2c4438482eb00488be49a1f5d6835f455546ab return (0);
d29b2c4438482eb00488be49a1f5d6835f455546ab * int _nsc_frz_stop(char *path, int *rvp)
d29b2c4438482eb00488be49a1f5d6835f455546ab * Unfreeze a device
d29b2c4438482eb00488be49a1f5d6835f455546ab * Must be called from a context that can block.
d29b2c4438482eb00488be49a1f5d6835f455546ab * Returns 0 or an error code.
d29b2c4438482eb00488be49a1f5d6835f455546ab * Description:
d29b2c4438482eb00488be49a1f5d6835f455546ab * Removes the path registration for the NSC_FREEZE_ID io module
d29b2c4438482eb00488be49a1f5d6835f455546ab * and forces any re-opens as appropriate.
d29b2c4438482eb00488be49a1f5d6835f455546ab return (rc);
d29b2c4438482eb00488be49a1f5d6835f455546ab return (0);
d29b2c4438482eb00488be49a1f5d6835f455546ab * int _nsc_frz_isfrozen(char *path, int *rvp)
d29b2c4438482eb00488be49a1f5d6835f455546ab * Tests whether a device is frozen.
d29b2c4438482eb00488be49a1f5d6835f455546ab * Returns 0 or EINVAL.
d29b2c4438482eb00488be49a1f5d6835f455546ab * Sets *rvp to 1 if the device was not frozen, and 0 otherwise.
d29b2c4438482eb00488be49a1f5d6835f455546ab * This function returns historical information.
d29b2c4438482eb00488be49a1f5d6835f455546ab return (0);
d29b2c4438482eb00488be49a1f5d6835f455546ab * static int
d29b2c4438482eb00488be49a1f5d6835f455546ab * _nsc_frz_open(char *path, int flag, blind_t *cdp)
d29b2c4438482eb00488be49a1f5d6835f455546ab * Dummy open function.
d29b2c4438482eb00488be49a1f5d6835f455546ab * Description:
d29b2c4438482eb00488be49a1f5d6835f455546ab * This is the "Open" function for the I/O module.
d29b2c4438482eb00488be49a1f5d6835f455546ab * It is just a dummy.
d29b2c4438482eb00488be49a1f5d6835f455546ab/* ARGSUSED */
d29b2c4438482eb00488be49a1f5d6835f455546ab return (0);
d29b2c4438482eb00488be49a1f5d6835f455546ab * static int
d29b2c4438482eb00488be49a1f5d6835f455546ab * _nsc_frz_close()
d29b2c4438482eb00488be49a1f5d6835f455546ab * Dummy close function.
d29b2c4438482eb00488be49a1f5d6835f455546ab * Description:
d29b2c4438482eb00488be49a1f5d6835f455546ab * This is the "Close" function for the I/O module.
d29b2c4438482eb00488be49a1f5d6835f455546ab * It is just a dummy.
d29b2c4438482eb00488be49a1f5d6835f455546ab_nsc_frz_close() { return (0); }
d29b2c4438482eb00488be49a1f5d6835f455546ab * static int
d29b2c4438482eb00488be49a1f5d6835f455546ab * _nsc_frz_attach()
d29b2c4438482eb00488be49a1f5d6835f455546ab * Attach a device to this i/o module.
d29b2c4438482eb00488be49a1f5d6835f455546ab * Returns EACCES in all cricumstances.
d29b2c4438482eb00488be49a1f5d6835f455546ab * Description:
d29b2c4438482eb00488be49a1f5d6835f455546ab * This function is called by the nsctl module when it wishes
d29b2c4438482eb00488be49a1f5d6835f455546ab * to attach the device to this I/O module (ie. as part of
d29b2c4438482eb00488be49a1f5d6835f455546ab * nsc_reserve() processing). This function unconditionally
d29b2c4438482eb00488be49a1f5d6835f455546ab * returns an error which forces the nsc_reserve() to fail, and
d29b2c4438482eb00488be49a1f5d6835f455546ab * so no access to possible to the underlying device.
d29b2c4438482eb00488be49a1f5d6835f455546ab "Provide", 0, 0,