![Steven Whitehouse](/assets/img/avatar_default.png)
This patch improves the calculation of the tree height in order to reduce the number of operations which are carried out on each call to gfs2_block_map. In the common case, we now make a single comparison, rather than calculating the required tree height from scratch each time. Also in the case that the tree does need some extra height, we start from the current height rather from zero when we work out what the new height ought to be. In addition the di_height field is moved into the inode proper and reduced in size to a u8 since the value must be between 0 and GFS2_MAX_META_HEIGHT (10). Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
90 lines
3 KiB
C
90 lines
3 KiB
C
/*
|
|
* Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
|
|
* Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
|
|
*
|
|
* This copyrighted material is made available to anyone wishing to use,
|
|
* modify, copy, or redistribute it subject to the terms and conditions
|
|
* of the GNU General Public License version 2.
|
|
*/
|
|
|
|
#ifndef __INODE_DOT_H__
|
|
#define __INODE_DOT_H__
|
|
|
|
static inline int gfs2_is_stuffed(const struct gfs2_inode *ip)
|
|
{
|
|
return !ip->i_height;
|
|
}
|
|
|
|
static inline int gfs2_is_jdata(const struct gfs2_inode *ip)
|
|
{
|
|
return ip->i_di.di_flags & GFS2_DIF_JDATA;
|
|
}
|
|
|
|
static inline int gfs2_is_writeback(const struct gfs2_inode *ip)
|
|
{
|
|
const struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
|
|
return (sdp->sd_args.ar_data == GFS2_DATA_WRITEBACK) && !gfs2_is_jdata(ip);
|
|
}
|
|
|
|
static inline int gfs2_is_ordered(const struct gfs2_inode *ip)
|
|
{
|
|
const struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
|
|
return (sdp->sd_args.ar_data == GFS2_DATA_ORDERED) && !gfs2_is_jdata(ip);
|
|
}
|
|
|
|
static inline int gfs2_is_dir(const struct gfs2_inode *ip)
|
|
{
|
|
return S_ISDIR(ip->i_inode.i_mode);
|
|
}
|
|
|
|
static inline void gfs2_set_inode_blocks(struct inode *inode)
|
|
{
|
|
struct gfs2_inode *ip = GFS2_I(inode);
|
|
inode->i_blocks = ip->i_di.di_blocks <<
|
|
(GFS2_SB(inode)->sd_sb.sb_bsize_shift - GFS2_BASIC_BLOCK_SHIFT);
|
|
}
|
|
|
|
static inline int gfs2_check_inum(const struct gfs2_inode *ip, u64 no_addr,
|
|
u64 no_formal_ino)
|
|
{
|
|
return ip->i_no_addr == no_addr && ip->i_no_formal_ino == no_formal_ino;
|
|
}
|
|
|
|
static inline void gfs2_inum_out(const struct gfs2_inode *ip,
|
|
struct gfs2_dirent *dent)
|
|
{
|
|
dent->de_inum.no_formal_ino = cpu_to_be64(ip->i_no_formal_ino);
|
|
dent->de_inum.no_addr = cpu_to_be64(ip->i_no_addr);
|
|
}
|
|
|
|
|
|
void gfs2_inode_attr_in(struct gfs2_inode *ip);
|
|
void gfs2_set_iop(struct inode *inode);
|
|
struct inode *gfs2_inode_lookup(struct super_block *sb, unsigned type,
|
|
u64 no_addr, u64 no_formal_ino,
|
|
int skip_freeing);
|
|
struct inode *gfs2_ilookup(struct super_block *sb, u64 no_addr);
|
|
|
|
int gfs2_inode_refresh(struct gfs2_inode *ip);
|
|
|
|
int gfs2_dinode_dealloc(struct gfs2_inode *inode);
|
|
int gfs2_change_nlink(struct gfs2_inode *ip, int diff);
|
|
struct inode *gfs2_lookupi(struct inode *dir, const struct qstr *name,
|
|
int is_root, struct nameidata *nd);
|
|
struct inode *gfs2_createi(struct gfs2_holder *ghs, const struct qstr *name,
|
|
unsigned int mode, dev_t dev);
|
|
int gfs2_rmdiri(struct gfs2_inode *dip, const struct qstr *name,
|
|
struct gfs2_inode *ip);
|
|
int gfs2_unlink_ok(struct gfs2_inode *dip, const struct qstr *name,
|
|
const struct gfs2_inode *ip);
|
|
int gfs2_ok_to_move(struct gfs2_inode *this, struct gfs2_inode *to);
|
|
int gfs2_readlinki(struct gfs2_inode *ip, char **buf, unsigned int *len);
|
|
int gfs2_glock_nq_atime(struct gfs2_holder *gh);
|
|
int gfs2_setattr_simple(struct gfs2_inode *ip, struct iattr *attr);
|
|
struct inode *gfs2_lookup_simple(struct inode *dip, const char *name);
|
|
void gfs2_dinode_out(const struct gfs2_inode *ip, void *buf);
|
|
void gfs2_dinode_print(const struct gfs2_inode *ip);
|
|
|
|
#endif /* __INODE_DOT_H__ */
|
|
|