2006-01-16 19:50:04 +03:00
/*
* Copyright ( C ) Sistina Software , Inc . 1997 - 2003 All rights reserved .
2006-05-18 23:09:15 +04:00
* Copyright ( C ) 2004 - 2006 Red Hat , Inc . All rights reserved .
2006-01-16 19:50:04 +03: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 19:05:15 +04:00
* of the GNU General Public License version 2.
2006-01-16 19:50:04 +03:00
*/
# ifndef __DIR_DOT_H__
# define __DIR_DOT_H__
2006-09-05 18:39:21 +04:00
# include <linux/dcache.h>
2008-11-26 15:49:26 +03:00
# include <linux/crc32.h>
2006-09-05 18:39:21 +04:00
struct inode ;
struct gfs2_inode ;
struct gfs2_inum ;
2010-09-17 15:30:23 +04:00
extern struct inode * gfs2_dir_search ( struct inode * dir ,
const struct qstr * filename ) ;
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 ,
2011-05-09 16:30:08 +04:00
const struct gfs2_inode * ip ) ;
2011-05-09 19:42:37 +04:00
extern int gfs2_dir_del ( struct gfs2_inode * dip , const struct dentry * dentry ) ;
2010-09-17 15:30:23 +04:00
extern int gfs2_dir_read ( struct inode * inode , u64 * offset , void * opaque ,
filldir_t filldir ) ;
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 19:50:04 +03:00
2010-09-17 15:30:23 +04:00
extern int gfs2_dir_exhash_dealloc ( struct gfs2_inode * dip ) ;
2006-01-16 19:50:04 +03:00
2010-09-17 15:30:23 +04:00
extern int gfs2_diradd_alloc_required ( struct inode * dir ,
const struct qstr * filename ) ;
extern int gfs2_dir_get_new_buffer ( struct gfs2_inode * ip , u64 block ,
struct buffer_head * * bhp ) ;
2011-06-15 13:29:37 +04:00
extern void gfs2_dir_hash_inval ( struct gfs2_inode * ip ) ;
2006-03-20 20:30:04 +03:00
2006-09-04 20:49:07 +04:00
static inline u32 gfs2_disk_hash ( const char * data , int len )
2006-03-28 23:14:04 +04:00
{
2006-09-05 17:34:20 +04:00
return crc32_le ( ( u32 ) ~ 0 , data , len ) ^ ( u32 ) ~ 0 ;
2006-03-28 23:14:04 +04: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 20:30:04 +03: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 17:34:20 +04:00
memcpy ( dent + 1 , name - > name , name - > len ) ;
2006-03-20 20:30:04 +03:00
}
2006-01-16 19:50:04 +03:00
2010-09-17 15:30:23 +04:00
extern struct qstr gfs2_qdot ;
extern struct qstr gfs2_qdotdot ;
2006-01-16 19:50:04 +03:00
# endif /* __DIR_DOT_H__ */