hc
2024-03-26 e0728245c89800c2038c23308f2d88969d5b41c8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * runlist.h - Defines for runlist handling in NTFS Linux kernel driver.
 *           Part of the Linux-NTFS project.
 *
 * Copyright (c) 2001-2005 Anton Altaparmakov
 * Copyright (c) 2002 Richard Russon
 */
 
#ifndef _LINUX_NTFS_RUNLIST_H
#define _LINUX_NTFS_RUNLIST_H
 
#include "types.h"
#include "layout.h"
#include "volume.h"
 
/**
 * runlist_element - in memory vcn to lcn mapping array element
 * @vcn:    starting vcn of the current array element
 * @lcn:    starting lcn of the current array element
 * @length:    length in clusters of the current array element
 *
 * The last vcn (in fact the last vcn + 1) is reached when length == 0.
 *
 * When lcn == -1 this means that the count vcns starting at vcn are not
 * physically allocated (i.e. this is a hole / data is sparse).
 */
typedef struct {    /* In memory vcn to lcn mapping structure element. */
   VCN vcn;    /* vcn = Starting virtual cluster number. */
   LCN lcn;    /* lcn = Starting logical cluster number. */
   s64 length;    /* Run length in clusters. */
} runlist_element;
 
/**
 * runlist - in memory vcn to lcn mapping array including a read/write lock
 * @rl:        pointer to an array of runlist elements
 * @lock:    read/write spinlock for serializing access to @rl
 *
 */
typedef struct {
   runlist_element *rl;
   struct rw_semaphore lock;
} runlist;
 
static inline void ntfs_init_runlist(runlist *rl)
{
   rl->rl = NULL;
   init_rwsem(&rl->lock);
}
 
typedef enum {
   LCN_HOLE        = -1,    /* Keep this as highest value or die! */
   LCN_RL_NOT_MAPPED    = -2,
   LCN_ENOENT        = -3,
   LCN_ENOMEM        = -4,
   LCN_EIO            = -5,
} LCN_SPECIAL_VALUES;
 
extern runlist_element *ntfs_runlists_merge(runlist_element *drl,
       runlist_element *srl);
 
extern runlist_element *ntfs_mapping_pairs_decompress(const ntfs_volume *vol,
       const ATTR_RECORD *attr, runlist_element *old_rl);
 
extern LCN ntfs_rl_vcn_to_lcn(const runlist_element *rl, const VCN vcn);
 
#ifdef NTFS_RW
 
extern runlist_element *ntfs_rl_find_vcn_nolock(runlist_element *rl,
       const VCN vcn);
 
extern int ntfs_get_size_for_mapping_pairs(const ntfs_volume *vol,
       const runlist_element *rl, const VCN first_vcn,
       const VCN last_vcn);
 
extern int ntfs_mapping_pairs_build(const ntfs_volume *vol, s8 *dst,
       const int dst_len, const runlist_element *rl,
       const VCN first_vcn, const VCN last_vcn, VCN *const stop_vcn);
 
extern int ntfs_rl_truncate_nolock(const ntfs_volume *vol,
       runlist *const runlist, const s64 new_length);
 
int ntfs_rl_punch_nolock(const ntfs_volume *vol, runlist *const runlist,
       const VCN start, const s64 length);
 
#endif /* NTFS_RW */
 
#endif /* _LINUX_NTFS_RUNLIST_H */