2019-05-22 10:51:42 +03:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
2005-04-17 02:20:36 +04:00
/*
* attrib . h - Defines for attribute handling in NTFS Linux kernel driver .
* Part of the Linux - NTFS project .
*
2005-03-08 00:36:18 +03:00
* Copyright ( c ) 2001 - 2005 Anton Altaparmakov
2005-04-17 02:20:36 +04:00
* Copyright ( c ) 2002 Richard Russon
*/
# ifndef _LINUX_NTFS_ATTRIB_H
# define _LINUX_NTFS_ATTRIB_H
# include "endian.h"
# include "types.h"
# include "layout.h"
# include "inode.h"
# include "runlist.h"
# include "volume.h"
/**
* ntfs_attr_search_ctx - used in attribute search functions
* @ mrec : buffer containing mft record to search
* @ attr : attribute record in @ mrec where to begin / continue search
* @ is_first : if true ntfs_attr_lookup ( ) begins search with @ attr , else after
*
* Structure must be initialized to zero before the first call to one of the
* attribute search functions . Initialize @ mrec to point to the mft record to
* search , and @ attr to point to the first attribute within @ mrec ( not necessary
2006-10-01 10:27:12 +04:00
* if calling the _first ( ) functions ) , and set @ is_first to ' true ' ( not necessary
2005-04-17 02:20:36 +04:00
* if calling the _first ( ) functions ) .
*
2006-10-01 10:27:12 +04:00
* If @ is_first is ' true ' , the search begins with @ attr . If @ is_first is ' false ' ,
2005-04-17 02:20:36 +04:00
* the search begins after @ attr . This is so that , after the first call to one
* of the search attribute functions , we can call the function again , without
* any modification of the search context , to automagically get the next
* matching attribute .
*/
typedef struct {
MFT_RECORD * mrec ;
ATTR_RECORD * attr ;
2006-10-01 10:27:12 +04:00
bool is_first ;
2005-04-17 02:20:36 +04:00
ntfs_inode * ntfs_ino ;
ATTR_LIST_ENTRY * al_entry ;
ntfs_inode * base_ntfs_ino ;
MFT_RECORD * base_mrec ;
ATTR_RECORD * base_attr ;
} ntfs_attr_search_ctx ;
2005-10-04 16:44:48 +04:00
extern int ntfs_map_runlist_nolock ( ntfs_inode * ni , VCN vcn ,
ntfs_attr_search_ctx * ctx ) ;
2005-04-17 02:20:36 +04:00
extern int ntfs_map_runlist ( ntfs_inode * ni , VCN vcn ) ;
2005-03-08 00:36:18 +03:00
extern LCN ntfs_attr_vcn_to_lcn_nolock ( ntfs_inode * ni , const VCN vcn ,
2006-10-01 10:27:12 +04:00
const bool write_locked ) ;
2005-03-08 00:36:18 +03:00
2005-03-08 00:43:38 +03:00
extern runlist_element * ntfs_attr_find_vcn_nolock ( ntfs_inode * ni ,
2005-10-04 17:01:14 +04:00
const VCN vcn , ntfs_attr_search_ctx * ctx ) ;
2005-04-17 02:20:36 +04:00
int ntfs_attr_lookup ( const ATTR_TYPE type , const ntfschar * name ,
const u32 name_len , const IGNORE_CASE_BOOL ic ,
const VCN lowest_vcn , const u8 * val , const u32 val_len ,
ntfs_attr_search_ctx * ctx ) ;
extern int load_attribute_list ( ntfs_volume * vol , runlist * rl , u8 * al_start ,
const s64 size , const s64 initialized_size ) ;
static inline s64 ntfs_attr_size ( const ATTR_RECORD * a )
{
if ( ! a - > non_resident )
return ( s64 ) le32_to_cpu ( a - > data . resident . value_length ) ;
return sle64_to_cpu ( a - > data . non_resident . data_size ) ;
}
extern void ntfs_attr_reinit_search_ctx ( ntfs_attr_search_ctx * ctx ) ;
extern ntfs_attr_search_ctx * ntfs_attr_get_search_ctx ( ntfs_inode * ni ,
MFT_RECORD * mrec ) ;
extern void ntfs_attr_put_search_ctx ( ntfs_attr_search_ctx * ctx ) ;
2005-03-17 13:51:33 +03:00
# ifdef NTFS_RW
2005-04-17 02:20:36 +04:00
extern int ntfs_attr_size_bounds_check ( const ntfs_volume * vol ,
const ATTR_TYPE type , const s64 size ) ;
extern int ntfs_attr_can_be_non_resident ( const ntfs_volume * vol ,
const ATTR_TYPE type ) ;
extern int ntfs_attr_can_be_resident ( const ntfs_volume * vol ,
const ATTR_TYPE type ) ;
extern int ntfs_attr_record_resize ( MFT_RECORD * m , ATTR_RECORD * a , u32 new_size ) ;
2005-09-08 23:40:32 +04:00
extern int ntfs_resident_attr_value_resize ( MFT_RECORD * m , ATTR_RECORD * a ,
const u32 new_size ) ;
2005-04-17 02:20:36 +04:00
2005-10-04 17:48:20 +04:00
extern int ntfs_attr_make_non_resident ( ntfs_inode * ni , const u32 data_size ) ;
2005-03-09 18:15:06 +03:00
2005-10-04 18:18:56 +04:00
extern s64 ntfs_attr_extend_allocation ( ntfs_inode * ni , s64 new_alloc_size ,
const s64 new_data_size , const s64 data_start ) ;
2005-04-17 02:20:36 +04:00
extern int ntfs_attr_set ( ntfs_inode * ni , const s64 ofs , const s64 cnt ,
const u8 val ) ;
2005-03-17 13:51:33 +03:00
# endif /* NTFS_RW */
2005-04-17 02:20:36 +04:00
# endif /* _LINUX_NTFS_ATTRIB_H */