2019-05-31 11:09:56 +03:00
/* SPDX-License-Identifier: GPL-2.0-only */
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
*/
# 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 ;
2014-01-06 16:49:43 +04:00
struct buffer_head ;
struct gfs2_dirent ;
2006-09-05 18:39:21 +04:00
2014-01-06 15:28:41 +04:00
struct gfs2_diradd {
unsigned nr_blocks ;
2014-01-06 16:49:43 +04:00
struct gfs2_dirent * dent ;
struct buffer_head * bh ;
2014-09-29 16:52:04 +04:00
int save_loc ;
2014-01-06 15:28:41 +04:00
} ;
2010-09-17 15:30:23 +04:00
extern struct inode * gfs2_dir_search ( struct inode * dir ,
2013-06-11 16:45:29 +04:00
const struct qstr * filename ,
bool fail_on_exist ) ;
2010-09-17 15:30:23 +04: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 16:49:43 +04:00
const struct gfs2_inode * ip , struct gfs2_diradd * da ) ;
static inline void gfs2_dir_no_add ( struct gfs2_diradd * da )
{
2019-09-03 16:10:05 +03:00
brelse ( da - > bh ) ;
2014-01-06 16:49:43 +04:00
da - > bh = NULL ;
}
2011-05-09 19:42:37 +04:00
extern int gfs2_dir_del ( struct gfs2_inode * dip , const struct dentry * dentry ) ;
2013-05-16 22: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 15:30:23 +04: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 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 ,
2014-01-06 15:28:41 +04:00
const struct qstr * filename ,
struct gfs2_diradd * da ) ;
2010-09-17 15:30:23 +04:00
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__ */