usr/src/uts/common/fs/zfs/sys/zfs_rlock.h
author eschrock
Tue, 16 May 2006 11:20:11 -0700
changeset 1986 628267397204
parent 1669 3521dbbcb2e8
child 2237 45affe88ed99
permissions -rw-r--r--
6424405 zpool import destroyed_pool can damage existing pool using same devices
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1669
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
     1
/*
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
     2
 * CDDL HEADER START
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
     3
 *
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
     7
 *
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    11
 * and limitations under the License.
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    12
 *
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    18
 *
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    19
 * CDDL HEADER END
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    20
 */
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    21
/*
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    22
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    23
 * Use is subject to license terms.
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    24
 */
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    25
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    26
#ifndef	_SYS_FS_ZFS_RLOCK_H
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    27
#define	_SYS_FS_ZFS_RLOCK_H
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    28
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    29
#pragma ident	"%Z%%M%	%I%	%E% SMI"
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    30
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    31
#ifdef	__cplusplus
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    32
extern "C" {
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    33
#endif
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    34
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    35
#ifdef _KERNEL
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    36
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    37
#include <sys/zfs_znode.h>
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    38
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    39
typedef enum {
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    40
	RL_READER,
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    41
	RL_WRITER,
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    42
	RL_APPEND
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    43
} rl_type_t;
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    44
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    45
typedef struct rl {
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    46
	avl_node_t r_node;	/* avl node link */
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    47
	uint64_t r_off;		/* file range offset */
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    48
	uint64_t r_len;		/* file range length */
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    49
	uint_t r_cnt;		/* range reference count in tree */
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    50
	rl_type_t r_type;	/* range type */
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    51
	kcondvar_t r_wr_cv;	/* cv for waiting writers */
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    52
	kcondvar_t r_rd_cv;	/* cv for waiting readers */
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    53
	uint8_t r_proxy;	/* acting for original range */
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    54
	uint8_t r_write_wanted;	/* writer wants to lock this range */
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    55
	uint8_t r_read_wanted;	/* reader wants to lock this range */
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    56
} rl_t;
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    57
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    58
/*
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    59
 * Lock a range (offset, length) as either shared (READER)
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    60
 * or exclusive (WRITER or APPEND). APPEND is a special type that
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    61
 * is converted to WRITER that specified to lock from the start of the
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    62
 * end of file.  zfs_range_lock() returns the range lock structure.
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    63
 */
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    64
rl_t *zfs_range_lock(znode_t *zp, uint64_t off, uint64_t len, rl_type_t type);
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    65
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    66
/*
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    67
 * Unlock range and destroy range lock structure.
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    68
 */
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    69
void zfs_range_unlock(znode_t *zp, rl_t *rl);
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    70
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    71
/*
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    72
 * Reduce range locked as RW_WRITER from whole file to specified range.
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    73
 * Asserts the whole file was previously locked.
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    74
 */
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    75
void zfs_range_reduce(znode_t *zp, rl_t *rl, uint64_t off, uint64_t len);
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    76
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    77
/*
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    78
 * AVL comparison function used to compare range locks
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    79
 */
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    80
int zfs_range_compare(const void *arg1, const void *arg2);
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    81
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    82
#endif /* _KERNEL */
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    83
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    84
#ifdef	__cplusplus
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    85
}
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    86
#endif
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    87
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents:
diff changeset
    88
#endif	/* _SYS_FS_ZFS_RLOCK_H */