\input texinfo    @c -*-texinfo-*-
@c %**start of header
@setfilename libext2fs.info
@settitle The EXT2FS Library (version 1.46.2)
@synindex tp fn
@comment %**end of header

@ifinfo
@dircategory Development
@direntry
* libext2fs: (libext2fs).                  The EXT2FS library.
@end direntry
@end ifinfo

@c smallbook

@iftex
@finalout
@end iftex

@c Note: the edition number is listed in *three* places; please update
@c all three.  Also, update the month and year where appropriate.

@c ==> Update edition number for settitle and subtitle, and in the
@c ==> following paragraph; update date, too.


@ifinfo
This file documents the ext2fs library, a library for manipulating the
ext2 filesystem.

Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 by Theodore Ts'o

Permission is granted to make and distribute verbatim copies of
this manual provided the copyright notice and this permission notice
are preserved on all copies.

@ignore
Permission is granted to process this file through TeX and print the
results, provided the printed document carries copying permission
notice identical to this one except for the removal of this paragraph
(this paragraph not being relevant to the printed manual).

@end ignore
Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided that the entire
resulting derived work is distributed under the terms of a permission
notice identical to this one.

Permission is granted to copy and distribute translations of this manual
into another language, under the above conditions for modified versions,
except that this permission notice may be stated in a translation approved
by the author.
@end ifinfo

@setchapternewpage on
@titlepage
@c  use the new format for titles

@title The EXT2FS Library
@subtitle The EXT2FS Library
@subtitle Version 1.46.2
@subtitle February 2021

@author by Theodore Ts'o

@c Include the Distribution inside the titlepage so
@c that headings are turned off.

@tex
\global\parindent=0pt
\global\parskip=8pt
\global\baselineskip=13pt
@end tex

@page
@vskip 0pt plus 1filll
Copyright @copyright{} 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Theodore Ts'o

@sp 2

Permission is granted to make and distribute verbatim copies of
this manual provided the copyright notice and this permission notice
are preserved on all copies.

Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided that the entire
resulting derived work is distributed under the terms of a permission
notice identical to this one.

Permission is granted to copy and distribute translations of this manual
into another language, under the above conditions for modified versions,
except that this permission notice may be stated in a translation approved
by the Foundation.
@end titlepage
@headings double

@node Top, Introduction to the EXT2FS Library, (dir), (dir)

@top The EXT2FS Library

This manual documents the EXT2FS Library, version 1.46.2.

@menu
* Introduction to the EXT2FS Library::  
* EXT2FS Library Functions::    
* Concept Index::               
* Function Index::              
@end menu

@c ----------------------------------------------------------------------

@node Introduction to the EXT2FS Library, EXT2FS Library Functions, Top, Top
@comment  node-name,  next,  previous,  up
@chapter Introduction to the EXT2FS Library

The EXT2FS library is designed to allow user-level programs to
manipulate an ext2 filesystem.

@node EXT2FS Library Functions, Concept Index, Introduction to the EXT2FS Library, Top
@comment  node-name,  next,  previous,  up
@chapter EXT2FS Library Functions

@menu
* Filesystem-level functions::  
* File I/O Functions::          
* Inode Functions::             
* Directory functions::         
* Bitmap Functions::            
* EXT2 data abstractions::      
* Byte-swapping functions::     
* Other functions::             
@end menu

@c ----------------------------------------------------------------------

@node Filesystem-level functions, File I/O Functions, EXT2FS Library Functions, EXT2FS Library Functions
@comment  node-name,  next,  previous,  up
@section Filesystem-level functions

The following functions operate on a filesystem handle.  Most EXT2FS
Library functions require a filesystem handle as their first argument.
There are two functions which create a filesystem handle,
@code{ext2fs_open} and @code{ext2fs_initialize}.  

The filesystem can also be closed using @code{ext2fs_close}, and any
changes to the superblock and group descriptors can be written out to disk
using @code{ext2fs_flush}.

@menu
* Opening an ext2 filesystem::  
* Closing and flushing out changes::  
* Initializing a filesystem::   
* Filesystem flag functions::   
@end menu

@c ----------------------------------------------------------------------

@node Opening an ext2 filesystem, Closing and flushing out changes, Filesystem-level functions, Filesystem-level functions
@comment  node-name,  next,  previous,  up
@subsection Opening an ext2 filesystem

Most libext2fs functions take a filesystem handle of type
@code{ext2_filsys}.  A filesystem handle is created either by opening
an existing filesystem using @code{ext2fs_open}, or by initializing a new
filesystem using @code{ext2fs_initialize}.

@deftypefun errcode_t ext2fs_open (const char *@var{name}, int @var{flags}, int @var{superblock}, int @var{block_size}, io_manager @var{manager}, ext2_filsys *@var{ret_fs})

Opens a filesystem named @var{name}, using the the io_manager
@var{manager} to define the input/output routines needed to read and
write the filesystem.  In the case of the @code{unix_io} io_manager,
@var{name} is interpreted as the Unix filename of the filesystem image.
This is often a device file, such as @file{/dev/hda1}.

The @var{superblock} parameter specifies the block number of the
superblock which should be used when opening the filesystem.
If @var{superblock} is zero, @code{ext2fs_open} will use the primary
superblock located at offset 1024 bytes from the start of the filesystem
image.

The @var{block_size} parameter specifies the block size used by the
filesystem.  Normally this is determined automatically from the
filesystem superblock.  If @var{block_size} is non-zero, it must match
the block size found in the superblock, or the error
@code{EXT2_ET_UNEXPECTED_BLOCK_SIZE} will be returned.  The
@var{block_size} parameter is also used to help find the superblock when
@var{superblock} is non-zero.

The @var{flags} argument contains a bitmask of flags which control how
the filesystem open should be handled.

@table @code
@item EXT2_FLAG_RW
Open the filesystem for reading and writing.  Without this flag, the
filesystem is opened for reading only.

@item EXT2_FLAG_FORCE
Open the filesystem regardless of the feature sets listed in the
superblock.

@end table
@end deftypefun

@c ----------------------------------------------------------------------

@node Closing and flushing out changes, Initializing a filesystem, Opening an ext2 filesystem, Filesystem-level functions
@comment  node-name,  next,  previous,  up
@subsection Closing and flushing out changes

@deftypefun errcode_t ext2fs_flush (ext2_filsys @var{fs})

Write any changes to the high-level filesystem data structures in the
@var{fs} filesystem.  The following data structures will be written out:

@itemize @bullet
@item The filesystem superblock
@item The filesystem group descriptors
@item The filesystem bitmaps, if read in via @code{ext2fs_read_bitmaps}.
@end itemize

@end deftypefun

@deftypefun void ext2fs_free (ext2_filsys @var{fs})

Close the io_manager abstraction for @var{fs} and release all memory
associated with the filesystem handle.
@end deftypefun

@deftypefun errcode_t ext2fs_close (ext2_filsys @var{fs})

