1 /* 2 * Copyright 2004-2008, Haiku Inc. All Rights Reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5 #ifndef _FSSH_FS_INTERFACE_H 6 #define _FSSH_FS_INTERFACE_H 7 8 /*! File System Interface Layer Definition */ 9 10 11 #include "fssh_disk_device_defs.h" 12 #include "fssh_module.h" 13 #include "fssh_os.h" 14 15 16 struct fssh_dirent; 17 struct fssh_fs_info; 18 struct fssh_iovec; 19 struct fssh_partition_data; 20 struct fssh_selectsync; 21 struct fssh_stat; 22 23 typedef fssh_dev_t fssh_mount_id; 24 typedef fssh_ino_t fssh_vnode_id; 25 26 /* the file system's private data structures */ 27 typedef void *fssh_fs_cookie; 28 29 /* additional flags passed to write_stat() */ 30 #define FSSH_B_STAT_SIZE_INSECURE 0x2000 31 32 /* passed to write_fs_info() */ 33 #define FSSH_FS_WRITE_FSINFO_NAME 0x0001 34 35 struct fssh_file_io_vec { 36 fssh_off_t offset; 37 fssh_off_t length; 38 }; 39 40 #define FSSH_B_CURRENT_FS_API_VERSION "/v1" 41 42 // flags for publish_vnode() and fs_volume_ops::get_vnode() 43 #define FSSH_B_VNODE_PUBLISH_REMOVED 0x01 44 #define FSSH_B_VNODE_DONT_CREATE_SPECIAL_SUB_NODE 0x02 45 46 47 #ifdef __cplusplus 48 extern "C" { 49 #endif 50 51 typedef struct fssh_fs_volume fssh_fs_volume; 52 typedef struct fssh_fs_volume_ops fssh_fs_volume_ops; 53 typedef struct fssh_fs_vnode fssh_fs_vnode; 54 typedef struct fssh_fs_vnode_ops fssh_fs_vnode_ops; 55 56 57 struct fssh_fs_volume { 58 fssh_dev_t id; 59 int32_t layer; 60 void* private_volume; 61 fssh_fs_volume_ops* ops; 62 fssh_fs_volume* sub_volume; 63 fssh_fs_volume* super_volume; 64 }; 65 66 struct fssh_fs_vnode { 67 void* private_node; 68 fssh_fs_vnode_ops* ops; 69 }; 70 71 struct fssh_fs_volume_ops { 72 fssh_status_t (*unmount)(fssh_fs_volume *volume); 73 74 fssh_status_t (*read_fs_info)(fssh_fs_volume *volume, 75 struct fssh_fs_info *info); 76 fssh_status_t (*write_fs_info)(fssh_fs_volume *volume, 77 const struct fssh_fs_info *info, uint32_t mask); 78 fssh_status_t (*sync)(fssh_fs_volume *volume); 79 80 fssh_status_t (*get_vnode)(fssh_fs_volume *volume, fssh_vnode_id id, 81 fssh_fs_vnode *_vnode, int *_type, uint32_t *_flags, 82 bool reenter); 83 84 /* index directory & index operations */ 85 fssh_status_t (*open_index_dir)(fssh_fs_volume *volume, 86 fssh_fs_cookie *cookie); 87 fssh_status_t (*close_index_dir)(fssh_fs_volume *volume, 88 fssh_fs_cookie cookie); 89 fssh_status_t (*free_index_dir_cookie)(fssh_fs_volume *volume, 90 fssh_fs_cookie cookie); 91 fssh_status_t (*read_index_dir)(fssh_fs_volume *volume, 92 fssh_fs_cookie cookie, struct fssh_dirent *buffer, 93 fssh_size_t bufferSize, uint32_t *_num); 94 fssh_status_t (*rewind_index_dir)(fssh_fs_volume *volume, 95 fssh_fs_cookie cookie); 96 97 fssh_status_t (*create_index)(fssh_fs_volume *volume, const char *name, 98 uint32_t type, uint32_t flags); 99 fssh_status_t (*remove_index)(fssh_fs_volume *volume, const char *name); 100 fssh_status_t (*read_index_stat)(fssh_fs_volume *volume, const char *name, 101 struct fssh_stat *stat); 102 103 /* query operations */ 104 fssh_status_t (*open_query)(fssh_fs_volume *volume, const char *query, 105 uint32_t flags, fssh_port_id port, uint32_t token, 106 fssh_fs_cookie *_cookie); 107 fssh_status_t (*close_query)(fssh_fs_volume *volume, fssh_fs_cookie cookie); 108 fssh_status_t (*free_query_cookie)(fssh_fs_volume *volume, 109 fssh_fs_cookie cookie); 110 fssh_status_t (*read_query)(fssh_fs_volume *volume, fssh_fs_cookie cookie, 111 struct fssh_dirent *buffer, fssh_size_t bufferSize, 112 uint32_t *_num); 113 fssh_status_t (*rewind_query)(fssh_fs_volume *volume, 114 fssh_fs_cookie cookie); 115 116 /* support for FS layers */ 117 fssh_status_t (*create_sub_vnode)(fssh_fs_volume *volume, fssh_ino_t id, 118 fssh_fs_vnode *vnode); 119 fssh_status_t (*delete_sub_vnode)(fssh_fs_volume *volume, 120 fssh_fs_vnode *vnode); 121 }; 122 123 struct fssh_fs_vnode_ops { 124 /* vnode operations */ 125 fssh_status_t (*lookup)(fssh_fs_volume *volume, fssh_fs_vnode *dir, 126 const char *name, fssh_vnode_id *_id); 127 fssh_status_t (*get_vnode_name)(fssh_fs_volume *volume, 128 fssh_fs_vnode *vnode, char *buffer, fssh_size_t bufferSize); 129 130 fssh_status_t (*put_vnode)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 131 bool reenter); 132 fssh_status_t (*remove_vnode)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 133 bool reenter); 134 135 /* VM file access */ 136 bool (*can_page)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 137 fssh_fs_cookie cookie); 138 fssh_status_t (*read_pages)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 139 fssh_fs_cookie cookie, fssh_off_t pos, const fssh_iovec *vecs, 140 fssh_size_t count, fssh_size_t *_numBytes, bool reenter); 141 fssh_status_t (*write_pages)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 142 fssh_fs_cookie cookie, fssh_off_t pos, const fssh_iovec *vecs, 143 fssh_size_t count, fssh_size_t *_numBytes, bool reenter); 144 145 /* cache file access */ 146 fssh_status_t (*get_file_map)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 147 fssh_off_t offset, fssh_size_t size, 148 struct fssh_file_io_vec *vecs, fssh_size_t *_count); 149 150 /* common operations */ 151 fssh_status_t (*ioctl)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 152 fssh_fs_cookie cookie, fssh_ulong op, void *buffer, 153 fssh_size_t length); 154 fssh_status_t (*set_flags)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 155 fssh_fs_cookie cookie, int flags); 156 fssh_status_t (*select)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 157 fssh_fs_cookie cookie, uint8_t event, fssh_selectsync *sync); 158 fssh_status_t (*deselect)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 159 fssh_fs_cookie cookie, uint8_t event, fssh_selectsync *sync); 160 fssh_status_t (*fsync)(fssh_fs_volume *volume, fssh_fs_vnode *vnode); 161 162 fssh_status_t (*read_symlink)(fssh_fs_volume *volume, fssh_fs_vnode *link, 163 char *buffer, fssh_size_t *_bufferSize); 164 fssh_status_t (*create_symlink)(fssh_fs_volume *volume, fssh_fs_vnode *dir, 165 const char *name, const char *path, int mode); 166 167 fssh_status_t (*link)(fssh_fs_volume *volume, fssh_fs_vnode *dir, 168 const char *name, fssh_fs_vnode *vnode); 169 fssh_status_t (*unlink)(fssh_fs_volume *volume, fssh_fs_vnode *dir, 170 const char *name); 171 fssh_status_t (*rename)(fssh_fs_volume *volume, fssh_fs_vnode *fromDir, 172 const char *fromName, fssh_fs_vnode *toDir, const char *toName); 173 174 fssh_status_t (*access)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 175 int mode); 176 fssh_status_t (*read_stat)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 177 struct fssh_stat *stat); 178 fssh_status_t (*write_stat)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 179 const struct fssh_stat *stat, uint32_t statMask); 180 181 /* file operations */ 182 fssh_status_t (*create)(fssh_fs_volume *volume, fssh_fs_vnode *dir, 183 const char *name, int openMode, int perms, 184 fssh_fs_cookie *_cookie, fssh_vnode_id *_newVnodeID); 185 fssh_status_t (*open)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 186 int openMode, fssh_fs_cookie *_cookie); 187 fssh_status_t (*close)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 188 fssh_fs_cookie cookie); 189 fssh_status_t (*free_cookie)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 190 fssh_fs_cookie cookie); 191 fssh_status_t (*read)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 192 fssh_fs_cookie cookie, fssh_off_t pos, void *buffer, 193 fssh_size_t *length); 194 fssh_status_t (*write)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 195 fssh_fs_cookie cookie, fssh_off_t pos, const void *buffer, 196 fssh_size_t *length); 197 198 /* directory operations */ 199 fssh_status_t (*create_dir)(fssh_fs_volume *volume, fssh_fs_vnode *parent, 200 const char *name, int perms, fssh_vnode_id *_newVnodeID); 201 fssh_status_t (*remove_dir)(fssh_fs_volume *volume, fssh_fs_vnode *parent, 202 const char *name); 203 fssh_status_t (*open_dir)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 204 fssh_fs_cookie *_cookie); 205 fssh_status_t (*close_dir)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 206 fssh_fs_cookie cookie); 207 fssh_status_t (*free_dir_cookie)(fssh_fs_volume *volume, 208 fssh_fs_vnode *vnode, fssh_fs_cookie cookie); 209 fssh_status_t (*read_dir)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 210 fssh_fs_cookie cookie, struct fssh_dirent *buffer, 211 fssh_size_t bufferSize, uint32_t *_num); 212 fssh_status_t (*rewind_dir)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 213 fssh_fs_cookie cookie); 214 215 /* attribute directory operations */ 216 fssh_status_t (*open_attr_dir)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 217 fssh_fs_cookie *_cookie); 218 fssh_status_t (*close_attr_dir)(fssh_fs_volume *volume, 219 fssh_fs_vnode *vnode, fssh_fs_cookie cookie); 220 fssh_status_t (*free_attr_dir_cookie)(fssh_fs_volume *volume, 221 fssh_fs_vnode *vnode, fssh_fs_cookie cookie); 222 fssh_status_t (*read_attr_dir)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 223 fssh_fs_cookie cookie, struct fssh_dirent *buffer, 224 fssh_size_t bufferSize, uint32_t *_num); 225 fssh_status_t (*rewind_attr_dir)(fssh_fs_volume *volume, 226 fssh_fs_vnode *vnode, fssh_fs_cookie cookie); 227 228 /* attribute operations */ 229 fssh_status_t (*create_attr)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 230 const char *name, uint32_t type, int openMode, 231 fssh_fs_cookie *_cookie); 232 fssh_status_t (*open_attr)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 233 const char *name, int openMode, fssh_fs_cookie *_cookie); 234 fssh_status_t (*close_attr)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 235 fssh_fs_cookie cookie); 236 fssh_status_t (*free_attr_cookie)(fssh_fs_volume *volume, 237 fssh_fs_vnode *vnode, fssh_fs_cookie cookie); 238 fssh_status_t (*read_attr)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 239 fssh_fs_cookie cookie, fssh_off_t pos, void *buffer, 240 fssh_size_t *length); 241 fssh_status_t (*write_attr)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 242 fssh_fs_cookie cookie, fssh_off_t pos, const void *buffer, 243 fssh_size_t *length); 244 245 fssh_status_t (*read_attr_stat)(fssh_fs_volume *volume, 246 fssh_fs_vnode *vnode, fssh_fs_cookie cookie, 247 struct fssh_stat *stat); 248 fssh_status_t (*write_attr_stat)(fssh_fs_volume *volume, 249 fssh_fs_vnode *vnode, fssh_fs_cookie cookie, 250 const struct fssh_stat *stat, int statMask); 251 fssh_status_t (*rename_attr)(fssh_fs_volume *volume, 252 fssh_fs_vnode *fromVnode, const char *fromName, 253 fssh_fs_vnode *toVnode, const char *toName); 254 fssh_status_t (*remove_attr)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, 255 const char *name); 256 257 /* support for vnode and FS layers */ 258 fssh_status_t (*create_special_node)(fssh_fs_volume *volume, 259 fssh_fs_vnode *dir, const char *name, fssh_fs_vnode *subVnode, 260 fssh_mode_t mode, uint32_t flags, fssh_fs_vnode *_superVnode, 261 fssh_ino_t *_nodeID); 262 fssh_status_t (*get_super_vnode)(fssh_fs_volume *volume, 263 fssh_fs_vnode *vnode, fssh_fs_volume *superVolume, 264 fssh_fs_vnode *superVnode); 265 }; 266 267 typedef struct fssh_file_system_module_info { 268 struct fssh_module_info info; 269 const char* pretty_name; 270 uint32_t flags; // DDM flags 271 272 /* scanning (the device is write locked) */ 273 float (*identify_partition)(int fd, fssh_partition_data *partition, 274 void **cookie); 275 fssh_status_t (*scan_partition)(int fd, fssh_partition_data *partition, 276 void *cookie); 277 void (*free_identify_partition_cookie)(fssh_partition_data *partition, 278 void *cookie); 279 void (*free_partition_content_cookie)(fssh_partition_data *partition); 280 281 /* general operations */ 282 fssh_status_t (*mount)(fssh_fs_volume *volume, const char *device, 283 uint32_t flags, const char *args, fssh_vnode_id *_rootVnodeID); 284 285 /* capability querying (the device is read locked) */ 286 uint32_t (*get_supported_operations)(fssh_partition_data* partition, 287 uint32_t mask); 288 289 bool (*validate_resize)(fssh_partition_data *partition, fssh_off_t *size); 290 bool (*validate_move)(fssh_partition_data *partition, fssh_off_t *start); 291 bool (*validate_set_content_name)(fssh_partition_data *partition, 292 char *name); 293 bool (*validate_set_content_parameters)(fssh_partition_data *partition, 294 const char *parameters); 295 bool (*validate_initialize)(fssh_partition_data *partition, char *name, 296 const char *parameters); 297 298 /* shadow partition modification (device is write locked) */ 299 fssh_status_t (*shadow_changed)(fssh_partition_data *partition, 300 fssh_partition_data *child, uint32_t operation); 301 302 /* writing (the device is NOT locked) */ 303 fssh_status_t (*defragment)(int fd, fssh_partition_id partition, 304 fssh_disk_job_id job); 305 fssh_status_t (*repair)(int fd, fssh_partition_id partition, bool checkOnly, 306 fssh_disk_job_id job); 307 fssh_status_t (*resize)(int fd, fssh_partition_id partition, 308 fssh_off_t size, fssh_disk_job_id job); 309 fssh_status_t (*move)(int fd, fssh_partition_id partition, 310 fssh_off_t offset, fssh_disk_job_id job); 311 fssh_status_t (*set_content_name)(int fd, fssh_partition_id partition, 312 const char *name, fssh_disk_job_id job); 313 fssh_status_t (*set_content_parameters)(int fd, fssh_partition_id partition, 314 const char *parameters, fssh_disk_job_id job); 315 fssh_status_t (*initialize)(int fd, fssh_partition_id partition, 316 const char *name, const char *parameters, 317 fssh_off_t partitionSize, fssh_disk_job_id job); 318 } fssh_file_system_module_info; 319 320 321 /* file system add-ons only prototypes */ 322 extern fssh_status_t fssh_new_vnode(fssh_fs_volume *volume, 323 fssh_vnode_id vnodeID, void *privateNode, 324 fssh_fs_vnode_ops *ops); 325 extern fssh_status_t fssh_publish_vnode(fssh_fs_volume *volume, 326 fssh_vnode_id vnodeID, void *privateNode, 327 fssh_fs_vnode_ops *ops, int type, uint32_t flags); 328 extern fssh_status_t fssh_get_vnode(fssh_fs_volume *volume, 329 fssh_vnode_id vnodeID, void **_privateNode); 330 extern fssh_status_t fssh_put_vnode(fssh_fs_volume *volume, 331 fssh_vnode_id vnodeID); 332 extern fssh_status_t fssh_remove_vnode(fssh_fs_volume *volume, 333 fssh_vnode_id vnodeID); 334 extern fssh_status_t fssh_unremove_vnode(fssh_fs_volume *volume, 335 fssh_vnode_id vnodeID); 336 extern fssh_status_t fssh_get_vnode_removed(fssh_fs_volume *volume, 337 fssh_vnode_id vnodeID, bool* removed); 338 339 extern fssh_status_t fssh_read_pages(int fd, fssh_off_t pos, 340 const struct fssh_iovec *vecs, fssh_size_t count, 341 fssh_size_t *_numBytes, bool fsReenter); 342 extern fssh_status_t fssh_write_pages(int fd, fssh_off_t pos, 343 const struct fssh_iovec *vecs, fssh_size_t count, 344 fssh_size_t *_numBytes, bool fsReenter); 345 extern fssh_status_t fssh_read_file_io_vec_pages(int fd, 346 const struct fssh_file_io_vec *fileVecs, 347 fssh_size_t fileVecCount, const struct fssh_iovec *vecs, 348 fssh_size_t vecCount, uint32_t *_vecIndex, 349 fssh_size_t *_vecOffset, fssh_size_t *_bytes); 350 extern fssh_status_t fssh_write_file_io_vec_pages(int fd, 351 const struct fssh_file_io_vec *fileVecs, 352 fssh_size_t fileVecCount, const struct fssh_iovec *vecs, 353 fssh_size_t vecCount, uint32_t *_vecIndex, 354 fssh_size_t *_vecOffset, fssh_size_t *_bytes); 355 356 extern fssh_status_t fssh_notify_entry_created(fssh_mount_id device, 357 fssh_vnode_id directory, const char *name, fssh_vnode_id node); 358 extern fssh_status_t fssh_notify_entry_removed(fssh_mount_id device, 359 fssh_vnode_id directory, const char *name, fssh_vnode_id node); 360 extern fssh_status_t fssh_notify_entry_moved(fssh_mount_id device, 361 fssh_vnode_id fromDirectory, const char *fromName, 362 fssh_vnode_id toDirectory, const char *toName, 363 fssh_vnode_id node); 364 extern fssh_status_t fssh_notify_stat_changed(fssh_mount_id device, 365 fssh_vnode_id node, uint32_t statFields); 366 extern fssh_status_t fssh_notify_attribute_changed(fssh_mount_id device, 367 fssh_vnode_id node, const char *attribute, int32_t cause); 368 369 extern fssh_status_t fssh_notify_query_entry_created(fssh_port_id port, 370 int32_t token, fssh_mount_id device, 371 fssh_vnode_id directory, const char *name, 372 fssh_vnode_id node); 373 extern fssh_status_t fssh_notify_query_entry_removed(fssh_port_id port, 374 int32_t token, fssh_mount_id device, 375 fssh_vnode_id directory, const char *name, 376 fssh_vnode_id node); 377 378 #ifdef __cplusplus 379 } 380 #endif 381 382 #endif /* _FSSH_FS_INTERFACE_H */ 383