2006-01-16 16:50:04 +00:00
/*
* Copyright ( C ) Sistina Software , Inc . 1997 - 2003 All rights reserved .
2006-05-18 15:09:15 -04:00
* Copyright ( C ) 2004 - 2006 Red Hat , Inc . All rights reserved .
2006-01-16 16:50:04 +00:00
*
* This copyrighted material is made available to anyone wishing to use ,
* modify , copy , or redistribute it subject to the terms and conditions
2006-09-01 11:05:15 -04:00
* of the GNU General Public License version 2.
2006-01-16 16:50:04 +00:00
*/
# ifndef __DIR_DOT_H__
# define __DIR_DOT_H__
2006-09-05 10:39:21 -04:00
# include <linux/dcache.h>
2008-11-26 12:49:26 +00:00
# include <linux/crc32.h>
2006-09-05 10:39:21 -04:00
struct inode ;
struct gfs2_inode ;
struct gfs2_inum ;
2014-01-06 12:49:43 +00:00
struct buffer_head ;
struct gfs2_dirent ;
2006-09-05 10:39:21 -04:00
2014-01-06 11:28:41 +00:00
struct gfs2_diradd {
unsigned nr_blocks ;
2014-01-06 12:49:43 +00:00
struct gfs2_dirent * dent ;
struct buffer_head * bh ;
2014-09-29 08:52:04 -04:00
int save_loc ;
2014-01-06 11:28:41 +00:00
} ;
2010-09-17 12:30:23 +01:00
extern struct inode * gfs2_dir_search ( struct inode * dir ,
2013-06-11 13:45:29 +01:00
const struct qstr * filename ,
bool fail_on_exist ) ;
2010-09-17 12:30:23 +01:00
extern int gfs2_dir_check ( struct inode * dir , const struct qstr * filename ,
const struct gfs2_inode * ip ) ;
extern int gfs2_dir_add ( struct inode * inode , const struct qstr * filename ,
2014-01-06 12:49:43 +00:00
const struct gfs2_inode * ip , struct gfs2_diradd * da ) ;
static inline void gfs2_dir_no_add ( struct gfs2_diradd * da )
{
if ( da - > bh )
brelse ( da - > bh ) ;
da - > bh = NULL ;
}
2011-05-09 16:42:37 +01:00
extern int gfs2_dir_del ( struct gfs2_inode * dip , const struct dentry * dentry ) ;
2013-05-16 14:14:48 -04:00
extern int gfs2_dir_read ( struct inode * inode , struct dir_context * ctx ,
struct file_ra_state * f_ra ) ;
2010-09-17 12:30:23 +01:00
extern int gfs2_dir_mvino ( struct gfs2_inode * dip , const struct qstr * filename ,
const struct gfs2_inode * nip , unsigned int new_type ) ;
2006-01-16 16:50:04 +00:00
2010-09-17 12:30:23 +01:00
extern int gfs2_dir_exhash_dealloc ( struct gfs2_inode * dip ) ;
2006-01-16 16:50:04 +00:00
2010-09-17 12:30:23 +01:00
extern int gfs2_diradd_alloc_required ( struct inode * dir ,
2014-01-06 11:28:41 +00:00
const struct qstr * filename ,
struct gfs2_diradd * da ) ;
2010-09-17 12:30:23 +01:00
extern int gfs2_dir_get_new_buffer ( struct gfs2_inode * ip , u64 block ,
struct buffer_head * * bhp ) ;
2011-06-15 10:29:37 +01:00
extern void gfs2_dir_hash_inval ( struct gfs2_inode * ip ) ;
2006-03-20 12:30:04 -05:00
2006-09-04 12:49:07 -04:00
static inline u32 gfs2_disk_hash ( const char * data , int len )
2006-03-28 14:14:04 -05:00
{
2006-09-05 09:34:20 -04:00
return crc32_le ( ( u32 ) ~ 0 , data , len ) ^ ( u32 ) ~ 0 ;
2006-03-28 14:14:04 -05:00
}
static inline void gfs2_str2qstr ( struct qstr * name , const char * fname )
{
name - > name = fname ;
name - > len = strlen ( fname ) ;
name - > hash = gfs2_disk_hash ( name - > name , name - > len ) ;
}
2006-03-20 12:30:04 -05:00
/* N.B. This probably ought to take inum & type as args as well */
static inline void gfs2_qstr2dirent ( const struct qstr * name , u16 reclen , struct gfs2_dirent * dent )
{
dent - > de_inum . no_addr = cpu_to_be64 ( 0 ) ;
dent - > de_inum . no_formal_ino = cpu_to_be64 ( 0 ) ;
dent - > de_hash = cpu_to_be32 ( name - > hash ) ;
dent - > de_rec_len = cpu_to_be16 ( reclen ) ;
dent - > de_name_len = cpu_to_be16 ( name - > len ) ;
dent - > de_type = cpu_to_be16 ( 0 ) ;
memset ( dent - > __pad , 0 , sizeof ( dent - > __pad ) ) ;
2006-09-05 09:34:20 -04:00
memcpy ( dent + 1 , name - > name , name - > len ) ;
2006-03-20 12:30:04 -05:00
}
2006-01-16 16:50:04 +00:00
2010-09-17 12:30:23 +01:00
extern struct qstr gfs2_qdot ;
extern struct qstr gfs2_qdotdot ;
2006-01-16 16:50:04 +00:00
# endif /* __DIR_DOT_H__ */