Flush out any changes to the high-level filesystem data structures using
@code{ext2fs_flush} if the filesystem is marked dirty; then close and
free the filesystem using @code{ext2fs_free}.

@end deftypefun

@c ----------------------------------------------------------------------

@node Initializing a filesystem, Filesystem flag functions, Closing and flushing out changes, Filesystem-level functions
@comment  node-name,  next,  previous,  up
@subsection Initializing a filesystem

An ext2 filesystem is initializing by the @code{mke2fs} program.  The
two functions described here, @code{ext2fs_initialize} and
@code{ext2fs_allocate_tables} do much of the initial work for setting up
a filesystem.  However, they don't do the whole job.  @code{mke2fs}
calls @code{ext2fs_initialize} to set up the filesystem superblock, and
calls @code{ext2fs_allocate_tables} to allocate space for the inode
table, and the inode and block bitmaps.  In addition, @code{mke2fs} must
also initialize the inode tables by clearing them with zeros, create the
root and lost+found directories, and reserve the reserved inodes.

@deftypefun errcode_t ext2fs_initialize (const char *@var{name}, int @var{flags}, struct ext2_super_block *@var{param}, io_manager @var{manager}, ext2_filsys *@var{ret_fs})

This function is used by the @code{mke2fs} program to initialize a
filesystem.  The @code{ext2fs_initialize} function creates a filesystem
handle which is returned in @var{ret_fs} that has been properly setup
for a filesystem to be located in @var{name}, using the io_manager
@var{manager}.  The prototype superblock in @var{param} is used to
supply parameters such as the number of blocks in the filesystem, the
block size, etc.  

The @code{ext2fs_initialize} function does not actually do any I/O; that
will be done when the application program calls @code{ext2fs_close} or
@code{ext2fs_flush}.  Also, this function only initializes the
superblock and group descriptor structures.  It does not create the
inode table or the root directory.  This must be done by the calling
application, such as @code{mke2fs}.

The following values may be set in the @var{param} prototype superblock;
if a value of 0 is found in a field, @code{ext2fs_initialize} will use a
default value.  The calling application should zero out the prototype
entire superblock, and then fill in any appropriate values.

@table @code

@item s_blocks_count
The number of blocks in the filesystem.  This parameter is mandatory and
must be set by the calling application.

@item s_inodes_count
The number of inodes in the filesystem.  The
default value is determined by calculating the size of the filesystem,
and creating one inode for every 4096 bytes.

@item s_r_blocks_count
The number of blocks which should be reserved for the superuser.  The
default value is zero blocks.

@item s_log_block_size
The blocksize of the filesystem.  Valid values are 0 (1024 bytes), 1
(2048 bytes), or 2 (4096 bytes).  The default blocksize is 1024 bytes.

@item s_log_frag_size
The size of fragments.  The ext2 filesystem does not support fragments
(and may never support fragments).  Currently this field must be the
same as @code{s_log_block_size}.

@item s_first_data_block
The first data block for the filesystem.  For filesystem with a
blocksize of 1024 bytes, this value must be at least 1, since the
superblock is located in block number 1.  For filesystems with larger
blocksizes, the superblock is still located at an offset of 1024 bytes,
so the superblock is located in block number 0.  By default, this value
is set to 1 for filesystems with a block size of 1024 bytes, or 0 for
filesystems with larger blocksizes.

@item s_max_mnt_count
This field defines the number of times that the filesystem can be
mounted before it should be checked using @code{e2fsck}.  When
@code{e2fsck} is run without the @samp{-f} option, @code{e2fsck} will
skip the filesystem check if the number of times that the filesystem has
been mounted is less than @code{s_max_mnt_count} and if the interval
between the last time a filesystem check was performed and the current
time is less than @code{s_checkinterval} (see below).  The default value
of @code{s_max_mnt_count} is 20.

@item s_checkinterval
This field defines the minimal interval between filesystem checks.  See
the previous entry for a discussion of how this field is used by
@code{e2fsck}.  The default value of this field is 180 days (six
months).

@item s_errors
This field defines the behavior which should be used by the kernel of
errors are detected in the filesystem.  Possible values include:

@table @samp
@item EXT2_ERRORS_CONTINUE
Continue execution when errors are detected.

@item EXT2_ERRORS_RO
Remount the filesystem read-only.

@item EXT2_ERRORS_PANIC
Panic.

@end table

The default behavior is @samp{EXT2_ERRORS_CONTINUE}.

@end table

@end deftypefun

@deftypefun errcode_t ext2fs_allocate_tables (ext2_filsys @var{fs})
Allocate space for the inode table and the block and inode bitmaps.  The
inode tables and block and inode bitmaps aren't actually initialized;
this function just allocates the space for them.
@end deftypefun

@c ----------------------------------------------------------------------

@node Filesystem flag functions,  , Initializing a filesystem, Filesystem-level functions
@comment  node-name,  next,  previous,  up
@subsection Filesystem flag functions

The filesystem handle has a number of flags which can be manipulated
using the following function.  Some of these flags affect how the
libext2fs filesystem behaves; others are provided solely for the
application's convenience.

@deftypefun void ext2fs_mark_changed (ext2_filsys @var{fs})
@deftypefunx int ext2fs_test_changed (ext2_filsys @var{fs})
This flag indicates whether or not the filesystem has been changed. 
It is not used by the ext2fs library.
@end deftypefun

@deftypefun void ext2fs_mark_super_dirty (ext2_filsys @var{fs})
Mark the filesystem @var{fs} as being dirty; this will cause
the superblock information to be flushed out when @code{ext2fs_close} is
called.  @code{ext2fs_mark_super_dirty} will also set the filesystem 
changed flag.  The dirty flag is automatically cleared by
@code{ext2fs_flush} when the superblock is written to disk.
@end deftypefun

@deftypefun void ext2fs_mark_valid (ext2_filsys @var{fs})
@deftypefunx void ext2fs_unmark_valid (ext2_filsys @var{fs})
@deftypefunx int ext2fs_test_valid (ext2_filsys @var{fs})
This flag indicates whether or not the filesystem is free of errors.
It is not used by libext2fs, and is solely for the application's 
convenience.
@end deftypefun

@deftypefun void ext2fs_mark_ib_dirty (ext2_filsys @var{fs})
@deftypefunx void ext2fs_mark_bb_dirty (ext2_filsys @var{fs})
@deftypefunx int ext2fs_test_ib_dirty (ext2_filsys @var{fs})
@deftypefunx int ext2fs_test_bb_dirty (ext2_filsys @var{fs})
These flags indicate whether or not the inode or block bitmaps have been
modified.   If the flag is set, it will cause the appropriate bitmap
to be written when the filesystem is closed or flushed.
@end deftypefun

@c ----------------------------------------------------------------------

@node File I/O Functions, Inode Functions, Filesystem-level functions, EXT2FS Library Functions
@comment  node-name,  next,  previous,  up
@section File I/O Functions

