\input texinfo    @c -*-texinfo-*-
@c %**start of header
@setfilename libext2fs.info
@settitle The EXT2FS Library (version 1.44.3)
@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.44.3
@subtitle July 2018

@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.44.3.

@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
