pseudofs.c (158611) | pseudofs.c (167482) |
---|---|
1/*- 2 * Copyright (c) 2001 Dag-Erling Co�dan Sm�rgrav 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 13 unchanged lines hidden (view full) --- 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2001 Dag-Erling Co�dan Sm�rgrav 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 13 unchanged lines hidden (view full) --- 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29#include <sys/cdefs.h> |
30__FBSDID("$FreeBSD: head/sys/fs/pseudofs/pseudofs.c 158611 2006-05-15 19:42:10Z kbyanc $"); | 30__FBSDID("$FreeBSD: head/sys/fs/pseudofs/pseudofs.c 167482 2007-03-12 12:16:52Z des $"); |
31 32#include "opt_pseudofs.h" 33 34#include <sys/param.h> 35#include <sys/kernel.h> 36#include <sys/systm.h> 37#include <sys/lock.h> 38#include <sys/malloc.h> --- 78 unchanged lines hidden (view full) --- 117 return (0); 118} 119 120/* 121 * Create a directory 122 */ 123struct pfs_node * 124pfs_create_dir(struct pfs_node *parent, const char *name, | 31 32#include "opt_pseudofs.h" 33 34#include <sys/param.h> 35#include <sys/kernel.h> 36#include <sys/systm.h> 37#include <sys/lock.h> 38#include <sys/malloc.h> --- 78 unchanged lines hidden (view full) --- 117 return (0); 118} 119 120/* 121 * Create a directory 122 */ 123struct pfs_node * 124pfs_create_dir(struct pfs_node *parent, const char *name, |
125 pfs_attr_t attr, pfs_vis_t vis, int flags) | 125 pfs_attr_t attr, pfs_vis_t vis, pfs_destroy_t destroy, 126 int flags) |
126{ 127 struct pfs_node *dir; 128 129 KASSERT(strlen(name) < PFS_NAMELEN, 130 ("%s(): node name is too long", __func__)); 131 132 MALLOC(dir, struct pfs_node *, sizeof *dir, 133 M_PFSNODES, M_WAITOK|M_ZERO); 134 strcpy(dir->pn_name, name); 135 dir->pn_type = (flags & PFS_PROCDEP) ? pfstype_procdir : pfstype_dir; 136 dir->pn_attr = attr; 137 dir->pn_vis = vis; | 127{ 128 struct pfs_node *dir; 129 130 KASSERT(strlen(name) < PFS_NAMELEN, 131 ("%s(): node name is too long", __func__)); 132 133 MALLOC(dir, struct pfs_node *, sizeof *dir, 134 M_PFSNODES, M_WAITOK|M_ZERO); 135 strcpy(dir->pn_name, name); 136 dir->pn_type = (flags & PFS_PROCDEP) ? pfstype_procdir : pfstype_dir; 137 dir->pn_attr = attr; 138 dir->pn_vis = vis; |
139 dir->pn_destroy = destroy; |
|
138 dir->pn_flags = flags; 139 140 if (_pfs_add_node(parent, dir) != 0) { 141 FREE(dir, M_PFSNODES); 142 return (NULL); 143 } 144 145 if (_pfs_fixup_dir(dir) != 0) { --- 4 unchanged lines hidden (view full) --- 150 return (dir); 151} 152 153/* 154 * Create a file 155 */ 156struct pfs_node * 157pfs_create_file(struct pfs_node *parent, const char *name, pfs_fill_t fill, | 140 dir->pn_flags = flags; 141 142 if (_pfs_add_node(parent, dir) != 0) { 143 FREE(dir, M_PFSNODES); 144 return (NULL); 145 } 146 147 if (_pfs_fixup_dir(dir) != 0) { --- 4 unchanged lines hidden (view full) --- 152 return (dir); 153} 154 155/* 156 * Create a file 157 */ 158struct pfs_node * 159pfs_create_file(struct pfs_node *parent, const char *name, pfs_fill_t fill, |
158 pfs_attr_t attr, pfs_vis_t vis, int flags) | 160 pfs_attr_t attr, pfs_vis_t vis, pfs_destroy_t destroy, 161 int flags) |
159{ 160 struct pfs_node *node; 161 162 KASSERT(strlen(name) < PFS_NAMELEN, 163 ("%s(): node name is too long", __func__)); 164 165 MALLOC(node, struct pfs_node *, sizeof *node, 166 M_PFSNODES, M_WAITOK|M_ZERO); 167 strcpy(node->pn_name, name); 168 node->pn_type = pfstype_file; 169 node->pn_func = fill; 170 node->pn_attr = attr; 171 node->pn_vis = vis; | 162{ 163 struct pfs_node *node; 164 165 KASSERT(strlen(name) < PFS_NAMELEN, 166 ("%s(): node name is too long", __func__)); 167 168 MALLOC(node, struct pfs_node *, sizeof *node, 169 M_PFSNODES, M_WAITOK|M_ZERO); 170 strcpy(node->pn_name, name); 171 node->pn_type = pfstype_file; 172 node->pn_func = fill; 173 node->pn_attr = attr; 174 node->pn_vis = vis; |
175 node->pn_destroy = destroy; |
|
172 node->pn_flags = flags; 173 174 if (_pfs_add_node(parent, node) != 0) { 175 FREE(node, M_PFSNODES); 176 return (NULL); 177 } 178 179 return (node); 180} 181 182/* 183 * Create a symlink 184 */ 185struct pfs_node * 186pfs_create_link(struct pfs_node *parent, const char *name, pfs_fill_t fill, | 176 node->pn_flags = flags; 177 178 if (_pfs_add_node(parent, node) != 0) { 179 FREE(node, M_PFSNODES); 180 return (NULL); 181 } 182 183 return (node); 184} 185 186/* 187 * Create a symlink 188 */ 189struct pfs_node * 190pfs_create_link(struct pfs_node *parent, const char *name, pfs_fill_t fill, |
187 pfs_attr_t attr, pfs_vis_t vis, int flags) | 191 pfs_attr_t attr, pfs_vis_t vis, pfs_destroy_t destroy, 192 int flags) |
188{ 189 struct pfs_node *node; 190 | 193{ 194 struct pfs_node *node; 195 |
191 node = pfs_create_file(parent, name, fill, attr, vis, flags); | 196 node = pfs_create_file(parent, name, fill, attr, vis, destroy, flags); |
192 if (node == NULL) 193 return (NULL); 194 node->pn_type = pfstype_symlink; 195 return (node); 196} 197 198/* 199 * Locate a node by name --- 44 unchanged lines hidden (view full) --- 244 break; 245 } 246 rover = rover->pn_next; 247 } 248 } 249 mtx_unlock(&node->pn_info->pi_mutex); 250 } 251 | 197 if (node == NULL) 198 return (NULL); 199 node->pn_type = pfstype_symlink; 200 return (node); 201} 202 203/* 204 * Locate a node by name --- 44 unchanged lines hidden (view full) --- 249 break; 250 } 251 rover = rover->pn_next; 252 } 253 } 254 mtx_unlock(&node->pn_info->pi_mutex); 255 } 256 |
257 /* callback to free any private resources */ 258 if(node->pn_destroy != NULL) 259 (node->pn_destroy)(node); 260 |
|
252 /* revoke vnodes and release memory */ 253 pfs_disable(node); 254 FREE(node, M_PFSNODES); 255 256 return (0); 257} 258 259/* --- 162 unchanged lines hidden --- | 261 /* revoke vnodes and release memory */ 262 pfs_disable(node); 263 FREE(node, M_PFSNODES); 264 265 return (0); 266} 267 268/* --- 162 unchanged lines hidden --- |