The following functions provide a convenient abstraction to read or
write a file in an filesystem.  The interface is similar in spirit to
the Linux/POSIX file I/O system calls.

@menu
* File handle manipulation::    
* Reading and writing data::    
* Changing the file offset ::   
* Getting the file size::       
@end menu

@c ----------------------------------------------------------------------

@node File handle manipulation, Reading and writing data, File I/O Functions, File I/O Functions
@comment  node-name,  next,  previous,  up
@subsection File handle manipulation

The file handle functions much like a file descriptor in the Linux/POSIX
file I/O system calls.  Unlike the Linux/POSIX system calls, files are
opened via inode numbers instead of via pathnames.  To resolve a
pathname to an inode number, use the function @code{ext2fs_namei} or to
create a new file, use @code{ext2fs_new_inode} and @code{ext2fs_link}.

@deftypefun errcode_t ext2fs_file_open2 (ext2_filsys @var{fs}, ext2_ino_t @var{ino}, struct ext2_inode *@var{inode}, int @var{flags}, ext2_file_t *@var{ret})
@deftypefunx errcode_t ext2fs_file_open (ext2_filsys @var{fs}, ext2_ino_t @var{ino}, int @var{flags}, ext2_file_t *@var{ret})

Opens a file identified by inode number @var{ino} in filesystem @var{fs}
and returns a file handle in @var{ret}.  If an inode structure is
provided in @var{inode}, then it is used instead of reading the inode
from the filesystem.

The @var{flags} argument contains a bitmask of flags which control how
the file should be opened.

@table @code
@item EXT2_FILE_WRITE
Open the file for reading and writing.  Without this flag, the file is
opened for writing only.

@item EXT2_FILE_CREATE
Create the file if it is not already present.

@end table
@end deftypefun

@deftypefun ext2_filsys ext2fs_file_get_fs (ext2_file_t @var{file})
Return the filesystem handle where the open file @var{file} was opened.
@end deftypefun

@deftypefun errcode_t ext2fs_file_close (ext2_file_t @var{file})
Close the file handle @var{file}.
@end deftypefun

@deftypefun errcode_t ext2fs_file_flush (ext2_file_t @var{file})
Force any data written via @code{ext2fs_file_write} to disk.
@end deftypefun

@c ----------------------------------------------------------------------

@node Reading and writing data, Changing the file offset , File handle manipulation, File I/O Functions
@comment  node-name,  next,  previous,  up
@subsection Reading and writing data

@deftypefun errcode_t ext2fs_file_read (ext2_file_t @var{file}, void *@var{buf}, unsigned int @var{wanted}, unsigned int *@var{got})
Read @var{wanted} bytes of data from @var{file} store it in the buffer
@var{buf}.  The number of bytes that was actually read is returned
via @var{got}.
@end deftypefun

@deftypefun errcode_t ext2fs_file_write (ext2_file_t @var{file}, const void *@var{buf}, unsigned int @var{nbytes}, unsigned int *@var{written})
Write @var{wanted} bytes of data from the buffer @var{buf} to the
current file position of @var{file}.  The number of bytes that was 
actually written is returned via @var{written}.
@end deftypefun

@c ----------------------------------------------------------------------

@node Changing the file offset , Getting the file size, Reading and writing data, File I/O Functions
@comment  node-name,  next,  previous,  up
@subsection Changing the file offset

@deftypefun errcode_t ext2fs_file_llseek (ext2_file_t @var{file}, __u64 @var{offset}, int @var{whence}, __u64 *@var{ret_pos})
@deftypefunx errcode_t ext2fs_file_lseek (ext2_file_t @var{file}, ext2_off_t @var{offset}, int @var{whence}, ext2_off_t *@var{ret_pos})
Change the current file position of @var{file} according to the
directive @var{whence} as follows:

@table @code
@item EXT2_SEEK_SET
The file position is set to @var{offset} bytes from the beginning of the
file.

@item EXT2_SEEK_CUR
The file position set to its current location plus @var{offset} bytes.

@item EXT2_SEEK_END
The file position is set to the size of the file plus @var{offset}
bytes.
@end table

The current offset is returned via @var{ret_pos}.
@end deftypefun

@c ----------------------------------------------------------------------

@node Getting the file size,  , Changing the file offset , File I/O Functions
@comment  node-name,  next,  previous,  up
@subsection Getting the file size

@deftypefun errcode_t ext2fs_file_get_lsize (ext2_file_t @var{file}, __u64 *@var{ret_size})
Return the size of the file @var{file} in @var{ret_size}.
@end deftypefun

@deftypefun ext2_off_t ext2fs_file_get_size (ext2_file_t @var{file})
Return the size of the file @var{file}.
@end deftypefun

@c ----------------------------------------------------------------------

@node Inode Functions, Directory functions, File I/O Functions, EXT2FS Library Functions
@comment  node-name,  next,  previous,  up
@section Inode Functions

@menu
* Reading and writing inodes::  
* Iterating over inodes in a filesystem::  
* Iterating over blocks in an inode::  
* Inode Convenience Functions::  
@end menu

@c ----------------------------------------------------------------------

@node Reading and writing inodes, Iterating over inodes in a filesystem, Inode Functions, Inode Functions
@comment  node-name,  next,  previous,  up
@subsection Reading and writing inodes

@deftypefun errcode_t ext2fs_read_inode (ext2_filsys @var{fs}, ext2_ino_t @var{ino}, struct ext2_inode *@var{inode})
Read the inode number @var{ino} into @var{inode}.
@end deftypefun

@deftypefun errcode_t ext2fs_write_inode (ext2_filsys @var{fs}, ext2_ino_t @var{ino}, struct ext2_inode *@var{inode})
Write @var{inode} to inode @var{ino}.
@end deftypefun


@c ----------------------------------------------------------------------

@node Iterating over inodes in a filesystem, Iterating over blocks in an inode, Reading and writing inodes, Inode Functions
@comment  node-name,  next,  previous,  up
@subsection Iterating over inodes in a filesystem

The inode_scan abstraction is useful for iterating over all the inodes
in a filesystem.  

@deftypefun errcode_t ext2fs_open_inode_scan (ext2_filsys @var{fs}, int @var{buffer_blocks}, ext2_inode_scan *@var{scan})
Initialize the iteration variable @var{scan}.  This variable is used by
@code{ext2fs_get_next_inode}.  The @var{buffer_blocks} parameter
controls how many blocks of the inode table are read in at a time.  A
large number of blocks requires more memory, but reduces the overhead in
seeking and reading from the disk.  If @var{buffer_blocks} is zero, a
suitable default value will be used.
@end deftypefun

@deftypefun void ext2fs_close_inode_scan (ext2_inode_scan @var{scan})
Release the memory associated with @var{scan} and invalidate it.
@end deftypefun

