usr/src/uts/common/fs/nfs/nfs_log.c
author jpk
Fri, 24 Mar 2006 12:29:20 -0800
changeset 1676 37f4a3e2bd99
parent 1610 3436e82414c8
child 2707 c58c084f09a5
permissions -rw-r--r--
PSARC/2002/762 Layered Trusted Solaris PSARC/2005/060 TSNET: Trusted Networking with Security Labels PSARC/2005/259 Layered Trusted Solaris Label Interfaces PSARC/2005/573 Solaris Trusted Extensions for Printing PSARC/2005/691 Trusted Extensions for Device Allocation PSARC/2005/723 Solaris Trusted Extensions Filesystem Labeling PSARC/2006/009 Labeled Auditing PSARC/2006/155 Trusted Extensions RBAC Changes PSARC/2006/191 is_system_labeled 6293271 Zone processes should use zone_kcred instead of kcred 6394554 integrate Solaris Trusted Extensions
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 0
diff changeset
     5
 * Common Development and Distribution License (the "License").
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 0
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
/*
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 0
diff changeset
    22
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
#include <sys/cred.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
#include <sys/cmn_err.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#include <sys/debug.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#include <sys/systm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include <sys/kmem.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <sys/disp.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <sys/atomic.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <rpc/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include <nfs/nfs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <nfs/nfssys.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <nfs/export.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <nfs/rnode.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <rpc/auth.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <rpc/svc.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include <rpc/xdr.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include <rpc/clnt.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#include <nfs/nfs_log.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#define	NUM_RECORDS_TO_WRITE 256
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#define	NUM_BYTES_TO_WRITE 65536
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
extern krwlock_t exported_lock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
static int nfslog_num_records_to_write = NUM_RECORDS_TO_WRITE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
static int nfslog_num_bytes_to_write = NUM_BYTES_TO_WRITE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
 * This struct is used to 'hide' the details of managing the log
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
 * records internally to the logging code.  Allocation routines
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
 * are used to obtain pieces of memory for XDR encoding.  This struct
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
 * is a 'header' to those areas and a opaque cookie is used to pass
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
 * this data structure between the allocating function and the put
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
 * function.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
struct lr_alloc {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
	struct lr_alloc		*next;		/* links for write queuing */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
	struct lr_alloc		*prev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
