1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 /* 28 * This file contains interface definitions and wrappers for file 29 * system snapshot support. File systems may depend on this module 30 * for symbol resolution while the implementation may remain unloaded 31 * until needed. 32 */ 33 #include <sys/types.h> 34 #include <sys/debug.h> 35 #include <sys/t_lock.h> 36 #include <sys/param.h> 37 #include <sys/mman.h> 38 #include <sys/systm.h> 39 #include <sys/errno.h> 40 #include <sys/kmem.h> 41 #include <sys/cmn_err.h> 42 #include <sys/vnode.h> 43 #include <sys/debug.h> 44 #include <sys/proc.h> 45 #include <sys/user.h> 46 #include <sys/conf.h> 47 #include <sys/modctl.h> 48 #include <sys/fssnap_if.h> 49 50 struct fssnap_operations snapops = { 51 NULL, /* fssnap_create */ 52 NULL, /* fssnap_set_candidate */ 53 NULL, /* fssnap_is_candidate */ 54 NULL, /* fssnap_create_done */ 55 NULL, /* fssnap_delete */ 56 NULL /* fssnap_strategy */ 57 }; 58 59 void * 60 fssnap_create(chunknumber_t nchunks, uint_t chunksz, u_offset_t maxsize, 61 struct vnode *fsvp, int backfilecount, struct vnode **bfvpp, char *backpath, 62 u_offset_t max_backfile_size) 63 { 64 void *snapid = NULL; 65 66 if (snapops.fssnap_create) 67 snapid = (snapops.fssnap_create)(nchunks, chunksz, maxsize, 68 fsvp, backfilecount, bfvpp, backpath, max_backfile_size); 69 70 return (snapid); 71 } 72 73 void 74 fssnap_set_candidate(void *snapshot_id, chunknumber_t chunknumber) 75 { 76 if (snapops.fssnap_set_candidate) 77 (snapops.fssnap_set_candidate)(snapshot_id, chunknumber); 78 } 79 80 int 81 fssnap_is_candidate(void *snapshot_id, u_offset_t off) 82 { 83 int rc = 0; 84 85 if (snapops.fssnap_is_candidate) 86 rc = (snapops.fssnap_is_candidate)(snapshot_id, off); 87 88 return (rc); 89 } 90 91 int 92 fssnap_create_done(void *snapshot_id) 93 { 94 int snapslot = -1; 95 96 if (snapops.fssnap_create_done) 97 snapslot = (snapops.fssnap_create_done)(snapshot_id); 98 99 return (snapslot); 100 } 101 102 int 103 fssnap_delete(void *snapshot_id) 104 { 105 int snapslot = -1; 106 107 if (snapops.fssnap_delete) 108 snapslot = (snapops.fssnap_delete)(snapshot_id); 109 110 return (snapslot); 111 } 112 113 void 114 fssnap_strategy(void *snapshot_id, struct buf *bp) 115 { 116 if (snapops.fssnap_strategy) 117 (snapops.fssnap_strategy)(snapshot_id, bp); 118 } 119 120 121 #include <sys/modctl.h> 122 123 extern struct mod_ops mod_miscops; 124 125 static struct modlmisc modlmisc = { 126 &mod_miscops, "File System Snapshot Interface", 127 }; 128 129 static struct modlinkage modlinkage = { 130 MODREV_1, { (void *)&modlmisc, NULL } 131 }; 132 133 int 134 _init(void) 135 { 136 return (mod_install(&modlinkage)); 137 } 138 139 /* 140 * Unloading is MT-safe because our client drivers use 141 * the _depends_on[] mechanism - we won't go while they're 142 * still around. 143 */ 144 int 145 _fini(void) 146 { 147 return (mod_remove(&modlinkage)); 148 } 149 150 int 151 _info(struct modinfo *modinfop) 152 { 153 return (mod_info(&modlinkage, modinfop)); 154 }