@deftypefun errcode_t ext2fs_get_next_inode (ext2_inode_scan @var{scan}, ext2_ino_t *@var{ino}, struct ext2_inode *@var{inode})

This function returns the next inode from the filesystem; the inode
number of the inode is stored in @var{ino}, and the inode is stored in
@var{inode}.  

If the inode is located in a block that has been marked as bad,
@code{ext2fs_get_next_inode} will return the error
@code{EXT2_ET_BAD_BLOCK_IN_INODE_TABLE}.
@end deftypefun

@deftypefun errcode_t ext2fs_inode_scan_goto_blockgroup (ext2_inode_scan @var{scan}, int @var{group})
Start the inode scan at a particular ext2 blockgroup, @var{group}.  
This function may be safely called at any time while @var{scan} is valid.
@end deftypefun

@deftypefun void ext2fs_set_inode_callback (ext2_inode_scan @var{scan}, errcode_t (*done_group)(ext2_filsys @var{fs}, ext2_inode_scan @var{scan}, dgrp_t @var{group}, void * @var{private}), void *@var{done_group_data})
Register a callback function which will be called by
@code{ext2_get_next_inode} when all of the inodes in a block group have
been processed.
@end deftypefun

@deftypefun int ext2fs_inode_scan_flags (ext2_inode_scan @var{scan}, int @var{set_flags}, int @var{clear_flags})

Set the scan_flags @var{set_flags} and clear the scan_flags @var{clear_flags}.
The following flags can be set using this interface:

@table @samp

@item EXT2_SF_SKIP_MISSING_ITABLE 
When a block group is missing an inode table, skip it.  If this flag is
not set @code{ext2fs_get_next_inode} will return the error
EXT2_ET_MISSING_INODE_TABLE.

@end table

@end deftypefun

@c ----------------------------------------------------------------------

@node Iterating over blocks in an inode, Inode Convenience Functions, Iterating over inodes in a filesystem, Inode Functions
@comment  node-name,  next,  previous,  up
@subsection Iterating over blocks in an inode

@deftypefun errcode_t ext2fs_block_iterate (ext2_filsys @var{fs}, ext2_ino_t @var{ino}, int @var{flags}, char *block_buf, int (*func)(ext2_filsys @var{fs}, blk_t *@var{blocknr}, int @var{blockcnt}, void *@var{private}), void *@var{private})

Iterate over all of the blocks in inode number @var{ino} in filesystem
@var{fs}, by calling the function @var{func} for each block in the
inode.  The @var{block_buf} parameter should either be NULL, or if the
@code{ext2fs_block_iterate} function is called repeatedly, the overhead
of allocating and freeing scratch memory can be avoided by passing a
pointer to a scratch buffer which must be at least as big as three times the
filesystem's blocksize.  

The @var{flags} parameter controls how the iterator will function:

@table @samp

@item BLOCK_FLAG_HOLE
This flag indicates that the interator function should be called on
blocks where the block number is zero (also known as ``holes''.)  It is
also known as BLOCK_FLAG_APPEND, since it is also used by functions
such as ext2fs_expand_dir() to add a new block to an inode.

@item BLOCK_FLAG_DEPTH_TRAVERSE
This flag indicates that the iterator function for the
indirect, doubly indirect, etc. blocks should be called after all
of the blocks contained in the indirect blocks are processed.
This is useful if you are going to be deallocating blocks from an
inode.

@item BLOCK_FLAG_DATA_ONLY
This flag indicates that the iterator function should be
called for data blocks only.

@end table

