2009-04-07 06:01:32 +04:00
/*
* sufile . h - NILFS segment usage file .
*
* Copyright ( C ) 2006 - 2008 Nippon Telegraph and Telephone Corporation .
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA
*
* Written by Koji Sato < koji @ osrg . net > .
*/
# ifndef _NILFS_SUFILE_H
# define _NILFS_SUFILE_H
# include <linux/fs.h>
# include <linux/buffer_head.h>
# include <linux/nilfs2_fs.h>
# include "mdt.h"
static inline unsigned long nilfs_sufile_get_nsegments ( struct inode * sufile )
{
2011-05-05 07:56:51 +04:00
return ( ( struct the_nilfs * ) sufile - > i_sb - > s_fs_info ) - > ns_nsegments ;
2009-04-07 06:01:32 +04:00
}
2009-11-13 02:45:32 +03:00
unsigned long nilfs_sufile_get_ncleansegs ( struct inode * sufile ) ;
2011-05-04 20:23:57 +04:00
int nilfs_sufile_set_alloc_range ( struct inode * sufile , __u64 start , __u64 end ) ;
2009-04-07 06:01:32 +04:00
int nilfs_sufile_alloc ( struct inode * , __u64 * ) ;
2009-11-18 11:25:12 +03:00
int nilfs_sufile_mark_dirty ( struct inode * sufile , __u64 segnum ) ;
2009-11-18 12:23:34 +03:00
int nilfs_sufile_set_segment_usage ( struct inode * sufile , __u64 segnum ,
unsigned long nblocks , time_t modtime ) ;
2009-04-07 06:01:32 +04:00
int nilfs_sufile_get_stat ( struct inode * , struct nilfs_sustat * ) ;
2009-05-11 22:58:47 +04:00
ssize_t nilfs_sufile_get_suinfo ( struct inode * , __u64 , void * , unsigned ,
2009-04-07 06:01:32 +04:00
size_t ) ;
2009-05-16 16:49:10 +04:00
int nilfs_sufile_updatev ( struct inode * , __u64 * , size_t , int , size_t * ,
void ( * dofunc ) ( struct inode * , __u64 ,
struct buffer_head * ,
struct buffer_head * ) ) ;
2009-04-05 13:24:11 +04:00
int nilfs_sufile_update ( struct inode * , __u64 , int ,
void ( * dofunc ) ( struct inode * , __u64 ,
struct buffer_head * ,
struct buffer_head * ) ) ;
2009-04-05 13:30:58 +04:00
void nilfs_sufile_do_scrap ( struct inode * , __u64 , struct buffer_head * ,
struct buffer_head * ) ;
2009-04-05 13:24:11 +04:00
void nilfs_sufile_do_free ( struct inode * , __u64 , struct buffer_head * ,
struct buffer_head * ) ;
2009-05-16 18:44:55 +04:00
void nilfs_sufile_do_cancel_free ( struct inode * , __u64 , struct buffer_head * ,
struct buffer_head * ) ;
2009-04-05 13:24:11 +04:00
void nilfs_sufile_do_set_error ( struct inode * , __u64 , struct buffer_head * ,
struct buffer_head * ) ;
2011-05-04 20:23:58 +04:00
int nilfs_sufile_resize ( struct inode * sufile , __u64 newnsegs ) ;
2010-09-05 07:20:59 +04:00
int nilfs_sufile_read ( struct super_block * sb , size_t susize ,
struct nilfs_inode * raw_inode , struct inode * * inodep ) ;
2009-11-12 17:56:43 +03:00
2009-04-05 13:30:58 +04:00
/**
* nilfs_sufile_scrap - make a segment garbage
* @ sufile : inode of segment usage file
* @ segnum : segment number to be freed
*/
static inline int nilfs_sufile_scrap ( struct inode * sufile , __u64 segnum )
{
return nilfs_sufile_update ( sufile , segnum , 1 , nilfs_sufile_do_scrap ) ;
}
2009-04-05 13:24:11 +04:00
/**
* nilfs_sufile_free - free segment
* @ sufile : inode of segment usage file
* @ segnum : segment number to be freed
*/
static inline int nilfs_sufile_free ( struct inode * sufile , __u64 segnum )
{
return nilfs_sufile_update ( sufile , segnum , 0 , nilfs_sufile_do_free ) ;
}
2009-05-16 18:44:55 +04:00
/**
* nilfs_sufile_freev - free segments
* @ sufile : inode of segment usage file
* @ segnumv : array of segment numbers
* @ nsegs : size of @ segnumv array
* @ ndone : place to store the number of freed segments
*/
static inline int nilfs_sufile_freev ( struct inode * sufile , __u64 * segnumv ,
size_t nsegs , size_t * ndone )
{
return nilfs_sufile_updatev ( sufile , segnumv , nsegs , 0 , ndone ,
nilfs_sufile_do_free ) ;
}
/**
* nilfs_sufile_cancel_freev - reallocate freeing segments
* @ sufile : inode of segment usage file
* @ segnumv : array of segment numbers
* @ nsegs : size of @ segnumv array
* @ ndone : place to store the number of cancelled segments
*
* Return Value : On success , 0 is returned . On error , a negative error codes
* is returned .
*/
static inline int nilfs_sufile_cancel_freev ( struct inode * sufile ,
__u64 * segnumv , size_t nsegs ,
size_t * ndone )
{
return nilfs_sufile_updatev ( sufile , segnumv , nsegs , 0 , ndone ,
nilfs_sufile_do_cancel_free ) ;
}
2009-04-05 13:24:11 +04:00
/**
* nilfs_sufile_set_error - mark a segment as erroneous
* @ sufile : inode of segment usage file
* @ segnum : segment number
*
* Description : nilfs_sufile_set_error ( ) marks the segment specified by
* @ segnum as erroneous . The error segment will never be used again .
*
* Return Value : On success , 0 is returned . On error , one of the following
* negative error codes is returned .
*
* % - EIO - I / O error .
*
* % - ENOMEM - Insufficient amount of memory available .
*
* % - EINVAL - Invalid segment usage number .
*/
static inline int nilfs_sufile_set_error ( struct inode * sufile , __u64 segnum )
{
return nilfs_sufile_update ( sufile , segnum , 0 ,
nilfs_sufile_do_set_error ) ;
}
2009-04-07 06:01:32 +04:00
# endif /* _NILFS_SUFILE_H */