1 /* 2 * lcnalloc.h - Exports for NTFS kernel cluster (de)allocation. Part of the 3 * Linux-NTFS project. 4 * 5 * Copyright (c) 2004 Anton Altaparmakov 6 * 7 * This program/include file is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License as published 9 * by the Free Software Foundation; either version 2 of the License, or 10 * (at your option) any later version. 11 * 12 * This program/include file is distributed in the hope that it will be 13 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty 14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program (in the main directory of the Linux-NTFS 19 * distribution in the file COPYING); if not, write to the Free Software 20 * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 21 */ 22 23 #ifndef _LINUX_NTFS_LCNALLOC_H 24 #define _LINUX_NTFS_LCNALLOC_H 25 26 #ifdef NTFS_RW 27 28 #include <linux/fs.h> 29 30 #include "types.h" 31 #include "runlist.h" 32 #include "volume.h" 33 34 typedef enum { 35 FIRST_ZONE = 0, /* For sanity checking. */ 36 MFT_ZONE = 0, /* Allocate from $MFT zone. */ 37 DATA_ZONE = 1, /* Allocate from $DATA zone. */ 38 LAST_ZONE = 1, /* For sanity checking. */ 39 } NTFS_CLUSTER_ALLOCATION_ZONES; 40 41 extern runlist_element *ntfs_cluster_alloc(ntfs_volume *vol, 42 const VCN start_vcn, const s64 count, const LCN start_lcn, 43 const NTFS_CLUSTER_ALLOCATION_ZONES zone); 44 45 extern s64 __ntfs_cluster_free(struct inode *vi, const VCN start_vcn, 46 s64 count, const BOOL is_rollback); 47 48 /** 49 * ntfs_cluster_free - free clusters on an ntfs volume 50 * @vi: vfs inode whose runlist describes the clusters to free 51 * @start_vcn: vcn in the runlist of @vi at which to start freeing clusters 52 * @count: number of clusters to free or -1 for all clusters 53 * 54 * Free @count clusters starting at the cluster @start_vcn in the runlist 55 * described by the vfs inode @vi. 56 * 57 * If @count is -1, all clusters from @start_vcn to the end of the runlist are 58 * deallocated. Thus, to completely free all clusters in a runlist, use 59 * @start_vcn = 0 and @count = -1. 60 * 61 * Note, ntfs_cluster_free() does not modify the runlist at all, so the caller 62 * has to deal with it later. 63 * 64 * Return the number of deallocated clusters (not counting sparse ones) on 65 * success and -errno on error. 66 * 67 * Locking: - The runlist described by @vi must be unlocked on entry and is 68 * unlocked on return. 69 * - This function takes the runlist lock of @vi for reading and 70 * sometimes for writing and sometimes modifies the runlist. 71 * - The volume lcn bitmap must be unlocked on entry and is unlocked 72 * on return. 73 * - This function takes the volume lcn bitmap lock for writing and 74 * modifies the bitmap contents. 75 */ 76 static inline s64 ntfs_cluster_free(struct inode *vi, const VCN start_vcn, 77 s64 count) 78 { 79 return __ntfs_cluster_free(vi, start_vcn, count, FALSE); 80 } 81 82 extern int ntfs_cluster_free_from_rl_nolock(ntfs_volume *vol, 83 const runlist_element *rl); 84 85 /** 86 * ntfs_cluster_free_from_rl - free clusters from runlist 87 * @vol: mounted ntfs volume on which to free the clusters 88 * @rl: runlist describing the clusters to free 89 * 90 * Free all the clusters described by the runlist @rl on the volume @vol. In 91 * the case of an error being returned, at least some of the clusters were not 92 * freed. 93 * 94 * Return 0 on success and -errno on error. 95 * 96 * Locking: This function takes the volume lcn bitmap lock for writing and 97 * modifies the bitmap contents. 98 */ 99 static inline int ntfs_cluster_free_from_rl(ntfs_volume *vol, 100 const runlist_element *rl) 101 { 102 int ret; 103 104 down_write(&vol->lcnbmp_lock); 105 ret = ntfs_cluster_free_from_rl_nolock(vol, rl); 106 up_write(&vol->lcnbmp_lock); 107 return ret; 108 } 109 110 #endif /* NTFS_RW */ 111 112 #endif /* defined _LINUX_NTFS_LCNALLOC_H */ 113