#define	LR_ALLOC_NOFREE	0x1			/* not present, call free */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
	int			lr_flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
	caddr_t			log_record;	/* address to XDR encoding */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
	size_t			size;		/* final size of encoding */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
	struct kmem_cache	*alloc_cache;	/* keep track of cache ptr */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
	struct exportinfo	*exi;		/* who are we related to? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
	struct log_buffer	*lb;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
struct flush_thread_params {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
	struct nfsl_flush_args tp_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
	int tp_error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
static int log_file_create(caddr_t, struct log_file **);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
static void log_file_rele(struct log_file *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
static struct log_buffer *log_buffer_create(caddr_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
static void log_buffer_rele(struct log_buffer *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
static int nfslog_record_append2all(struct lr_alloc *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
static int nfslog_logbuffer_rename(struct log_buffer *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
static void nfslog_logfile_wait(struct log_file *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
static int nfslog_logfile_rename(char *, char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
static void nfslog_do_flush(struct flush_thread_params *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
static void create_buffer_header(caddr_t *, size_t *, size_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
static int nfslog_write_logrecords(struct log_file *, struct lr_alloc *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
static void nfslog_free_logrecords(struct lr_alloc *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
static int nfslog_records_flush_to_disk(struct log_buffer *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
static int nfslog_records_flush_to_disk_nolock(struct log_buffer *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
 * Read/Write lock that protects 'nfslog_buffer_list'.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
 * This lock must be held when searching or modifying 'nfslog_buffer_list'.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
static krwlock_t nfslog_buffer_list_lock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
 * The list of "log_buffer" structures.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
struct log_buffer *nfslog_buffer_list = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
#define	LOG_BUFFER_HOLD(lbp)	{ \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
	mutex_enter(&(lbp)->lb_lock); \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
	(lbp)->lb_refcnt++; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
	mutex_exit(&(lbp)->lb_lock); \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
#define	LOG_FILE_HOLD(lfp)	{ \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
	mutex_enter(&(lfp)->lf_lock); \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	(lfp)->lf_refcnt++; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
	mutex_exit(&(lfp)->lf_lock); \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
#define	LOG_FILE_RELE(lfp)	{ \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
	log_file_rele(lfp); \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
 * These two macros are used to prep a logfile data structure and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
 * associated file for writing data.  Note that the lf_lock is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
 * held as a result of the call to the first macro.  This is used
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
 * for serialization correctness between the logbuffer struct and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
 * the logfile struct.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
#define	LOG_FILE_LOCK_TO_WRITE(lfp)	{ \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
	mutex_enter(&(lfp)->lf_lock); \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
	(lfp)->lf_refcnt++; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
	(lfp)->lf_writers++; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
#define	LOG_FILE_UNLOCK_FROM_WRITE(lfp)	{ \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
	(lfp)->lf_writers--; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
	if ((lfp)->lf_writers == 0 && ((lfp)->lf_flags & L_WAITING)) { \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
		(lfp)->lf_flags &= ~L_WAITING; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
		cv_broadcast(&(lfp)->lf_cv_waiters); \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
	} \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
	mutex_exit(&(lfp)->lf_lock); \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
	log_file_rele(lfp); \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
int rfsl_log_buffer = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
static int rfsl_log_file = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
/* This array is used for memory allocation of record encoding spaces */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
static struct {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
	int	size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
	struct kmem_cache *mem_cache;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
	char	*cache_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
} nfslog_mem_alloc[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
#define	SMALL_INDX 0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
	{ NFSLOG_SMALL_RECORD_SIZE - sizeof (struct lr_alloc),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
	NULL, NFSLOG_SMALL_REC_NAME },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
#define	MEDIUM_INDX 1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
	{ NFSLOG_MEDIUM_RECORD_SIZE - sizeof (struct lr_alloc),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
	NULL, NFSLOG_MEDIUM_REC_NAME },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
#define	LARGE_INDX 2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
	{ NFSLOG_LARGE_RECORD_SIZE - sizeof (struct lr_alloc),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
	NULL, NFSLOG_LARGE_REC_NAME },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
	{ (-1), NULL }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
/* Used to calculate the 'real' allocation size */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
#define	ALLOC_SIZE(index) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
	(nfslog_mem_alloc[index].size + sizeof (struct lr_alloc))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
 * Initialize logging data buffer cache
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
nfslog_init()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
	int indx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	rw_init(&nfslog_buffer_list_lock, NULL, RW_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
	 * Initialize the kmem caches for encoding
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
	for (indx = 0; nfslog_mem_alloc[indx].size != (-1); indx++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
		nfslog_mem_alloc[indx].mem_cache =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
			kmem_cache_create(nfslog_mem_alloc[indx].cache_name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
				ALLOC_SIZE(indx),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
				0, NULL, NULL, NULL, NULL, NULL, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
 * Sets up the necessary log file and related buffers to enable logging
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
 * on the given export point.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
 * Returns 0 on success, non-zero on failure.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
nfslog_setup(struct exportinfo *exi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	struct exportdata *kex;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	struct log_buffer *lbp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
	struct log_buffer *nlbp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
	kex = &exi->exi_export;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
	ASSERT(kex->ex_flags & EX_LOG);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
	 * Logging is enabled for the new export point, check
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
	 * the existing log_buffer structures to see if the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
	 * desired buffer has already been opened. If so, point
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
	 * the new exportinfo's exi_logbuffer to the existing
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
	 * one.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	rw_enter(&nfslog_buffer_list_lock, RW_READER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
	for (lbp = nfslog_buffer_list; lbp != NULL; lbp = lbp->lb_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
		LOGGING_DPRINT((10,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
		    "searching for buffer... found log_buffer '%s'\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
				lbp->lb_path));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
		if (strcmp(lbp->lb_path, kex->ex_log_buffer) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
			/* Found our match. Ref it and return */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
			LOG_BUFFER_HOLD(lbp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
			exi->exi_logbuffer = lbp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
			LOGGING_DPRINT((10,  "\tfound log_buffer for '%s'\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
				kex->ex_log_buffer));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
			rw_exit(&nfslog_buffer_list_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
	rw_exit(&nfslog_buffer_list_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
	 * New buffer needed, allocate it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
	 * The buffer list lock has been dropped so we will need to search
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
	 * the list again to ensure that another thread has not added
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
	 * a matching buffer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
	if ((nlbp = log_buffer_create(kex->ex_log_buffer)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
		 * Failed the buffer creation for some reason so we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
		 * will need to return.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
		return (EIO);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
	rw_enter(&nfslog_buffer_list_lock, RW_WRITER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
	for (lbp = nfslog_buffer_list; lbp != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
		lbp = lbp->lb_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
		if (strcmp(lbp->lb_path, kex->ex_log_buffer) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
				 * A log_buffer already exists for the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
				 * indicated buffer, use it instead.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
			LOG_BUFFER_HOLD(lbp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
			exi->exi_logbuffer = lbp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
			LOGGING_DPRINT((10,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
				"found log_buffer for '%s' "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
				"after allocation\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
				kex->ex_log_buffer));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
			rw_exit(&nfslog_buffer_list_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
			log_buffer_rele(nlbp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
	 * Didn't find an existing log_buffer for this buffer,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
	 * use the the newly created one, and add to list.  We
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
	 * increment the reference count because the node is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
	 * entered into the global list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
	LOGGING_DPRINT((10, "exportfs: adding nlbp=%p to list\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
		nlbp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
	nlbp->lb_next = nfslog_buffer_list;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
	nfslog_buffer_list = nlbp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
	LOG_BUFFER_HOLD(nlbp);	/* hold is for export entry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
	exi->exi_logbuffer = nlbp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
	rw_exit(&nfslog_buffer_list_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
 * Disables logging for the given export point.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
nfslog_disable(struct exportinfo *exi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
	log_buffer_rele(exi->exi_logbuffer);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
 * Creates the corresponding log_buffer and log_file structures
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
 * for the the buffer named 'name'.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
 * Returns a pointer to the log_buffer structure with reference one.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
static struct log_buffer *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
log_buffer_create(caddr_t name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
	struct log_buffer *buffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
	struct log_file *logfile;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
	int namelen = strlen(name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
	LOGGING_DPRINT((10,  "log_buffer_create: %s\n", name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
	if (log_file_create(name, &logfile))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
	buffer = (struct log_buffer *)kmem_alloc(sizeof (*buffer), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
	buffer->lb_refcnt = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
	buffer->lb_rec_id = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
	buffer->lb_path = (caddr_t)kmem_alloc(namelen + 1, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
	bcopy(name, buffer->lb_path, namelen + 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
	buffer->lb_logfile = logfile;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
	buffer->lb_records = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
	buffer->lb_num_recs = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
	buffer->lb_size_queued = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
	mutex_init(&buffer->lb_lock, NULL, MUTEX_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
	rfsl_log_buffer++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
	return (buffer);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
 * Release a log_buffer structure
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
log_buffer_rele(struct log_buffer *lbp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
	int len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
	mutex_enter(&lbp->lb_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
	if (--lbp->lb_refcnt > 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
		mutex_exit(&lbp->lb_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
	if (lbp->lb_refcnt < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
		panic("log_rele: log_buffer refcnt < 0");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
		/*NOTREACHED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
	 * Need to drop the lb_lock before acquiring the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
	 * nfslog_buffer_list_lock. To avoid double free we need
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
	 * to hold an additional reference to the log buffer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
	 * This will ensure that no two threads will simultaneously
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
	 * be trying to free the same log buffer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
	if (lbp->lb_refcnt == 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
		 * If the ref count is 1, then the last
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
		 * unshare/reference has been given up and we need to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
		 * clean up the buffer and remove it from the buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
		 * list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
		LOGGING_DPRINT((10,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
			"log_buffer_rele lbp=%p disconnecting\n", lbp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
		 * Hold additional reference before dropping the lb_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
		lbp->lb_refcnt++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
		mutex_exit(&lbp->lb_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
		 * Make sure that all of the buffered records are written.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
		 * Don't bother checking the write return value since there
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
		 * isn't much we can do at this point.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
		(void) nfslog_records_flush_to_disk(lbp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
		rw_enter(&nfslog_buffer_list_lock, RW_WRITER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
		mutex_enter(&lbp->lb_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
		 * Drop the reference count held above.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
		 * If the ref count is still > 1 then someone has
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
		 * stepped in to use this log buffer.  unlock and return.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
		if (--lbp->lb_refcnt > 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
			mutex_exit(&lbp->lb_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
			rw_exit(&nfslog_buffer_list_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
		if (lbp == nfslog_buffer_list) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
			nfslog_buffer_list = lbp->lb_next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
			struct log_buffer *tlbp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
			/* Drop the log_buffer from the master list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
			for (tlbp = nfslog_buffer_list; tlbp->lb_next != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
					tlbp = tlbp->lb_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
				if (tlbp->lb_next == lbp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
					tlbp->lb_next = lbp->lb_next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
		mutex_exit(&lbp->lb_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
		rw_exit(&nfslog_buffer_list_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
	 * ref count zero; finish clean up.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
	LOGGING_DPRINT((10, "log_buffer_rele lbp=%p freeing\n", lbp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
	log_file_rele(lbp->lb_logfile);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
	len = strlen(lbp->lb_path) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
	kmem_free(lbp->lb_path, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
	kmem_free(lbp, sizeof (*lbp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
	rfsl_log_buffer--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
 * Creates the corresponding log_file structure for the buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
 * named 'log_file_name'.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
 * 'log_file_name' is created by concatenating 'origname' and LOG_INPROG_STRING.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
 * 'logfile' is set to be the log_file structure with reference one.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
log_file_create(caddr_t origname, struct log_file **lfpp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
	vnode_t *vp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
	char *name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
	int namelen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
	int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
	struct log_file *logfile = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
	vattr_t va;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
	caddr_t loghdr = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
	size_t loghdr_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
	size_t loghdr_free = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
	namelen = strlen(origname) + strlen(LOG_INPROG_STRING);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
	name = (caddr_t)kmem_alloc(namelen + 1, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
	(void) sprintf(name, "%s%s", origname, LOG_INPROG_STRING);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
	LOGGING_DPRINT((3, "log_file_create: %s\n", name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
	if (error = vn_open(name, UIO_SYSSPACE, FCREAT|FWRITE|FOFFMAX,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
			LOG_MODE, &vp, CRCREAT, 0)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
		nfs_cmn_err(error, CE_WARN,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
			"log_file_create: Can not open %s - error %m", name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
		goto out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
	LOGGING_DPRINT((3, "log_file_create: %s vp=%p v_count=%d\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
		name, vp, vp->v_count));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
	logfile = (struct log_file *)kmem_zalloc(sizeof (*logfile), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
	logfile->lf_path = name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
	 * No need to bump the vnode reference count since it is set
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
	 * to one by vn_open().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
	logfile->lf_vp = vp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
	logfile->lf_refcnt = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
	mutex_init(&logfile->lf_lock, NULL, MUTEX_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
	rfsl_log_file++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
	va.va_mask = AT_SIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
	error = VOP_GETATTR(vp, &va, 0, CRED());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
	if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
		nfs_cmn_err(error, CE_WARN,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
			"log_file_create: Can not stat %s - error = %m",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
			name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
		goto out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
	if (va.va_size == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
		struct lr_alloc lr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
		 * Write Header.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
		create_buffer_header(&loghdr, &loghdr_len, &loghdr_free);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
		 * Dummy up a lr_alloc struct for the write
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
		lr.next = lr.prev = &lr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
		lr.lr_flags = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
		lr.log_record = loghdr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
		lr.size = loghdr_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
		lr.alloc_cache = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
		lr.exi = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
		lr.lb = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
		mutex_enter(&logfile->lf_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
		error = nfslog_write_logrecords(logfile, &lr, 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
		mutex_exit(&logfile->lf_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
		if (error != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
			nfs_cmn_err(error, CE_WARN,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
				"log_file_create: Can not write header "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
				"on %s - error = %m", name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
			goto out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
	*lfpp = logfile;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
	if (loghdr != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
		kmem_free(loghdr, loghdr_free);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
out:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
	if (vp != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
		int error1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
		error1 = VOP_CLOSE(vp, FCREAT|FWRITE|FOFFMAX, 1, (offset_t)0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
				CRED());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
		if (error1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
			nfs_cmn_err(error1, CE_WARN,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
				"log_file_create: Can not close %s - "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
				"error = %m", name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
		VN_RELE(vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
	kmem_free(name, namelen + 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
	if (logfile != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
		mutex_destroy(&logfile->lf_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
		kmem_free(logfile, sizeof (*logfile));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
		rfsl_log_file--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
	if (loghdr != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
		kmem_free(loghdr, loghdr_free);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
 * Release a log_file structure
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
log_file_rele(struct log_file *lfp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
	int len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
	int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
	mutex_enter(&lfp->lf_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
	if (--lfp->lf_refcnt > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
		LOGGING_DPRINT((10,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
			"log_file_rele lfp=%p decremented refcnt to %d\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
			lfp, lfp->lf_refcnt));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
		mutex_exit(&lfp->lf_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
	if (lfp->lf_refcnt < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
		panic("log_file_rele: log_file refcnt < 0");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
		/*NOTREACHED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
	LOGGING_DPRINT((10, "log_file_rele lfp=%p freeing node\n", lfp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
	lfp->lf_flags &= ~(L_PRINTED | L_ERROR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
	ASSERT(lfp->lf_flags == 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
	ASSERT(lfp->lf_writers == 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
	if (error = VOP_CLOSE(lfp->lf_vp, FCREAT|FWRITE|FOFFMAX, 1, (offset_t)0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
		CRED())) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
		nfs_cmn_err(error, CE_WARN,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
			"NFS: Could not close log buffer %s - error = %m",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
			lfp->lf_path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
		LOGGING_DPRINT((3,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
			"log_file_rele: %s has been closed vp=%p "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
			"v_count=%d\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
			lfp->lf_path, lfp->lf_vp, lfp->lf_vp->v_count));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
	VN_RELE(lfp->lf_vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
	len = strlen(lfp->lf_path) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
	kmem_free(lfp->lf_path, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
	kmem_free(lfp, sizeof (*lfp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
	rfsl_log_file--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
 * Allocates a record of the size specified.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
 * 'exi' identifies the exportinfo structure being logged.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
 * 'size' indicates how much memory should be allocated
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
 * 'cookie' is used to store an opaque value for the caller for later use
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
 * 'flags' currently ignored.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
 * Returns a pointer to the beginning of the allocated memory.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
 * 'cookie' is a pointer to the 'lr_alloc' struct; this will be used
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
 * to keep track of the encoded record and contains all the info
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
 * for enqueuing the record on the log buffer for later writing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
 * nfslog_record_put() must be used to 'free' this record or allocation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
void *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
nfslog_record_alloc(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
	struct exportinfo *exi,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
	int alloc_indx,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
	void **cookie,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
	int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
	struct lr_alloc *lrp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
	lrp = (struct lr_alloc *)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
		kmem_cache_alloc(nfslog_mem_alloc[alloc_indx].mem_cache,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
			KM_NOSLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
	if (lrp == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
		*cookie = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
	lrp->next = lrp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
	lrp->prev = lrp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
	lrp->lr_flags = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
	lrp->log_record = (caddr_t)((uintptr_t)lrp +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
		(uintptr_t)sizeof (struct lr_alloc));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
	lrp->size = nfslog_mem_alloc[alloc_indx].size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
	lrp->alloc_cache = nfslog_mem_alloc[alloc_indx].mem_cache;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
	lrp->exi = exi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
	if (exi->exi_export.ex_flags & EX_LOG) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
		LOG_BUFFER_HOLD(exi->exi_logbuffer);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
		lrp->lb = exi->exi_logbuffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
		lrp->lb = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
	*cookie = (void *)lrp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
	LOGGING_DPRINT((3,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
		"nfslog_record_alloc(log_buffer=%p mem=%p size=%lu)\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
		exi->exi_logbuffer, lrp->log_record, lrp->size));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
	return (lrp->log_record);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
 * After the above nfslog_record_alloc() has been called and a record
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
 * encoded into the buffer that was returned, this function is called
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
 * to handle appropriate disposition of the newly created record.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
 * The cookie value is the one that was returned from nfslog_record_alloc().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
 * Size is the actual size of the record that was encoded.  This is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
 * passed in because the size used for the alloc was just an approximation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
 * The sync parameter is used to tell us if we need to force this record
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
 * to disk and if not it will be queued for later writing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
 * Note that if the size parameter has a value of 0, then the record is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
 * not written to the log and the associated data structures are released.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
nfslog_record_put(void *cookie, size_t size, bool_t sync,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
	unsigned int which_buffers)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
	struct lr_alloc *lrp = (struct lr_alloc *)cookie;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
	struct log_buffer *lbp = lrp->lb;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
	 * If the caller has nothing to write or if there is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
	 * an apparent error, rele the buffer and free.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
	if (size == 0 || size > lrp->size) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
		nfslog_free_logrecords(lrp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
	 * Reset the size to what actually needs to be written
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
	 * This is used later on when the iovec is built for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
	 * writing the records to the log file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
	lrp->size = size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
	/* append to all if public exi */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
	if (which_buffers == NFSLOG_ALL_BUFFERS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
		(void) nfslog_record_append2all(lrp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
		nfslog_free_logrecords(lrp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
	/* Insert the record on the list to be written */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
	mutex_enter(&lbp->lb_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
	if (lbp->lb_records == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
		lbp->lb_records = (caddr_t)lrp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
		lbp->lb_num_recs = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
		lbp->lb_size_queued = lrp->size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
		insque(lrp, ((struct lr_alloc *)lbp->lb_records)->prev);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
		lbp->lb_num_recs++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
		lbp->lb_size_queued += lrp->size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
	 * Determine if the queue for this log buffer should be flushed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
	 * This is done by either the number of records queued, the total
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
	 * size of all records queued or by the request of the caller
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
	 * via the sync parameter.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
	if (lbp->lb_size_queued >= nfslog_num_bytes_to_write ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
		lbp->lb_num_recs > nfslog_num_records_to_write ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
		sync == TRUE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
		mutex_exit(&lbp->lb_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
		(void) nfslog_records_flush_to_disk(lbp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
		mutex_exit(&lbp->lb_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
 * Examine the log_buffer struct to see if there are queue log records
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
 * that need to be written to disk.  If some exist, pull them off of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
 * the log buffer and write them to the log file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
nfslog_records_flush_to_disk(struct log_buffer *lbp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
	mutex_enter(&lbp->lb_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
	if (lbp->lb_records == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   731
		mutex_exit(&lbp->lb_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   732
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   733
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   734
	return	(nfslog_records_flush_to_disk_nolock(lbp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   735
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   737
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   738
 * Function requires that the caller holds lb_lock.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   739
 * Function flushes any records in the log buffer to the disk.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   740
 * Function drops the lb_lock on return.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   741
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   742
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   743
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   744
nfslog_records_flush_to_disk_nolock(struct log_buffer *lbp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   745
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   746
	struct log_file *lfp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   747
	struct lr_alloc *lrp_writers;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   748
	int num_recs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   749
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   750
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   751
	ASSERT(MUTEX_HELD(&lbp->lb_lock));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   752
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   753
	lfp = lbp->lb_logfile;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   754
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   755
	LOG_FILE_LOCK_TO_WRITE(lfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   756
	ASSERT(lbp->lb_records != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   757
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   758
	lrp_writers = (struct lr_alloc *)lbp->lb_records;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   759
	lbp->lb_records = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   760
	num_recs = lbp->lb_num_recs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   761
	lbp->lb_num_recs = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   762
	lbp->lb_size_queued = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   763
	mutex_exit(&lbp->lb_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   764
	error = nfslog_write_logrecords(lfp, lrp_writers, num_recs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   765
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   766
	LOG_FILE_UNLOCK_FROM_WRITE(lfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   767
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   768
	nfslog_free_logrecords(lrp_writers);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   769
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   770
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   771
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   772
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   773
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   774
 * Take care of writing the provided log record(s) to the log file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   775
 * We group the log records with an iovec and use VOP_WRITE to append
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   776
 * them to the end of the log file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   777
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   778
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   779
nfslog_write_logrecords(struct log_file *lfp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   780
	struct lr_alloc *lrp_writers, int num_recs)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   781
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   782
	struct uio uio;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   783
	struct iovec *iovp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   784
	int size_iovecs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   785
	vnode_t *vp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   786
	struct vattr va;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   787
	struct lr_alloc *lrp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   788
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   789
	ssize_t len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   790
	int ioflag = FAPPEND;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   791
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   792
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   793
	ASSERT(MUTEX_HELD(&lfp->lf_lock));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   794
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   795
	vp = lfp->lf_vp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   796
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   797
	size_iovecs = sizeof (struct iovec) * num_recs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   798
	iovp = (struct iovec *)kmem_alloc(size_iovecs, KM_NOSLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   799
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   800
	if (iovp == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   801
		error = ENOMEM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   802
		goto out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   803
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   804
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   805
	/* Build the iovec based on the list of log records */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   806
	i = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   807
	len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   808
	lrp = lrp_writers;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   809
	do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   810
		iovp[i].iov_base = lrp->log_record;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   811
		iovp[i].iov_len = lrp->size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   812
		len += lrp->size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   813
		lrp = lrp->next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   814
		i++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   815
	} while (lrp != lrp_writers);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   816
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   817
	ASSERT(i == num_recs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   818
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   819
	uio.uio_iov = iovp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   820
	uio.uio_iovcnt = num_recs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   821
	uio.uio_loffset = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   822
	uio.uio_segflg = (short)UIO_SYSSPACE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   823
	uio.uio_resid = len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   824
	uio.uio_llimit = (rlim64_t)MAXOFFSET_T;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   825
	uio.uio_fmode = FWRITE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   826
	uio.uio_extflg = UIO_COPY_DEFAULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   827
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   828
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   829
	 * Save the size. If the write fails, reset the size to avoid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   830
	 * corrupted log buffer files.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   831
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   832
	va.va_mask = AT_SIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   833
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   834
	(void) VOP_RWLOCK(vp, V_WRITELOCK_TRUE, NULL);  /* UIO_WRITE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   835
	if ((error = VOP_GETATTR(vp, &va, 0, CRED())) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   836
		if ((len + va.va_size) < (MAXOFF32_T)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   837
			error = VOP_WRITE(vp, &uio, ioflag, CRED(), NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   838
			if (uio.uio_resid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   839
				error = ENOSPC;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   840
			if (error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   841
				(void) VOP_SETATTR(vp, &va, 0, CRED(), NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   842
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   843
			if (!(lfp->lf_flags & L_PRINTED)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   844
				cmn_err(CE_WARN,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   845
				    "NFS Logging: buffer file %s exceeds 2GB; "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   846
				    "stopped writing buffer \n", lfp->lf_path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   847
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   848
			error = ENOSPC;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   849
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   850
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   851
	VOP_RWUNLOCK(vp, V_WRITELOCK_TRUE, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   852
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   853
	kmem_free(iovp, size_iovecs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   854
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   855
out:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   856
	if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   857
		if (!(lfp->lf_flags & L_PRINTED)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   858
			nfs_cmn_err(error, CE_WARN,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   859
				"NFS Logging disabled for buffer %s - "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   860
				"write error = %m\n", lfp->lf_path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   861
			lfp->lf_flags |= L_PRINTED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   862
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   863
	} else if (lfp->lf_flags & (L_ERROR | L_PRINTED)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   864
		lfp->lf_flags &= ~(L_ERROR | L_PRINTED);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   865
		cmn_err(CE_WARN,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   866
			"NFS Logging re-enabled for buffer %s\n", lfp->lf_path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   867
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   868
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   869
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   870
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   871
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   872
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   873
nfslog_free_logrecords(struct lr_alloc *lrp_writers)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   874
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   875
	struct lr_alloc *lrp = lrp_writers;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   876
	struct lr_alloc *lrp_free;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   877
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   878
	do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   879
		lrp_free = lrp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   880
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   881
		lrp = lrp->next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   882
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   883
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   884
		 * Check to see if we are supposed to free this structure
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   885
		 * and relese the log_buffer ref count.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   886
		 * It may be the case that the caller does not want this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   887
		 * structure and its record contents freed just yet.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   888
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   889
		if ((lrp_free->lr_flags & LR_ALLOC_NOFREE) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   890
			if (lrp_free->lb != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   891
				log_buffer_rele(lrp_free->lb);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   892
			if (lrp_free->alloc_cache) /* double check */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   893
				kmem_cache_free(lrp_free->alloc_cache,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   894
					(void *)lrp_free);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   895
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   896
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   897
			 * after being pulled from the list the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   898
			 * pointers need to be reinitialized.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   899
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   900
			lrp_free->next = lrp_free;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   901
			lrp_free->prev = lrp_free;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   902
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   903
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   904
	} while (lrp != lrp_writers);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   905
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   906
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   907
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   908
 * Rename lbp->lb_logfile to reflect the true name requested by 'share'
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   909
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   910
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   911
nfslog_logbuffer_rename(struct log_buffer *lbp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   912
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   913
	struct log_file *lf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   914
	int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   915
	struct log_file *logfile;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   916
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   917
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   918
	 * Try our best to get the cache records into the log file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   919
	 * before the rename occurs.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   920
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   921
	(void) nfslog_records_flush_to_disk(lbp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   922
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   923
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   924
	 * Hold lb_lock before retrieving
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   925
	 * lb_logfile.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   926
	 * Hold a reference to the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   927
	 * "lf" structure. this is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   928
	 * same as LOG_FILE_HOLD()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   929
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   930
	mutex_enter(&(lbp)->lb_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   931
	lf = lbp->lb_logfile;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   932
	mutex_enter(&(lf)->lf_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   933
	mutex_exit(&(lbp)->lb_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   934
	lf->lf_refcnt++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   935
	mutex_exit(&(lf)->lf_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   936
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   937
	LOGGING_DPRINT((10, "nfslog_logbuffer_rename: renaming %s to %s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   938
		lf->lf_path, lbp->lb_path));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   939
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   940
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   941
	 * rename the current buffer to what the daemon expects
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   942
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   943
	if (error = nfslog_logfile_rename(lf->lf_path, lbp->lb_path))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   944
		goto out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   945
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   946
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   947
	 * Create a new working buffer file and have all new data sent there.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   948
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   949
	if (error = log_file_create(lbp->lb_path, &logfile)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   950
		/* Attempt to rename to original */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   951
		(void) nfslog_logfile_rename(lbp->lb_path, lf->lf_path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   952
		goto out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   953
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   954
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   955
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   956
	 * Hold the lb_lock here, this will make
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   957
	 * all the threads trying to access lb->logfile block
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   958
	 * and get a new logfile structure instead of old one.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   959
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   960
	mutex_enter(&(lbp)->lb_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   961
	lbp->lb_logfile = logfile;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   962
	mutex_exit(&(lbp)->lb_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   963
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   964
	LOG_FILE_RELE(lf);	/* release log_buffer's reference */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   965
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   966
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   967
	 * Wait for log_file to be in a quiescent state before we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   968
	 * return to our caller to let it proceed with the reading of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   969
	 * this file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   970
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   971
	nfslog_logfile_wait(lf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   972
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   973
out:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   974
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   975
	 * Release our reference on "lf" in two different cases.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   976
	 * 1. Error condition, release only the reference
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   977
	 *    that we held at the begining of this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   978
	 *    routine on "lf" structure.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   979
	 * 2. Fall through condition, no errors but the old
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   980
	 *    logfile structure "lf" has been replaced with
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   981
	 *    the new "logfile" structure, so release the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   982
	 *    reference that was part of the creation of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   983
	 *    "lf" structure to free up the resources.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   984
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   985
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   986
	LOG_FILE_RELE(lf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   987
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   988
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   989
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   990
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   991
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   992
 * Renames the 'from' file to 'new'.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   993
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   994
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   995
nfslog_logfile_rename(char *from, char *new)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   996
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   997
	int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   998
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   999
	if (error = vn_rename(from, new, UIO_SYSSPACE)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1000
		cmn_err(CE_WARN,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1001
			"nfslog_logfile_rename: couldn't rename %s to %s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1002
			from, new);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1003
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1004
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1005
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1006
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1007
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1008
 * Wait for the log_file writers to finish before returning
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1009
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1010
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1011
nfslog_logfile_wait(struct log_file *lf)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1012
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1013
	mutex_enter(&lf->lf_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1014
	while (lf->lf_writers > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1015
		lf->lf_flags |= L_WAITING;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1016
		(void) cv_wait_sig(&lf->lf_cv_waiters, &lf->lf_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1017
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1018
	mutex_exit(&lf->lf_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1019
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1020
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1021
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1022
nfslog_record_append2all(struct lr_alloc *lrp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1023
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1024
	struct log_buffer *lbp, *nlbp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1025
	int error, ret_error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1026
	int lr_flags = lrp->lr_flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1027
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1028
	rw_enter(&nfslog_buffer_list_lock, RW_READER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1029
	if ((lbp = nfslog_buffer_list) != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1030
		LOG_BUFFER_HOLD(lbp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1031
	for (nlbp = NULL; lbp != NULL; lbp = nlbp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1032
		if ((nlbp = lbp->lb_next) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1033
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1034
			 * Remember next element in the list
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1035
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1036
			LOG_BUFFER_HOLD(nlbp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1037
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1038
		rw_exit(&nfslog_buffer_list_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1039
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1040
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1041
		 * Insert the record on the buffer's list to be written
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1042
		 * and then flush the records to the log file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1043
		 * Make sure to set the no free flag so that the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1044
		 * record can be used for the next write
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1045
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1046
		lrp->lr_flags = LR_ALLOC_NOFREE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1047
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1048
		ASSERT(lbp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1049
		mutex_enter(&lbp->lb_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1050
		if (lbp->lb_records == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1051
			lbp->lb_records = (caddr_t)lrp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1052
			lbp->lb_num_recs = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1053
			lbp->lb_size_queued = lrp->size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1054
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1055
			insque(lrp, ((struct lr_alloc *)lbp->lb_records)->prev);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1056
			lbp->lb_num_recs++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1057
			lbp->lb_size_queued += lrp->size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1058
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1059
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1060
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1061
		 * Flush log records to disk.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1062
		 * Function is called with lb_lock held.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1063
		 * Function drops the lb_lock on return.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1064
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1065
		error = nfslog_records_flush_to_disk_nolock(lbp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1066
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1067
		if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1068
			ret_error = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1069
			nfs_cmn_err(error, CE_WARN,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1070
				"rfsl_log_pubfh: could not append record to "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1071
				"\"%s\" error = %m\n", lbp->lb_path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1072
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1073
		log_buffer_rele(lbp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1074
		rw_enter(&nfslog_buffer_list_lock, RW_READER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1075
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1076
	rw_exit(&nfslog_buffer_list_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1077
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1078
	lrp->lr_flags = lr_flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1079
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1080
	return (ret_error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1081
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1082
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1083
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1084
static int logging_debug = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1085
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1086
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1087
 * 0) no debugging
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1088
 * 3) current test software
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1089
 * 10) random stuff
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1090
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1091
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1092
nfslog_dprint(const int level, const char *fmt, ...)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1093
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1094
	va_list args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1095
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1096
	if (logging_debug == level ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1097
	    (logging_debug > 10 && (logging_debug - 10) >= level)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1098
		va_start(args, fmt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1099
		(void) vprintf(fmt, args);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1100
		va_end(args);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1101
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1102
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1103
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1104
#endif /* DEBUG */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1105
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1106
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1107
 * NFS Log Flush system call
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1108
 * Caller must check privileges.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1109
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1110
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1111
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1112
nfsl_flush(struct nfsl_flush_args *args, model_t model)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1113
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1114
	struct flush_thread_params *tparams;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1115
	struct nfsl_flush_args *nfsl_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1116
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1117
	ulong_t buffer_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1118
	STRUCT_HANDLE(nfsl_flush_args, uap);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1119
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1120
	STRUCT_SET_HANDLE(uap, model, args);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1121
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1122
	tparams = (struct flush_thread_params *)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1123
		kmem_zalloc(sizeof (*tparams), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1124
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1125
	nfsl_args = &tparams->tp_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1126
	nfsl_args->version =  STRUCT_FGET(uap, version);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1127
	if (nfsl_args->version != NFSL_FLUSH_ARGS_VERS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1128
		cmn_err(CE_WARN, "nfsl_flush: exected version %d, got %d",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1129
			NFSL_FLUSH_ARGS_VERS, nfsl_args->version);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1130
		return (EIO);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1131
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1132
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1133
	nfsl_args->directive = STRUCT_FGET(uap, directive);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1134
	if ((nfsl_args->directive & NFSL_ALL) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1135
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1136
		 * Process a specific buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1137
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1138
		nfsl_args->buff_len = STRUCT_FGET(uap, buff_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1139
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1140
		nfsl_args->buff = (char *)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1141
			kmem_alloc(nfsl_args->buff_len, KM_NOSLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1142
		if (nfsl_args->buff == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1143
			return (ENOMEM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1144
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1145
		error = copyinstr((const char *)STRUCT_FGETP(uap, buff),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1146
			nfsl_args->buff, nfsl_args->buff_len, &buffer_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1147
		if (error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1148
			return (EFAULT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1149
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1150
		if (nfsl_args->buff_len != buffer_len)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1151
			return (EFAULT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1152
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1153
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1154
	LOGGING_DPRINT((10, "nfsl_flush: Flushing %s buffer(s)\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1155
		nfsl_args->directive & NFSL_ALL ? "all" : nfsl_args->buff));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1156
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1157
	if (nfsl_args->directive & NFSL_SYNC) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1158
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1159
		 * Do the work synchronously
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1160
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1161
		nfslog_do_flush(tparams);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1162
		error = tparams->tp_error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1163
		kmem_free(nfsl_args->buff, nfsl_args->buff_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1164
		kmem_free(tparams, sizeof (*tparams));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1165
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1166
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1167
		 * Do the work asynchronously
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1168
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1169
		(void) thread_create(NULL, 0, nfslog_do_flush,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1170
		    tparams, 0, &p0, TS_RUN, minclsyspri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1171
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1172
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1173
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1174
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1175
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1176
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1177
 * This is where buffer flushing would occur, but there is no buffering
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1178
 * at this time.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1179
 * Possibly rename the log buffer for processing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1180
 * Sets tparams->ta_error equal to the value of the error that occured,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1181
 * 0 otherwise.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1182
 * Returns ENOENT if the buffer is not found.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1183
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1184
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1185
nfslog_do_flush(struct flush_thread_params *tparams)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1186
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1187
	struct nfsl_flush_args *args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1188
	struct log_buffer *lbp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1189
	int error = ENOENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1190
	int found = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1191
	char *buf_inprog;	/* name of buff in progress */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1192
	int buf_inprog_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1193
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1194
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1195
	 * Sanity check on the arguments.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1196
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1197
	if (!tparams)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1198
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1199
	args = &tparams->tp_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1200
	if (!args)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1201
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1202
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1203
	rw_enter(&nfslog_buffer_list_lock, RW_READER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1204
	for (lbp = nfslog_buffer_list; lbp != NULL; lbp = lbp->lb_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1205
		if (args->directive & NFSL_ALL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1206
			(void) nfslog_records_flush_to_disk(lbp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1207
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1208
			if ((strcmp(lbp->lb_path, args->buff) == 0) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1209
				(args->directive & NFSL_RENAME)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1210
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1211
				error = nfslog_logbuffer_rename(lbp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1212
				found++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1213
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1214
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1215
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1216
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1217
	rw_exit(&nfslog_buffer_list_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1218
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1219
	if (!found && ((args->directive & NFSL_ALL) == 0) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1220
	    (args->directive & NFSL_RENAME)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1221
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1222
		 * The specified buffer is not currently in use,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1223
		 * simply rename the file indicated.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1224
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1225
		buf_inprog_len = strlen(args->buff) +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1226
			strlen(LOG_INPROG_STRING) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1227
		buf_inprog = (caddr_t)kmem_alloc(buf_inprog_len, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1228
		(void) sprintf(buf_inprog, "%s%s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1229
			args->buff, LOG_INPROG_STRING);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1230
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1231
		error = nfslog_logfile_rename(buf_inprog, args->buff);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1232
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1233
		kmem_free(buf_inprog, buf_inprog_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1234
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1235
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1236
out:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1237
	if ((args->directive & NFSL_SYNC) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1238
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1239
		 * Work was performed asynchronously, the caller is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1240
		 * no longer waiting for us.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1241
		 * Free the thread arguments and exit.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1242
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1243
		kmem_free(args->buff, args->buff_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1244
		kmem_free(tparams, sizeof (*tparams));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1245
		thread_exit();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1246
		/* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1247
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1248
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1249
	tparams->tp_error = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1250
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1251
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1252
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1253
 * Generate buffer_header.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1254
 * 'loghdr' points the the buffer_header, and *reclen
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1255
 * contains the length of the buffer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1256
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1257
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1258
create_buffer_header(caddr_t *loghdr, size_t *reclen, size_t *freesize)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1259
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1260
	timestruc_t		now;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1261
	nfslog_buffer_header	lh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1262
	XDR			xdrs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1263
	unsigned int		final_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1264
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1265
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1266
	/* pick some size that will hold the buffer_header */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1267
	*freesize = NFSLOG_SMALL_RECORD_SIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1268
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1269
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1270
	 * Fill header
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1271
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1272
	lh.bh_length = 0;	/* don't know yet how large it will be */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1273
	lh.bh_version = NFSLOG_BUF_VERSION;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1274
	lh.bh_flags = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1275
	lh.bh_offset = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1276
	gethrestime(&now);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1277
	TIMESPEC_TO_TIMESPEC32(&lh.bh_timestamp, &now);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1278
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1279
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1280
	 * Encode the header
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1281
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1282
	*loghdr = (caddr_t)kmem_alloc(*freesize, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1283
	xdrmem_create(&xdrs, *loghdr, *freesize, XDR_ENCODE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1284
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1285
	(void) xdr_nfslog_buffer_header(&xdrs, &lh);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1286
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1287
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1288
	 * Reset with final size of the encoded data
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1289
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1290
	final_size = xdr_getpos(&xdrs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1291
	xdr_setpos(&xdrs, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1292
	(void) xdr_u_int(&xdrs, &final_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1293
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1294
	*reclen = (size_t)final_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1295
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1296
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1297
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1298
 * ****************************************************************
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1299
 * RPC dispatch table for logging
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1300
 * Indexed by program, version, proc
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1301
 * Based on NFS dispatch table.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1302
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1303
struct nfslog_proc_disp {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1304
	bool_t	(*xdrargs)();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1305
	bool_t	(*xdrres)();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1306
	bool_t	affects_transactions;	/* Operation affects transaction */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1307
					/* processing */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1308
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1309
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1310
struct nfslog_vers_disp {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1311
	int	nfslog_dis_nprocs;			/* number of procs */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1312
	struct nfslog_proc_disp	*nfslog_dis_proc_table;	/* proc array */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1313
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1314
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1315
struct nfslog_prog_disp {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1316
	int	nfslog_dis_prog;		/* program number */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1317
	int	nfslog_dis_versmin;		/* Minimum version value */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1318
	int	nfslog_dis_nvers;		/* Number of version values */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1319
	struct nfslog_vers_disp	*nfslog_dis_vers_table;	/* versions array */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1320
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1321
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1322
static int rfs_log_bad = 0;	/* incremented on bad log attempts */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1323
static int rfs_log_good = 0;	/* incremented on successful log attempts */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1324
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1325
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1326
 * Define the actions taken per prog/vers/proc:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1327
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1328
 * In some cases, the nl types are the same as the nfs types and a simple
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1329
 * bcopy should suffice. Rather that define tens of identical procedures,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1330
 * simply define these to bcopy. Similarly this takes care of different
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1331
 * procs that use same parameter struct.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1332
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1333
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1334
static struct nfslog_proc_disp nfslog_proc_v2[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1335
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1336
	 * NFS VERSION 2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1337
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1338
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1339
	/* RFS_NULL = 0 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1340
	{xdr_void, xdr_void, FALSE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1341
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1342
	/* RFS_GETATTR = 1 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1343
	{xdr_fhandle, xdr_nfslog_getattrres, FALSE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1344
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1345
	/* RFS_SETATTR = 2 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1346
	{xdr_nfslog_setattrargs, xdr_nfsstat, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1347
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1348
	/* RFS_ROOT = 3 *** NO LONGER SUPPORTED *** */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1349
	{xdr_void, xdr_void, FALSE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1350
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1351
	/* RFS_LOOKUP = 4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1352
	{xdr_nfslog_diropargs, xdr_nfslog_diropres, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1353
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1354
	/* RFS_READLINK = 5 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1355
	{xdr_fhandle, xdr_nfslog_rdlnres, FALSE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1356
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1357
	/* RFS_READ = 6 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1358
	{xdr_nfslog_nfsreadargs, xdr_nfslog_rdresult, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1359
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1360
	/* RFS_WRITECACHE = 7 *** NO LONGER SUPPORTED *** */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1361
	{xdr_void, xdr_void, FALSE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1362
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1363
	/* RFS_WRITE = 8 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1364
	{xdr_nfslog_writeargs, xdr_nfslog_writeresult, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1365
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1366
	/* RFS_CREATE = 9 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1367
	{xdr_nfslog_createargs, xdr_nfslog_diropres, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1368
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1369
	/* RFS_REMOVE = 10 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1370
	{xdr_nfslog_diropargs, xdr_nfsstat, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1371
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1372
	/* RFS_RENAME = 11 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1373
	{xdr_nfslog_rnmargs, xdr_nfsstat, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1374
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1375
	/* RFS_LINK = 12 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1376
	{xdr_nfslog_linkargs, xdr_nfsstat, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1377
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1378
	/* RFS_SYMLINK = 13 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1379
	{xdr_nfslog_symlinkargs, xdr_nfsstat, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1380
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1381
	/* RFS_MKDIR = 14 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1382
	{xdr_nfslog_createargs, xdr_nfslog_diropres, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1383
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1384
	/* RFS_RMDIR = 15 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1385
	{xdr_nfslog_diropargs, xdr_nfsstat, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1386
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1387
	/* RFS_READDIR = 16 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1388
	{xdr_nfslog_rddirargs, xdr_nfslog_rddirres, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1389
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1390
	/* RFS_STATFS = 17 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1391
	{xdr_fhandle, xdr_nfslog_statfs, FALSE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1392
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1393
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1394
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1395
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1396
 * NFS VERSION 3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1397
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1398
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1399
static struct nfslog_proc_disp nfslog_proc_v3[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1400
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1401
	/* NFSPROC3_NULL = 0 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1402
	{xdr_void, xdr_void, FALSE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1403
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1404
	/* NFSPROC3_GETATTR = 1 */
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 0
diff changeset
  1405
	{xdr_nfslog_nfs_fh3, xdr_nfslog_GETATTR3res, FALSE},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1406
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1407
	/* NFSPROC3_SETATTR = 2 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1408
	{xdr_nfslog_SETATTR3args, xdr_nfslog_SETATTR3res, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1409
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1410
	/* NFSPROC3_LOOKUP = 3 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1411
	{xdr_nfslog_diropargs3, xdr_nfslog_LOOKUP3res, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1412
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1413
	/* NFSPROC3_ACCESS = 4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1414
	{xdr_nfslog_ACCESS3args, xdr_nfslog_ACCESS3res, FALSE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1415
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1416
	/* NFSPROC3_READLINK = 5 */
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 0
diff changeset
  1417
	{xdr_nfslog_nfs_fh3, xdr_nfslog_READLINK3res, FALSE},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1418
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1419
	/* NFSPROC3_READ = 6 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1420
	{xdr_nfslog_READ3args, xdr_nfslog_READ3res, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1421
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1422
	/* NFSPROC3_WRITE = 7 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1423
	{xdr_nfslog_WRITE3args, xdr_nfslog_WRITE3res, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1424
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1425
	/* NFSPROC3_CREATE = 8 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1426
	{xdr_nfslog_CREATE3args, xdr_nfslog_CREATE3res, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1427
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1428
	/* NFSPROC3_MKDIR = 9 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1429
	{xdr_nfslog_MKDIR3args, xdr_nfslog_MKDIR3res, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1430
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1431
	/* NFSPROC3_SYMLINK = 10 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1432
	{xdr_nfslog_SYMLINK3args, xdr_nfslog_SYMLINK3res, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1433
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1434
	/* NFSPROC3_MKNOD = 11 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1435
	{xdr_nfslog_MKNOD3args, xdr_nfslog_MKNOD3res, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1436
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1437
	/* NFSPROC3_REMOVE = 12 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1438
	{xdr_nfslog_REMOVE3args, xdr_nfslog_REMOVE3res, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1439
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1440
	/* NFSPROC3_RMDIR = 13 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1441
	{xdr_nfslog_RMDIR3args, xdr_nfslog_RMDIR3res, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1442
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1443
	/* NFSPROC3_RENAME = 14 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1444
	{xdr_nfslog_RENAME3args, xdr_nfslog_RENAME3res, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1445
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1446
	/* NFSPROC3_LINK = 15 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1447
	{xdr_nfslog_LINK3args, xdr_nfslog_LINK3res, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1448
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1449
	/* NFSPROC3_READDIR = 16 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1450
	{xdr_nfslog_READDIR3args, xdr_nfslog_READDIR3res, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1451
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1452
	/* NFSPROC3_READDIRPLUS = 17 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1453
	{xdr_nfslog_READDIRPLUS3args, xdr_nfslog_READDIRPLUS3res, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1454
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1455
	/* NFSPROC3_FSSTAT = 18 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1456
	{xdr_nfslog_FSSTAT3args, xdr_nfslog_FSSTAT3res, FALSE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1457
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1458
	/* NFSPROC3_FSINFO = 19 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1459
	{xdr_nfslog_FSINFO3args, xdr_nfslog_FSINFO3res, FALSE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1460
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1461
	/* NFSPROC3_PATHCONF = 20 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1462
	{xdr_nfslog_PATHCONF3args, xdr_nfslog_PATHCONF3res, FALSE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1463
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1464
	/* NFSPROC3_COMMIT = 21 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1465
	{xdr_nfslog_COMMIT3args, xdr_nfslog_COMMIT3res, FALSE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1466
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1467
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1468
static struct nfslog_proc_disp nfslog_proc_v1[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1469
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1470
	 * NFSLOG VERSION 1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1471
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1472
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1473
	/* NFSLOG_NULL = 0 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1474
	{xdr_void, xdr_void, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1475
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1476
	/* NFSLOG_SHARE = 1 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1477
	{xdr_nfslog_sharefsargs, xdr_nfslog_sharefsres, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1478
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1479
	/* NFSLOG_UNSHARE = 2 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1480
	{xdr_nfslog_sharefsargs, xdr_nfslog_sharefsres, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1481
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1482
	/* NFSLOG_LOOKUP = 3 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1483
	{xdr_nfslog_diropargs3, xdr_nfslog_LOOKUP3res, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1484
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1485
	/* NFSLOG_GETFH = 4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1486
	{xdr_nfslog_getfhargs, xdr_nfsstat, TRUE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1487
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1488
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1489
static struct nfslog_vers_disp nfslog_vers_disptable[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1490
	{sizeof (nfslog_proc_v2) / sizeof (nfslog_proc_v2[0]),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1491
	    nfslog_proc_v2},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1492
	{sizeof (nfslog_proc_v3) / sizeof (nfslog_proc_v3[0]),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1493
	    nfslog_proc_v3},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1494
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1495
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1496
static struct nfslog_vers_disp nfslog_nfslog_vers_disptable[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1497
	{sizeof (nfslog_proc_v1) / sizeof (nfslog_proc_v1[0]),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1498
	    nfslog_proc_v1},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1499
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1500
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1501
static struct nfslog_prog_disp nfslog_dispatch_table[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1502
	{NFS_PROGRAM, NFS_VERSMIN,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1503
		(sizeof (nfslog_vers_disptable) /
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1504
		sizeof (nfslog_vers_disptable[0])),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1505
		nfslog_vers_disptable},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1506
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1507
	{NFSLOG_PROGRAM, NFSLOG_VERSMIN,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1508
		(sizeof (nfslog_nfslog_vers_disptable) /
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1509
		sizeof (nfslog_nfslog_vers_disptable[0])),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1510
		nfslog_nfslog_vers_disptable},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1511
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1512
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1513
static int	nfslog_dispatch_table_arglen = sizeof (nfslog_dispatch_table) /
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1514
					sizeof (nfslog_dispatch_table[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1515
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1516
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1517
 * This function will determine the appropriate export info struct to use
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1518
 * and allocate a record id to be used in the written log buffer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1519
 * Usually this is a straightforward operation but the existence of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1520
 * multicomponent lookup and its semantics of crossing file system
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1521
 * boundaries add to the complexity.  See the comments below...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1522
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1523
struct exportinfo *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1524
nfslog_get_exi(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1525
	struct exportinfo *exi,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1526
	struct svc_req *req,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1527
	caddr_t res,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1528
	unsigned int *nfslog_rec_id)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1529
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1530
	struct log_buffer *lb;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1531
	struct exportinfo *exi_ret = NULL;
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 0
diff changeset
  1532
	fhandle_t		*fh;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1533
	nfs_fh3			*fh3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1534
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1535
	if (exi == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1536
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1537
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1538
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1539
	 * If the exi is marked for logging, allocate a record id and return
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1540
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1541
	if (exi->exi_export.ex_flags & EX_LOG) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1542
		lb = exi->exi_logbuffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1543
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1544
		/* obtain the unique record id for the caller */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1545
		*nfslog_rec_id = atomic_add_32_nv(&lb->lb_rec_id, (int32_t)1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1546
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1547
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1548
		 * The caller will expect to be able to exi_rele() it,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1549
		 * so exi->exi_count must be incremented before it can
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1550
		 * be returned, to make it uniform with exi_ret->exi_count
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1551
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1552
		mutex_enter(&exi->exi_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1553
		exi->exi_count++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1554
		mutex_exit(&exi->exi_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1555
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1556
		return (exi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1557
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1558
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1559
	if (exi != exi_public)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1560
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1561
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1562
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1563
	 * Here we have an exi that is not marked for logging.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1564
	 * It is possible that this request is a multicomponent lookup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1565
	 * that was done from the public file handle (not logged) and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1566
	 * the resulting file handle being returned to the client exists
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1567
	 * in a file system that is being logged.  If this is the case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1568
	 * we need to log this multicomponent lookup to the appropriate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1569
	 * log buffer.  This will allow for the appropriate path name
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1570
	 * mapping to occur at user level.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1571
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1572
	if (req->rq_prog == NFS_PROGRAM) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1573
		switch (req->rq_vers) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1574
		case NFS_V3:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1575
			if ((req->rq_proc == NFSPROC3_LOOKUP) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1576
				(((LOOKUP3res *)res)->status == NFS3_OK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1577
				fh3 = &((LOOKUP3res *)res)->res_u.ok.object;
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 0
diff changeset
  1578
				exi_ret = checkexport(&fh3->fh3_fsid,
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 0
diff changeset
  1579
					FH3TOXFIDP(fh3));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1580
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1581
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1582
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1583
		case NFS_VERSION:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1584
			if ((req->rq_proc == RFS_LOOKUP) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1585
				(((struct nfsdiropres *)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1586
					res)->dr_status == NFS_OK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1587
				fh =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1588
		&((struct nfsdiropres *)res)->dr_u.dr_drok_u.drok_fhandle;
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 0
diff changeset
  1589
				exi_ret = checkexport(&fh->fh_fsid,
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 0
diff changeset
  1590
					(fid_t *)&fh->fh_xlen);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1591
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1592
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1593
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1594
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1595
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1596
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1597
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1598
	if (exi_ret != NULL && exi_ret->exi_export.ex_flags & EX_LOG) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1599
		lb = exi_ret->exi_logbuffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1600
		/* obtain the unique record id for the caller */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1601
		*nfslog_rec_id = atomic_add_32_nv(&lb->lb_rec_id, (int32_t)1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1602
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1603
		return (exi_ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1604
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1605
	return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1606
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1607
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1608
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1609
static long long rfslog_records_ignored = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1610
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1611
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1612
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1613
 * nfslog_write_record - Fill in the record buffer for writing out.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1614
 * If logrecp is null, log it, otherwise, malloc the record and return it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1615
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1616
 * It is the responsibility of the caller to check whether this exportinfo
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1617
 * has logging enabled.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1618
 * Note that nfslog_share_public_record() only needs to check for the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1619
 * existence of at least one logbuffer to which the public filehandle record
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1620
 * needs to be logged.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1621
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1622
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1623
nfslog_write_record(struct exportinfo *exi, struct svc_req *req,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1624
	caddr_t args, caddr_t res, cred_t *cr, struct netbuf *pnb,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1625
	unsigned int record_id, unsigned int which_buffers)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1626
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1627
	struct nfslog_prog_disp	*progtable;	/* prog struct */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1628
	struct nfslog_vers_disp	*verstable;	/* version struct */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1629
	struct nfslog_proc_disp	*disp = NULL;	/* proc struct */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1630
	int			i, vers;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1631
	void			*log_cookie;	/* for logrecord if */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1632
	caddr_t			buffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1633
	XDR			xdrs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1634
	unsigned int		final_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1635
	int			encode_ok;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1636
	int			alloc_indx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1637
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1638
	ASSERT(exi != NULL); ASSERT(req != NULL); ASSERT(args != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1639
	ASSERT(res != NULL); ASSERT(cr != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1640
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1641
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1642
	 * Find program element
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1643
	 * Search the list since program can not be used as index
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1644
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1645
	for (i = 0; (i < nfslog_dispatch_table_arglen); i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1646
		if (req->rq_prog == nfslog_dispatch_table[i].nfslog_dis_prog)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1647
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1648
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1649
	if (i >= nfslog_dispatch_table_arglen) {	/* program not logged */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1650
		/* not an error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1651
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1652
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1653
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1654
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1655
	 * Extract the dispatch functions based on program/version
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1656
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1657
	progtable = &nfslog_dispatch_table[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1658
	vers = req->rq_vers - progtable->nfslog_dis_versmin;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1659
	verstable = &progtable->nfslog_dis_vers_table[vers];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1660
	disp = &verstable->nfslog_dis_proc_table[req->rq_proc];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1661
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1662
	if (!(exi->exi_export.ex_flags & EX_LOG_ALLOPS) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1663
	    !disp->affects_transactions) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1664
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1665
		 * Only interested in logging operations affecting
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1666
		 * transaction generation. This is not one of them.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1667
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1668
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1669
		rfslog_records_ignored++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1670
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1671
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1672
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1673
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1674
	switch (req->rq_prog) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1675
	case NFS_PROGRAM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1676
		switch (req->rq_vers) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1677
		case NFS_V3:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1678
			switch (req->rq_proc) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1679
			case NFSPROC3_READDIRPLUS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1680
				alloc_indx = MEDIUM_INDX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1681
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1682
			default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1683
				alloc_indx = SMALL_INDX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1684
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1685
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1686
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1687
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1688
			alloc_indx = SMALL_INDX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1689
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1690
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1691
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1692
	case NFSLOG_PROGRAM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1693
		alloc_indx = MEDIUM_INDX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1694
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1695
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1696
		alloc_indx = SMALL_INDX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1697
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1698
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1699
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1700
	do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1701
		encode_ok = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1702
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1703
		/* Pick the size to alloc; end of the road - return */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1704
		if (nfslog_mem_alloc[alloc_indx].size == (-1)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1705
			cmn_err(CE_WARN,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1706
				"NFSLOG: unable to encode record - prog=%d "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1707
				"proc = %d", req->rq_prog, req->rq_proc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1708
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1709
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1710
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1711
		buffer = nfslog_record_alloc(exi, alloc_indx, &log_cookie, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1712
		if (buffer == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1713
			/* Error processing - no space alloced */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1714
			rfs_log_bad++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1715
			cmn_err(CE_WARN, "NFSLOG: can't get record");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1716
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1717
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1718
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1719
		xdrmem_create(&xdrs, buffer,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1720
			nfslog_mem_alloc[alloc_indx].size, XDR_ENCODE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1721
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1722
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1723
		 * Encode the header, args and results of the record
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1724
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1725
		if (xdr_nfslog_request_record(&xdrs, exi, req, cr, pnb,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1726
			nfslog_mem_alloc[alloc_indx].size, record_id) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1727
			(*disp->xdrargs)(&xdrs, args) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1728
			(*disp->xdrres)(&xdrs, res)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1729
				encode_ok = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1730
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1731
				rfs_log_good++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1732
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1733
				 * Get the final size of the encoded
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1734
				 * data and insert that length at the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1735
				 * beginning.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1736
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1737
				final_size = xdr_getpos(&xdrs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1738
				xdr_setpos(&xdrs, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1739
				(void) xdr_u_int(&xdrs, &final_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1740
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1741
			/* Oops, the encode failed so we need to free memory */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1742
			nfslog_record_put(log_cookie, 0, FALSE, which_buffers);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1743
			alloc_indx++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1744
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1745
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1746
	} while (encode_ok == FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1747
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1748
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1749
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1750
	 * Take the final log record and put it in the log file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1751
	 * This may be queued to the file internally and written
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1752
	 * later unless the last parameter is TRUE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1753
	 * If the record_id is 0 then this is most likely a share/unshare
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1754
	 * request and it should be written synchronously to the log file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1755
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1756
	nfslog_record_put(log_cookie, final_size,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1757
		(record_id == 0), which_buffers);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1758
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1759
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1760
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1761
get_publicfh_path(int *alloc_length)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1762
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1763
	extern struct exportinfo *exi_public;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1764
	char *pubpath;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1765
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1766
	rw_enter(&exported_lock, RW_READER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1767
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1768
	*alloc_length = exi_public->exi_export.ex_pathlen + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1769
	pubpath = kmem_alloc(*alloc_length, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1770
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1771
	(void) strcpy(pubpath, exi_public->exi_export.ex_path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1772
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1773
	rw_exit(&exported_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1774
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1775
	return (pubpath);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1776
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1777
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1778
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1779
log_public_record(struct exportinfo *exi, cred_t *cr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1780
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1781
	struct svc_req	req;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1782
	struct netbuf	nb = {0, 0, NULL};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1783
	int free_length = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1784
	diropargs3 args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1785
	LOOKUP3res res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1786
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1787
	bzero(&req, sizeof (req));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1788
	req.rq_prog = NFSLOG_PROGRAM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1789
	req.rq_vers = NFSLOG_VERSION;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1790
	req.rq_proc = NFSLOG_LOOKUP;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1791
	req.rq_cred.oa_flavor = AUTH_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1792
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1793
	bzero(&args, sizeof (diropargs3));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1794
	bzero(&res, sizeof (LOOKUP3res));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1795
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1796
	args.dir.fh3_length = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1797
	if ((args.name = get_publicfh_path(&free_length)) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1798
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1799
	args.dirp = &args.dir;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1800
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1801
	res.status = NFS3_OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1802
	res.res_u.ok.object.fh3_length = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1803
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1804
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1805
	 * Calling this function with the exi_public
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1806
	 * will have the effect of appending the record
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1807
	 * to each of the open log buffers
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1808
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1809
	nfslog_write_record(exi, &req,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1810
		(caddr_t)&args, (caddr_t)&res, cr, &nb, 0, NFSLOG_ALL_BUFFERS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1811
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1812
	kmem_free(args.name, free_length);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1813
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1814
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1815
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1816
 * nfslog_share_record - logs a share request.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1817
 * This is not an NFS request, but we pretend here...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1818
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1819
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1820
nfslog_share_record(struct exportinfo *exi, cred_t *cr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1821
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1822
	struct svc_req	req;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1823
	int		res = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1824
	struct netbuf	nb = {0, 0, NULL};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1825
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1826
	ASSERT(exi != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1827
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1828
	if (nfslog_buffer_list == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1829
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1830
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1831
	if (exi->exi_export.ex_flags & EX_LOG) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1832
		bzero(&req, sizeof (req));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1833
		req.rq_prog = NFSLOG_PROGRAM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1834
		req.rq_vers = NFSLOG_VERSION;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1835
		req.rq_proc = NFSLOG_SHARE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1836
		req.rq_cred.oa_flavor = AUTH_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1837
		nfslog_write_record(exi, &req,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1838
			(caddr_t)exi, (caddr_t)&res, cr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1839
			&nb, 0, NFSLOG_ONE_BUFFER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1840
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1841
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1842
	log_public_record(exi, cr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1843
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1844
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1845
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1846
 * nfslog_unshare_record - logs an unshare request.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1847
 * This is not an NFS request, but we pretend here...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1848
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1849
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1850
nfslog_unshare_record(struct exportinfo *exi, cred_t *cr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1851
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1852
	struct svc_req	req;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1853
	int		res = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1854
	struct netbuf	nb = {0, 0, NULL};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1855
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1856
	ASSERT(exi != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1857
	ASSERT(exi->exi_export.ex_flags & EX_LOG);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1858
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1859
	bzero(&req, sizeof (req));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1860
	req.rq_prog = NFSLOG_PROGRAM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1861
	req.rq_vers = NFSLOG_VERSION;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1862
	req.rq_proc = NFSLOG_UNSHARE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1863
	req.rq_cred.oa_flavor = AUTH_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1864
	nfslog_write_record(exi, &req,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1865
		(caddr_t)exi, (caddr_t)&res, cr, &nb, 0, NFSLOG_ONE_BUFFER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1866
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1867
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1868
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1869
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1870
nfslog_getfh(struct exportinfo *exi,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1871
	fhandle *fh,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1872
	char *fname,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1873
	enum uio_seg seg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1874
	cred_t *cr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1875
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1876
	struct svc_req	req;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1877
	int		res = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1878
	struct netbuf	nb = {0, 0, NULL};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1879
	int		error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1880
	char		*namebuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1881
	size_t		len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1882
	nfslog_getfhargs gfh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1883
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1884
	ASSERT(exi != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1885
	ASSERT(exi->exi_export.ex_flags & EX_LOG);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1886
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1887
	bzero(&req, sizeof (req));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1888
	req.rq_prog = NFSLOG_PROGRAM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1889
	req.rq_vers = NFSLOG_VERSION;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1890
	req.rq_proc = NFSLOG_GETFH;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1891
	req.rq_cred.oa_flavor = AUTH_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1892
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1893
	namebuf = kmem_alloc(MAXPATHLEN + 4, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1894
	if (seg == UIO_USERSPACE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1895
		error = copyinstr(fname, namebuf, MAXPATHLEN, &len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1896
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1897
		error = copystr(fname, namebuf, MAXPATHLEN, &len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1898
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1899
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1900
	if (!error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1901
		gfh.gfh_fh_buf = *fh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1902
		gfh.gfh_path = namebuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1903
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1904
		nfslog_write_record(exi, &req,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1905
			(caddr_t)&gfh, (caddr_t)&res, cr, &nb, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1906
			NFSLOG_ONE_BUFFER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1907
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1908
	kmem_free(namebuf, MAXPATHLEN + 4);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1909
}