The callback function @var{func} is called with a number of parameters;
the @var{fs} and @var{private} parameters are self-explanatory, and
their values are taken from the parameters to
@code{ext2fs_block_iterate}.  (The @var{private} data structure is
generally used by callers to @code{ext2fs_block_iterate} so that some
private data structure can be passed to the callback function.  The 
@var{blockcnt} parameter, if non-negative, indicates the logical block
number of a data block in the inode.  If @var{blockcnt} is less than
zero, then @var{func} was called on a metadata block, and @var{blockcnt}
will be one of the following values:  BLOCK_COUNT_IND, BLOCK_COUNT_DIND,
BLOCK_COUNT_TIND, or BLOCK_COUNT_TRANSLATOR.  The @var{blocknr} is a
pointer to the inode or indirect block entry listing physical block
number.  The callback function may modify the physical block number, if
it returns the @var{BLOCK_CHANGED} flag.


The callback function @var{func} returns a result code which is composed of
the logical OR of the following flags:

@table @samp

@item BLOCK_CHANGED

This flag indicates that callback function has modified the physical
block number pointed to by @var{blocknr}.

@item BLOCK_ABORT

This flag requests that @code{ext2fs_block_iterate} to stop immediately
and return to the caller.

@end table

@end deftypefun

@deftypefun errcode_t ext2fs_block_iterate2 (ext2_filsys @var{fs}, ext2_ino_t @var{ino}, int @var{flags}, char *@var{block}_buf, int (*func)(ext2_filsys @var{fs}, blk_t *@var{blocknr}, e2_blkcnt_t @var{blockcnt}, blk_t @var{ref_blk}, int  @var{ref_offset}, void *@var{private}), void *@var{private})

This function is much like @code{ext2fs_block_iterate}, except that the
@var{blockcnt} type is a 64-bit signed quantity, to support larger
files, and the addition of the @var{ref_blk} and @var{ref_offset}
arguments passed to the callback function, which identify the location
of the physical block pointed to by pointer @var{blocknr}.  If
@var{ref_blk} is zero, then @var{ref_offset} contains the offset into
the @code{i_blocks} array.  If @var{ref_blk} is non-zero, then the physical
block location is contained inside an indirect block group, and
@var{ref_offset} contains the offset into the indirect block.

@end deftypefun

@c ----------------------------------------------------------------------

@node Inode Convenience Functions,  , Iterating over blocks in an inode, Inode Functions
@comment  node-name,  next,  previous,  up
@subsection Convenience functions for Inodes

@deftypefun errcode_t ext2fs_get_blocks (ext2_filsys @var{fs}, ext2_ino_t @var{ino}, blk_t *@var{blocks})

Returns an array of blocks corresponding to the direct,
indirect, doubly indirect, and triply indirect blocks as stored in the
inode structure.
@end deftypefun

@deftypefun errcode_t ext2fs_check_directory (ext2_filsys @var{fs}, ext2_ino_t @var{ino})
Returns 0 if @var{ino} is a directory, and @code{ENOTDIR} if it is not.
@end deftypefun

@deftypefun int ext2fs_inode_has_valid_blocks (struct ext2_inode *@var{inode})

Returns 1 if the inode's block entries actually valid block entries, and
0 if not.  Inodes which represent devices and fast symbolic links do not
contain valid block entries.
@end deftypefun

@c ----------------------------------------------------------------------

@node Directory functions, Bitmap Functions, Inode Functions, EXT2FS Library Functions
@comment  node-name,  next,  previous,  up
@section Directory functions

@menu
* Directory block functions::   
* Iterating over a directory::  
* Creating and expanding directories::  
* Creating and removing directory entries::  
* Looking up filenames::        
* Translating inode numbers to filenames::  
@end menu

@c ----------------------------------------------------------------------

@node Directory block functions, Iterating over a directory, Directory functions, Directory functions
@comment  node-name,  next,  previous,  up
@subsection Directory block functions

@deftypefun errcode_t ext2fs_read_dir_block (ext2_filsys @var{fs}, blk_t @var{block}, void *@var{buf})

This function reads a directory block, performing
byte swapping if necessary.
@end deftypefun

@deftypefun errcode_t ext2fs_write_dir_block (ext2_filsys @var{fs}, blk_t @var{block}, void *@var{buf})

This function writes a directory block, performing
byte swapping if necessary.
@end deftypefun

@deftypefun errcode_t ext2fs_new_dir_block (ext2_filsys @var{fs}, ext2_ino_t @var{dir_ino}, ext2_ino_t @var{parent_ino}, char **@var{block})

This function creates a new directory block in @var{block}.  If
@var{dir_ino} is non-zero, then @var{dir_ino} and @var{parent_ino} are used
to initialize directory entries for @file{.} and @file{..}, respectively.
@end deftypefun

@c ----------------------------------------------------------------------

@node Iterating over a directory, Creating and expanding directories, Directory block functions, Directory functions
@comment  node-name,  next,  previous,  up
@subsection Iterating over a directory

@deftypefun errcode_t ext2fs_dir_iterate (ext2_filsys @var{fs}, ext2_ino_t @var{dir}, int @var{flags}, char *@var{block_buf}, int (*@var{func})(struct ext2_dir_entry *@var{dirent}, int @var{offset}, int @var{blocksize}, char *@var{buf}, void *@var{private}), void *@var{private})

This function iterates over all of the directory entries in the
directory @var{dir}, calling the callback function @var{func} for each
directory entry in the directory.  The @var{block_buf} parameter should
either be NULL, or if the @code{ext2fs_dir_iterate} function is 
called repeatedly, the overhead of allocating and freeing 
scratch memory can be avoided by passing a pointer to a scratch buffer
which must be at least as big as the filesystem's blocksize.  

The @var{flags} parameter controls how the iterator will function:

@table @samp

@item DIRENT_FLAG_INCLUDE_EMPTY

This flag indicates that the callback function should be called even 
for deleted or empty directory entries.

@end table

@end deftypefun

@c ----------------------------------------------------------------------

@node Creating and expanding directories, Creating and removing directory entries, Iterating over a directory, Directory functions
@comment  node-name,  next,  previous,  up
@subsection Creating and expanding directories

@deftypefun errcode_t ext2fs_mkdir (ext2_filsys @var{fs}, ext2_ino_t @var{parent}, ext2_ino_t @var{inum}, const char *@var{name})

This function creates a new directory.  If @var{inum} is zero, then a
new inode will be allocated; otherwise, the directory will be created in
the inode specified by @var{inum}.  If @var{name} specifies the name of
the new directory; if it is non-NULL, then the new directory will be
linked into the parent directory @var{parent}.
@end deftypefun

@deftypefun errcode_t ext2fs_expand_dir (ext2_filsys @var{fs}, ext2_ino_t @var{dir})

This function adds a new empty directory block and appends it to 
the directory @var{dir}.  This allows functions such as
@code{ext2fs_link} to add new directory entries to a directory which is full.

@end deftypefun

@c ----------------------------------------------------------------------

@node Creating and removing directory entries, Looking up filenames, Creating and expanding directories, Directory functions
@comment  node-name,  next,  previous,  up
@subsection Creating and removing directory entries

@deftypefun errcode_t ext2fs_link (ext2_filsys @var{fs}, ext2_ino_t @var{dir}, const char *@var{name}, ext2_ino_t @var{ino}, int flags)

This function adds a new directory entry to the directory @var{dir}, 
with @var{name} and @var{ino} specifying the name and inode number in
the directory entry, respectively.  

The low 3 bits of the flags field is used to specify the file type of
inode:   (No other flags are currently defined.)

@table @samp

@item EXT2_FT_UNKNOWN

The file type is unknown.

@item EXT2_FT_REG_FILE

The file type is a normal file.

@item EXT2_FT_DIR

The file type is a directory.

@item EXT2_FT_CHRDEV

The file type is a character device.

@item EXT2_FT_BLKDEV

The file type is a block device.

@item EXT2_FT_FIFO

The file type is a named pipe.

@item EXT2_FT_SOCK

The file type is a unix domain socket.

@item EXT2_FT_SYMLINK

The file type is a symbolic link.
@end table 

@end deftypefun

@deftypefun errcode_t ext2fs_unlink (ext2_filsys @var{fs}, ext2_ino_t @var{dir}, const char *@var{name}, ext2_ino_t @var{ino}, int @var{flags})

This function removes a directory entry from @var{dir}.
The directory entry to be removed is the first one which is
matched by @var{name} and @var{ino}.  If @var{name} is non-NULL, 
the directory entry's name must match @var{name}.  If @var{ino} is
non-zero, the directory entry's inode number must match @var{ino}.
No flags are currently defined for @code{ext2fs_unlink}; callers should
pass in zero to this parameter.

@end deftypefun

@c ----------------------------------------------------------------------

@node Looking up filenames, Translating inode numbers to filenames, Creating and removing directory entries, Directory functions
@comment  node-name,  next,  previous,  up
@subsection Looking up filenames

@deftypefun errcode_t ext2fs_lookup (ext2_filsys @var{fs}, ext2_ino_t @var{dir}, const char *@var{name}, int @var{namelen}, char *@var{buf}, ext2_ino_t *@var{inode})
@end deftypefun

@deftypefun errcode_t ext2fs_namei (ext2_filsys @var{fs}, ext2_ino_t @var{root}, ext2_ino_t @var{cwd}, const char *@var{name}, ext2_ino_t *@var{inode})
@end deftypefun

@deftypefun errcode_t ext2fs_namei_follow (ext2_filsys @var{fs}, ext2_ino_t @var{root}, ext2_ino_t @var{cwd}, const char *@var{name}, ext2_ino_t *@var{inode})
@end deftypefun

@deftypefun errcode_t ext2fs_follow_link (ext2_filsys @var{fs}, ext2_ino_t @var{root}, ext2_ino_t @var{cwd}, ext2_ino_t @var{inode}, ext2_ino_t *@var{res}_inode)
@end deftypefun

@c ----------------------------------------------------------------------

@node Translating inode numbers to filenames,  , Looking up filenames, Directory functions
@comment  node-name,  next,  previous,  up
@subsection Translating inode numbers to filenames

@deftypefun errcode_t ext2fs_get_pathname (ext2_filsys @var{fs}, ext2_ino_t @var{dir}, ext2_ino_t @var{ino}, char **@var{name})
@end deftypefun


@c ----------------------------------------------------------------------

@node Bitmap Functions, EXT2 data abstractions, Directory functions, EXT2FS Library Functions
@comment  node-name,  next,  previous,  up
@section Bitmap Functions

@menu
* Reading and Writing Bitmaps::  
* Allocating Bitmaps::          
* Free bitmaps::                
* Bitmap Operations::           
* Comparing bitmaps::           
* Modifying Bitmaps::           
* Resizing Bitmaps::            
* Clearing Bitmaps::            
@end menu

@c ----------------------------------------------------------------------

@node Reading and Writing Bitmaps, Allocating Bitmaps, Bitmap Functions, Bitmap Functions
@comment  node-name,  next,  previous,  up
@subsection Reading and Writing Bitmaps

@deftypefun errcode_t ext2fs_write_inode_bitmap (ext2_filsys @var{fs})
@end deftypefun

@deftypefun errcode_t ext2fs_write_block_bitmap (ext2_filsys @var{fs})
@end deftypefun

@deftypefun errcode_t ext2fs_read_inode_bitmap (ext2_filsys @var{fs})
@end deftypefun

@deftypefun errcode_t ext2fs_read_block_bitmap (ext2_filsys @var{fs})
@end deftypefun

@deftypefun errcode_t ext2fs_read_bitmaps (ext2_filsys @var{fs})
@end deftypefun

@deftypefun errcode_t ext2fs_write_bitmaps (ext2_filsys @var{fs})
@end deftypefun

@c ----------------------------------------------------------------------

@node Allocating Bitmaps, Free bitmaps, Reading and Writing Bitmaps, Bitmap Functions
@comment  node-name,  next,  previous,  up
@subsection Allocating Bitmaps

@deftypefun errcode_t ext2fs_allocate_generic_bitmap (__u32 @var{start}, __u32 @var{end}, _u32 @var{real_end}, const char *@var{descr}, ext2fs_generic_bitmap *@var{ret})
@end deftypefun

@deftypefun errcode_t ext2fs_allocate_block_bitmap (ext2_filsys @var{fs}, const char *@var{descr}, ext2fs_block_bitmap *@var{ret})
@end deftypefun

@deftypefun errcode_t ext2fs_allocate_inode_bitmap (ext2_filsys @var{fs}, const char *@var{descr}, ext2fs_inode_bitmap *@var{ret})
@end deftypefun

@c ----------------------------------------------------------------------

@node Free bitmaps, Bitmap Operations, Allocating Bitmaps, Bitmap Functions
@comment  node-name,  next,  previous,  up
@subsection Freeing bitmaps


@deftypefun void ext2fs_free_generic_bitmap (ext2fs_inode_bitmap @var{bitmap})
@end deftypefun

@deftypefun void ext2fs_free_block_bitmap (ext2fs_block_bitmap @var{bitmap})
@end deftypefun

@deftypefun void ext2fs_free_inode_bitmap (ext2fs_inode_bitmap @var{bitmap})
@end deftypefun


@c ----------------------------------------------------------------------

@node Bitmap Operations, Comparing bitmaps, Free bitmaps, Bitmap Functions
@comment  node-name,  next,  previous,  up
@subsection Bitmap Operations

@deftypefun void ext2fs_mark_block_bitmap (ext2fs_block_bitmap @var{bitmap}, blk_t @var{block})

@deftypefunx void ext2fs_unmark_block_bitmap (ext2fs_block_bitmap @var{bitmap}, blk_t @var{block})

@deftypefunx int ext2fs_test_block_bitmap (ext2fs_block_bitmap @var{bitmap}, blk_t @var{block})

These functions set, clear, and test bits in a block bitmap @var{bitmap}.
@end deftypefun


@deftypefun void ext2fs_mark_inode_bitmap (ext2fs_inode_bitmap @var{bitmap}, ext2_ino_t @var{inode})

@deftypefunx void ext2fs_unmark_inode_bitmap (ext2fs_inode_bitmap @var{bitmap}, ext2_ino_t @var{inode})

@deftypefunx int ext2fs_test_inode_bitmap (ext2fs_inode_bitmap @var{bitmap}, ext2_ino_t @var{inode})

These functions set, clear, and test bits in an inode bitmap @var{bitmap}.
@end deftypefun

@deftypefun void ext2fs_fast_mark_block_bitmap (ext2fs_block_bitmap @var{bitmap}, blk_t @var{block})

@deftypefunx void ext2fs_fast_unmark_block_bitmap (ext2fs_block_bitmap @var{bitmap}, blk_t @var{block})

@deftypefunx int ext2fs_fast_test_block_bitmap (ext2fs_block_bitmap @var{bitmap}, blk_t @var{block})

@deftypefunx void ext2fs_fast_mark_inode_bitmap (ext2fs_inode_bitmap @var{bitmap}, ext2_ino_t @var{inode})

@deftypefunx void ext2fs_fast_unmark_inode_bitmap (ext2fs_inode_bitmap @var{bitmap}, ext2_ino_t @var{inode})

@deftypefunx int ext2fs_fast_test_inode_bitmap (ext2fs_inode_bitmap @var{bitmap}, ext2_ino_t @var{inode})

These ``fast'' functions are like their normal counterparts; however,
they are implemented as inline functions and do not perform bounds
checks on the inode number or block number; they are assumed to be
correct.  They should only be used in speed-critical applications, where
the inode or block number has already been validated by other means.
@end deftypefun

@deftypefun blk_t ext2fs_get_block_bitmap_start (ext2fs_block_bitmap @var{bitmap})
@deftypefunx ext2_ino_t ext2fs_get_inode_bitmap_start (ext2fs_inode_bitmap @var{bitmap})
Return the first inode or block which is stored in the bitmap.
@end deftypefun

@deftypefun blk_t ext2fs_get_block_bitmap_end (ext2fs_block_bitmap @var{bitmap})
@deftypefunx ext2_ino_t ext2fs_get_inode_bitmap_end (ext2fs_inode_bitmap @var{bitmap})

Return the last inode or block which is stored in the bitmap.
@end deftypefun


@c ----------------------------------------------------------------------

@node Comparing bitmaps, Modifying Bitmaps, Bitmap Operations, Bitmap Functions
@comment  node-name,  next,  previous,  up
@subsection Comparing bitmaps

@deftypefun errcode_t ext2fs_compare_block_bitmap (ext2fs_block_bitmap @var{bm1}, ext2fs_block_bitmap @var{bm2})
@end deftypefun

@deftypefun errcode_t ext2fs_compare_inode_bitmap (ext2fs_inode_bitmap @var{bm1}, ext2fs_inode_bitmap @var{bm2})
@end deftypefun


@c ----------------------------------------------------------------------

@node Modifying Bitmaps, Resizing Bitmaps, Comparing bitmaps, Bitmap Functions
@comment  node-name,  next,  previous,  up
@subsection Modifying Bitmaps

@deftypefun errcode_t ext2fs_fudge_inode_bitmap_end (ext2fs_inode_bitmap @var{bitmap}, ext2_ino_t @var{end}, ext2_ino_t *@var{oend})
@end deftypefun

@deftypefun errcode_t ext2fs_fudge_block_bitmap_end (ext2fs_block_bitmap @var{bitmap}, blk_t @var{end}, blk_t *@var{oend})
@end deftypefun

@c ----------------------------------------------------------------------

@node Resizing Bitmaps, Clearing Bitmaps, Modifying Bitmaps, Bitmap Functions
@comment  node-name,  next,  previous,  up
@subsection Resizing Bitmaps

@deftypefun errcode_t ext2fs_resize_generic_bitmap (__u32 @var{new_end}, __u32 @var{new_real_end}, ext2fs_generic_bitmap @var{bmap})
@end deftypefun

@deftypefun errcode_t ext2fs_resize_inode_bitmap (__u32 @var{new_end}, __u32 @var{new_real_end}, ext2fs_inode_bitmap @var{bmap})
@end deftypefun

@deftypefun errcode_t ext2fs_resize_block_bitmap (__u32 @var{new_end}, __u32 @var{new_real_end}, ext2fs_block_bitmap @var{bmap})
@end deftypefun


@c ----------------------------------------------------------------------

@node Clearing Bitmaps,  , Resizing Bitmaps, Bitmap Functions
@comment  node-name,  next,  previous,  up
@subsection Clearing Bitmaps

@deftypefun void ext2fs_clear_inode_bitmap (ext2fs_inode_bitmap @var{bitmap})

This function sets all of the bits in the inode bitmap @var{bitmap} to 
be zero.

@end deftypefun

@deftypefun void ext2fs_clear_block_bitmap (ext2fs_block_bitmap @var{bitmap})

This function sets all of the bits in the block bitmap @var{bitmap} to 
be zero.
@end deftypefun


@c ----------------------------------------------------------------------

@node EXT2 data abstractions, Byte-swapping functions, Bitmap Functions, EXT2FS Library Functions
@comment  node-name,  next,  previous,  up
@section EXT2 data abstractions

The ext2 library has a number of abstractions which are useful for ext2
utility programs.  

@menu
* Badblocks list management::   
* Directory-block list management::  
* Inode count functions::       
@end menu

@c ----------------------------------------------------------------------

@node Badblocks list management, Directory-block list management, EXT2 data abstractions, EXT2 data abstractions
@comment  node-name,  next,  previous,  up
@subsection Badblocks list management


@deftypefun errcode_t ext2fs_badblocks_list_create (ext2_badblocks_list *@var{ret}, int @var{size})
@end deftypefun

@deftypefun void ext2fs_badblocks_list_free (ext2_badblocks_list @var{bb})
@end deftypefun

@deftypefun errcode_t ext2fs_badblocks_list_add (ext2_badblocks_list @var{bb}, blk_t @var{blk})
@end deftypefun

@deftypefun int ext2fs_badblocks_list_test (ext2_badblocks_list @var{bb}, blk_t @var{blk})
@end deftypefun

@deftypefun errcode_t ext2fs_badblocks_list_iterate_begin (ext2_badblocks_list @var{bb}, ext2_badblocks_iterate *@var{ret})
@end deftypefun

@deftypefun int ext2fs_badblocks_list_iterate (ext2_badblocks_iterate iter, blk_t *@var{blk})
@end deftypefun

@deftypefun void ext2fs_badblocks_list_iterate_end (ext2_badblocks_iterate @var{iter})
@end deftypefun

@deftypefun errcode_t ext2fs_update_bb_inode (ext2_filsys @var{fs}, ext2_badblocks_list @var{bb_list})
@end deftypefun

@deftypefun errcode_t ext2fs_read_bb_inode (ext2_filsys @var{fs}, ext2_badblocks_list *@var{bb_list})
@end deftypefun

@deftypefun errcode_t ext2fs_read_bb_FILE (ext2_filsys @var{fs}, FILE *f, ext2_badblocks_list *@var{bb_list}, void (*invalid)(ext2_filsys @var{fs}, blk_t @var{blk}))
@end deftypefun


@c ----------------------------------------------------------------------

@node Directory-block list management, Inode count functions, Badblocks list management, EXT2 data abstractions
@comment  node-name,  next,  previous,  up
@subsection Directory-block list management

The dblist abstraction stores a list of blocks belonging to
directories.  This list can be useful when a program needs to interate
over all directory entries in a filesystem; @code{e2fsck} does this in
pass 2 of its operations, and @code{debugfs} needs to do this when it is
trying to turn an inode number into a pathname.

@deftypefun errcode_t ext2fs_init_dblist (ext2_filsys @var{fs}, ext2_dblist *@var{ret_dblist})

Creates a dblist data structure and returns it in @var{ret_dblist}.
@end deftypefun

@deftypefun void ext2fs_free_dblist (ext2_dblist @var{dblist})

Free a dblist data structure.
@end deftypefun

@deftypefun errcode_t ext2fs_add_dir_block (ext2_dblist @var{dblist}, ext2_ino_t @var{ino}, blk_t @var{blk}, int @var{blockcnt})

Add an entry to the dblist data structure.  This call records the fact
that block number @var{blockcnt} of directory inode @var{ino} is stored
in block @var{blk}.
@end deftypefun

@deftypefun errcode_t ext2fs_set_dir_block (ext2_dblist @var{dblist}, ext2_ino_t @var{ino}, blk_t @var{blk}, int @var{blockcnt})

Change an entry in the dblist data structure; this changes the location
of block number @var{blockcnt} of directory inode @var{ino} to be block
@var{blk}. 
@end deftypefun

@deftypefun errcode_t ext2fs_dblist_iterate (ext2_dblist @var{dblist}, int (*func)(ext2_filsys @var{fs}, struct ext2_db_entry *@var{db_info}, void *@var{private}), void *@var{private})

This iterator calls @var{func} for every entry in the dblist data structure.
@end deftypefun

@deftypefun errcode_t ext2fs_dblist_dir_iterate (ext2_dblist @var{dblist}, int flags, char *@var{block_buf}, int (*func)(ext2_ino_t @var{dir}, int  @var{entry}, struct ext2_dir_entry *@var{dirent}, int @var{offset}, int @var{blocksize}, char *@var{buf}, void *@var{private}), void *@var{private})

This iterator takes reads in the directory block indicated in each
dblist entry, and calls @var{func} for each directory entry in each
directory block.  If @var{dblist} contains all the directory blocks in a
filesystem, this function provides a convenient way to iterate over all
directory entries for that filesystem.
@end deftypefun

@c ----------------------------------------------------------------------

@node Inode count functions,  , Directory-block list management, EXT2 data abstractions
@comment  node-name,  next,  previous,  up
@subsection Inode count functions

The icount abstraction is a specialized data type used by @code{e2fsck}
to store how many times a particular inode is referenced by the
filesystem.  This is used twice; once to store the actual number of times
that the inode is reference; and once to store the claimed number of times
the inode is referenced according to the inode structure.

This abstraction is designed to be extremely efficient for storing this
sort of information, by taking advantage of the following properties of
inode counts, namely (1) inode counts are very often zero (because
the inode is currently not in use), and (2) many files have a inode
count of 1 (because they are a file which has no additional hard links).

@deftypefun errcode_t ext2fs_create_icount2 (ext2_filsys @var{fs}, int @var{flags}, int @var{size}, ext2_icount_t @var{hint}, ext2_icount_t *@var{ret})

Creates an icount structure for a filesystem @var{fs}, with initial space
for @var{size} inodes whose count is greater than 1.  The @var{flags}
parameter is either 0 or @code{EXT2_ICOUNT_OPT_INCREMENT}, which
indicates that icount structure should be able to increment inode counts
quickly.  The icount structure is returned in @var{ret}.  The returned
icount structure initially has a count of zero for all inodes.

The @var{hint} parameter allows the caller to optionally pass in another
icount structure which is used to initialize the array of inodes whose
count is greater than 1.  It is used purely as a speed optimization so
that the icount structure can determine in advance which inodes are
likely to contain a count grater than 1.
@end deftypefun

@deftypefun void ext2fs_free_icount (ext2_icount_t @var{icount})

Frees an icount structure.
@end deftypefun

@deftypefun errcode_t ext2fs_icount_fetch (ext2_icount_t @var{icount}, ext2_ino_t @var{ino}, __u16 *@var{ret})

Returns in @var{ret} the count for a particular inode @var{ino}.
@end deftypefun

@deftypefun errcode_t ext2fs_icount_increment (ext2_icount_t @var{icount}, ext2_ino_t @var{ino}, __u16 *@var{ret})

Increments the ref count for inode @var{ino}.
@end deftypefun

@deftypefun errcode_t ext2fs_icount_decrement (ext2_icount_t @var{icount}, ext2_ino_t @var{ino}, __u16 *@var{ret})

Decrements the ref count for inode @var{ino}.
@end deftypefun

@deftypefun errcode_t ext2fs_icount_store (ext2_icount_t @var{icount}, ext2_ino_t @var{ino}, __u16 @var{count})

Sets the reference count for inode @var{ino} to be @var{count}.
@end deftypefun

@deftypefun ext2_ino_t ext2fs_get_icount_size (ext2_icount_t @var{icount})

Returns the current number of inodes in @var{icount} which has a count
greater than 1.
@end deftypefun

@deftypefun errcode_t ext2fs_icount_validate (ext2_icount_t @var{icount}, FILE *@var{f})

Validates the internal rep invariant of @var{icount}; if there are any
problems, print out debugging information to @var{f}.  This function is
intended for debugging and testing use only.
@end deftypefun


@c ----------------------------------------------------------------------

@node Byte-swapping functions, Other functions, EXT2 data abstractions, EXT2FS Library Functions
@comment  node-name,  next,  previous,  up
@section Byte-swapping functions

@deftypefun void ext2fs_swap_super (struct ext2_super_block * @var{super})
@end deftypefun

@deftypefun void ext2fs_swap_group_desc (struct ext2_group_desc *@var{gdp})
@end deftypefun

@deftypefun void ext2fs_swap_inode (ext2_filsys @var{fs}, struct ext2_inode *@var{to}, struct ext2_inode *@var{from}, int @var{hostorder})
@end deftypefun

@deftypefun int ext2fs_native_flag (void)
@end deftypefun


@c ----------------------------------------------------------------------

@node Other functions,  , Byte-swapping functions, EXT2FS Library Functions
@comment  node-name,  next,  previous,  up
@section Other functions

/* alloc.c */
@deftypefun errcode_t ext2fs_new_inode (ext2_filsys @var{fs}, ext2_ino_t @var{dir}, int @var{mode}, ext2fs_inode_bitmap @var{map}, ext2_ino_t *@var{ret})
@end deftypefun

@deftypefun errcode_t ext2fs_new_block (ext2_filsys @var{fs}, blk_t @var{goal}, ext2fs_block_bitmap @var{map}, blk_t *@var{ret})
@end deftypefun

@deftypefun errcode_t ext2fs_get_free_blocks (ext2_filsys @var{fs}, blk_t @var{start}, blk_t @var{finish}, int @var{num}, ext2fs_block_bitmap @var{map}, blk_t *@var{ret})
@end deftypefun

/* check_desc.c */
@deftypefun errcode_t ext2fs_check_desc (ext2_filsys @var{fs})
@end deftypefun

@deftypefun errcode_t ext2fs_get_num_dirs (ext2_filsys @var{fs}, ext2_ino_t *@var{ret_num_dirs})
@end deftypefun


/* getsize.c */
@deftypefun errcode_t ext2fs_get_device_size (const char *@var{file}, int @var{blocksize}, blk_t *@var{retblocks})
@end deftypefun


/* ismounted.c */
@deftypefun errcode_t ext2fs_check_if_mounted (const char *@var{file}, int *@var{mount_flags})
@end deftypefun

/* version.c */

@deftypefun int ext2fs_get_library_version (const char **@var{ver_string}, const char **@var{date_string})

This function returns the current version of the ext2 library.  The
return value contains an integer version code, which consists of the
major version number of the library multiplied by 100, plus the minor
version number of the library.  Hence, if the library version is 1.08,
the returned value will be 108.

If @var{ver_string} and/or @var{date_string} are non-NULL, they will be
set to point at a constant string containing the library version and/or
release date, respectively.
@end deftypefun

@deftypefun int ext2fs_parse_version_string (const char *@var{ver_string})

This function takes a version string which may included in an
application and returns a version code using the same algorithm used by
@code{ext2fs_get_library_version}.  It can be used by programs included
in the @code{e2fsprogs} distribution to assure that they are using an
up-to-date ext2 shared library.
@end deftypefun

/* inline functions */
@deftypefun int ext2fs_group_of_blk (ext2_filsys @var{fs}, blk_t @var{blk})

This function returns the block group which contains the block @var{blk}.

@end deftypefun

@deftypefun int ext2fs_group_of_ino (ext2_filsys @var{fs}, ext2_ino_t @var{ino})

This function returns the block group which contains the inode @var{ino}.
@end deftypefun


@c ----------------------------------------------------------------------

@node Concept Index, Function Index, EXT2FS Library Functions, Top
@comment  node-name,  next,  previous,  up
@unnumbered Concept Index
@printindex cp

@c ----------------------------------------------------------------------

@node Function Index,  , Concept Index, Top
@comment  node-name,  next,  previous,  up
@unnumbered Function and Type Index
@printindex fn


@contents
@bye
