2005-04-17 02:20:36 +04:00
/*
2005-11-02 06:58:39 +03:00
* Copyright ( c ) 2000 - 2003 , 2005 Silicon Graphics , Inc .
* All Rights Reserved .
2005-04-17 02:20:36 +04:00
*
2005-11-02 06:58:39 +03:00
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License as
2005-04-17 02:20:36 +04:00
* published by the Free Software Foundation .
*
2005-11-02 06:58:39 +03:00
* This program is distributed in the hope that it would 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 .
2005-04-17 02:20:36 +04:00
*
2005-11-02 06:58:39 +03:00
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write the Free Software Foundation ,
* Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA
2005-04-17 02:20:36 +04:00
*/
# ifndef __XFS_INODE_H__
# define __XFS_INODE_H__
2009-06-10 19:07:47 +04:00
struct posix_acl ;
2007-08-28 07:57:51 +04:00
struct xfs_dinode ;
2008-10-30 09:05:38 +03:00
struct xfs_inode ;
2007-08-28 07:57:51 +04:00
2005-11-02 06:38:42 +03:00
/*
* Fork identifiers .
*/
# define XFS_DATA_FORK 0
# define XFS_ATTR_FORK 1
2006-03-14 05:30:23 +03:00
/*
* The following xfs_ext_irec_t struct introduces a second ( top ) level
* to the in - core extent allocation scheme . These structs are allocated
* in a contiguous block , creating an indirection array where each entry
* ( irec ) contains a pointer to a buffer of in - core extent records which
* it manages . Each extent buffer is 4 k in size , since 4 k is the system
* page size on Linux i386 and systems with larger page sizes don ' t seem
* to gain much , if anything , by using their native page size as the
* extent buffer size . Also , using 4 k extent buffers everywhere provides
* a consistent interface for CXFS across different platforms .
*
* There is currently no limit on the number of irec ' s ( extent lists )
* allowed , so heavily fragmented files may require an indirection array
* which spans multiple system pages of memory . The number of extents
* which would require this amount of contiguous memory is very large
* and should not cause problems in the foreseeable future . However ,
* if the memory needed for the contiguous array ever becomes a problem ,
* it is possible that a third level of indirection may be required .
*/
typedef struct xfs_ext_irec {
2007-08-16 10:23:40 +04:00
xfs_bmbt_rec_host_t * er_extbuf ; /* block of extent records */
2006-03-14 05:30:23 +03:00
xfs_extnum_t er_extoff ; /* extent offset in file */
xfs_extnum_t er_extcount ; /* number of extents in page/block */
} xfs_ext_irec_t ;
2005-04-17 02:20:36 +04:00
/*
* File incore extent information , present for each of data & attr forks .
*/
2006-03-14 05:30:23 +03:00
# define XFS_IEXT_BUFSZ 4096
# define XFS_LINEAR_EXTS (XFS_IEXT_BUFSZ / (uint)sizeof(xfs_bmbt_rec_t))
# define XFS_INLINE_EXTS 2
# define XFS_INLINE_DATA 32
2005-04-17 02:20:36 +04:00
typedef struct xfs_ifork {
int if_bytes ; /* bytes in if_u1 */
int if_real_bytes ; /* bytes allocated in if_u1 */
2008-10-30 09:14:34 +03:00
struct xfs_btree_block * if_broot ; /* file's incore btree root */
2005-04-17 02:20:36 +04:00
short if_broot_bytes ; /* bytes allocated for root */
unsigned char if_flags ; /* per-fork flags */
union {
2007-08-16 10:23:40 +04:00
xfs_bmbt_rec_host_t * if_extents ; /* linear map file exts */
2006-03-14 05:30:23 +03:00
xfs_ext_irec_t * if_ext_irec ; /* irec map file exts */
2005-04-17 02:20:36 +04:00
char * if_data ; /* inline file data */
} if_u1 ;
union {
2007-08-16 10:23:40 +04:00
xfs_bmbt_rec_host_t if_inline_ext [ XFS_INLINE_EXTS ] ;
2005-04-17 02:20:36 +04:00
/* very small file extents */
char if_inline_data [ XFS_INLINE_DATA ] ;
/* very small file data */
xfs_dev_t if_rdev ; /* dev number if special */
uuid_t if_uuid ; /* mount point value */
} if_u2 ;
} xfs_ifork_t ;
2008-11-28 06:23:41 +03:00
/*
* Inode location information . Stored in the inode and passed to
* xfs_imap_to_bp ( ) to get a buffer and dinode for a given inode .
*/
struct xfs_imap {
xfs_daddr_t im_blkno ; /* starting BB of inode chunk */
ushort im_len ; /* length in BBs of inode chunk */
ushort im_boffset ; /* inode offset in block in bytes */
} ;
2005-04-17 02:20:36 +04:00
/*
* This is the xfs in - core inode structure .
* Most of the on - disk inode is embedded in the i_d field .
*
* The extent pointers / inline file space , however , are managed
* separately . The memory for this information is pointed to by
* the if_u1 unions depending on the type of the data .
* This is used to linearize the array of extents for fast in - core
* access . This is used until the file ' s number of extents
* surpasses XFS_MAX_INCORE_EXTENTS , at which point all extent pointers
* are accessed through the buffer cache .
*
* Other state kept in the in - core inode is used for identification ,
* locking , transactional updating , etc of the inode .
*
* Generally , we do not want to hold the i_rlock while holding the
* i_ilock . Hierarchy is i_iolock followed by i_rlock .
*
2011-03-31 05:57:33 +04:00
* xfs_iptr_t contains all the inode fields up to and including the
2005-04-17 02:20:36 +04:00
* i_mnext and i_mprev fields , it is used as a marker in the inode
* chain off the mount structure by xfs_sync calls .
*/
2007-08-28 07:57:51 +04:00
typedef struct xfs_ictimestamp {
__int32_t t_sec ; /* timestamp seconds */
__int32_t t_nsec ; /* timestamp nanoseconds */
} xfs_ictimestamp_t ;
/*
2008-11-28 06:23:39 +03:00
* NOTE : This structure must be kept identical to struct xfs_dinode
2009-03-29 11:55:42 +04:00
* in xfs_dinode . h except for the endianness annotations .
2007-08-28 07:57:51 +04:00
*/
typedef struct xfs_icdinode {
__uint16_t di_magic ; /* inode magic # = XFS_DINODE_MAGIC */
__uint16_t di_mode ; /* mode and type of file */
__int8_t di_version ; /* inode version */
__int8_t di_format ; /* format of di_c data */
__uint16_t di_onlink ; /* old number of links to file */
__uint32_t di_uid ; /* owner's user id */
__uint32_t di_gid ; /* owner's group id */
__uint32_t di_nlink ; /* number of links to file */
2010-09-26 10:10:18 +04:00
__uint16_t di_projid_lo ; /* lower part of owner's project id */
__uint16_t di_projid_hi ; /* higher part of owner's project id */
__uint8_t di_pad [ 6 ] ; /* unused, zeroed space */
2007-08-28 07:57:51 +04:00
__uint16_t di_flushiter ; /* incremented on flush */
xfs_ictimestamp_t di_atime ; /* time last accessed */
xfs_ictimestamp_t di_mtime ; /* time last modified */
xfs_ictimestamp_t di_ctime ; /* time created/inode modified */
xfs_fsize_t di_size ; /* number of bytes in file */
xfs_drfsbno_t di_nblocks ; /* # of direct & btree blocks used */
xfs_extlen_t di_extsize ; /* basic/minimum extent size for file */
xfs_extnum_t di_nextents ; /* number of extents in data fork */
xfs_aextnum_t di_anextents ; /* number of extents in attribute fork*/
__uint8_t di_forkoff ; /* attr fork offs, <<3 for 64b align */
__int8_t di_aformat ; /* format of attr fork's data */
__uint32_t di_dmevmask ; /* DMIG event mask */
__uint16_t di_dmstate ; /* DMIG state info */
__uint16_t di_flags ; /* random flags, XFS_DIFLAG_... */
__uint32_t di_gen ; /* generation number */
} xfs_icdinode_t ;
2008-10-30 09:05:38 +03:00
/*
* Flags for xfs_ichgtime ( ) .
*/
# define XFS_ICHGTIME_MOD 0x1 /* data fork modification timestamp */
# define XFS_ICHGTIME_CHG 0x2 /* inode field change timestamp */
/*
* Per - fork incore inode flags .
*/
# define XFS_IFINLINE 0x01 /* Inline data is read in */
# define XFS_IFEXTENTS 0x02 /* All extent pointers are read in */
# define XFS_IFBROOT 0x04 /* i_broot points to the bmap b-tree root */
# define XFS_IFEXTIREC 0x08 /* Indirection array of extent blocks */
/*
* Fork handling .
*/
# define XFS_IFORK_Q(ip) ((ip)->i_d.di_forkoff != 0)
# define XFS_IFORK_BOFF(ip) ((int)((ip)->i_d.di_forkoff << 3))
# define XFS_IFORK_PTR(ip,w) \
( ( w ) = = XFS_DATA_FORK ? \
& ( ip ) - > i_df : \
( ip ) - > i_afp )
# define XFS_IFORK_DSIZE(ip) \
( XFS_IFORK_Q ( ip ) ? \
XFS_IFORK_BOFF ( ip ) : \
XFS_LITINO ( ( ip ) - > i_mount ) )
# define XFS_IFORK_ASIZE(ip) \
( XFS_IFORK_Q ( ip ) ? \
XFS_LITINO ( ( ip ) - > i_mount ) - XFS_IFORK_BOFF ( ip ) : \
0 )
# define XFS_IFORK_SIZE(ip,w) \
( ( w ) = = XFS_DATA_FORK ? \
XFS_IFORK_DSIZE ( ip ) : \
XFS_IFORK_ASIZE ( ip ) )
# define XFS_IFORK_FORMAT(ip,w) \
( ( w ) = = XFS_DATA_FORK ? \
( ip ) - > i_d . di_format : \
( ip ) - > i_d . di_aformat )
# define XFS_IFORK_FMT_SET(ip,w,n) \
( ( w ) = = XFS_DATA_FORK ? \
( ( ip ) - > i_d . di_format = ( n ) ) : \
( ( ip ) - > i_d . di_aformat = ( n ) ) )
# define XFS_IFORK_NEXTENTS(ip,w) \
( ( w ) = = XFS_DATA_FORK ? \
( ip ) - > i_d . di_nextents : \
( ip ) - > i_d . di_anextents )
# define XFS_IFORK_NEXT_SET(ip,w,n) \
( ( w ) = = XFS_DATA_FORK ? \
( ( ip ) - > i_d . di_nextents = ( n ) ) : \
( ( ip ) - > i_d . di_anextents = ( n ) ) )
2011-12-19 00:00:07 +04:00
# define XFS_IFORK_MAXEXT(ip, w) \
( XFS_IFORK_SIZE ( ip , w ) / sizeof ( xfs_bmbt_rec_t ) )
2008-10-30 09:05:38 +03:00
# ifdef __KERNEL__
struct xfs_buf ;
struct xfs_bmap_free ;
struct xfs_bmbt_irec ;
struct xfs_inode_log_item ;
struct xfs_mount ;
struct xfs_trans ;
struct xfs_dquot ;
2005-04-17 02:20:36 +04:00
typedef struct xfs_inode {
/* Inode linking and identification information. */
struct xfs_mount * i_mount ; /* fs mount struct ptr */
struct xfs_dquot * i_udquot ; /* user dquot */
struct xfs_dquot * i_gdquot ; /* group dquot */
/* Inode location stuff */
xfs_ino_t i_ino ; /* inode number (agno/agino)*/
2008-11-28 06:23:41 +03:00
struct xfs_imap i_imap ; /* location for xfs_imap() */
2005-04-17 02:20:36 +04:00
/* Extent information. */
xfs_ifork_t * i_afp ; /* attribute fork pointer */
xfs_ifork_t i_df ; /* data fork */
/* Transaction and locking information. */
struct xfs_inode_log_item * i_itemp ; /* logging information */
mrlock_t i_lock ; /* inode lock */
mrlock_t i_iolock ; /* inode IO lock */
atomic_t i_pincount ; /* inode pin count */
2006-09-28 05:06:03 +04:00
spinlock_t i_flags_lock ; /* inode i_flags lock */
2005-04-17 02:20:36 +04:00
/* Miscellaneous state. */
2011-12-19 00:00:08 +04:00
unsigned long i_flags ; /* see defined flags below */
2005-04-17 02:20:36 +04:00
unsigned int i_delayed_blks ; /* count of delay alloc blks */
2007-08-28 07:57:51 +04:00
xfs_icdinode_t i_d ; /* most of ondisk inode */
2005-04-17 02:20:36 +04:00
2008-10-30 09:36:14 +03:00
/* VFS inode */
struct inode i_vnode ; /* embedded VFS inode */
2005-04-17 02:20:36 +04:00
} xfs_inode_t ;
2008-08-13 09:45:15 +04:00
/* Convert from vfs inode to xfs inode */
static inline struct xfs_inode * XFS_I ( struct inode * inode )
{
2008-10-30 09:36:14 +03:00
return container_of ( inode , struct xfs_inode , i_vnode ) ;
2008-08-13 09:45:15 +04:00
}
/* convert from xfs inode to vfs inode */
static inline struct inode * VFS_I ( struct xfs_inode * ip )
{
2008-10-30 09:36:14 +03:00
return & ip - > i_vnode ;
2008-08-13 09:45:15 +04:00
}
2011-12-19 00:00:11 +04:00
/*
* For regular files we only update the on - disk filesize when actually
* writing data back to disk . Until then only the copy in the VFS inode
* is uptodate .
*/
static inline xfs_fsize_t XFS_ISIZE ( struct xfs_inode * ip )
{
if ( S_ISREG ( ip - > i_d . di_mode ) )
return i_size_read ( VFS_I ( ip ) ) ;
return ip - > i_d . di_size ;
}
2012-02-29 13:53:49 +04:00
/*
* If this I / O goes past the on - disk inode size update it unless it would
* be past the current in - core inode size .
*/
static inline xfs_fsize_t
xfs_new_eof ( struct xfs_inode * ip , xfs_fsize_t new_size )
{
xfs_fsize_t i_size = i_size_read ( VFS_I ( ip ) ) ;
if ( new_size > i_size )
new_size = i_size ;
return new_size > ip - > i_d . di_size ? new_size : 0 ;
}
2006-11-11 10:04:54 +03:00
/*
* i_flags helper functions
*/
static inline void
__xfs_iflags_set ( xfs_inode_t * ip , unsigned short flags )
{
ip - > i_flags | = flags ;
}
static inline void
xfs_iflags_set ( xfs_inode_t * ip , unsigned short flags )
{
spin_lock ( & ip - > i_flags_lock ) ;
__xfs_iflags_set ( ip , flags ) ;
spin_unlock ( & ip - > i_flags_lock ) ;
}
static inline void
xfs_iflags_clear ( xfs_inode_t * ip , unsigned short flags )
{
spin_lock ( & ip - > i_flags_lock ) ;
ip - > i_flags & = ~ flags ;
spin_unlock ( & ip - > i_flags_lock ) ;
}
static inline int
__xfs_iflags_test ( xfs_inode_t * ip , unsigned short flags )
{
return ( ip - > i_flags & flags ) ;
}
static inline int
xfs_iflags_test ( xfs_inode_t * ip , unsigned short flags )
{
int ret ;
spin_lock ( & ip - > i_flags_lock ) ;
ret = __xfs_iflags_test ( ip , flags ) ;
spin_unlock ( & ip - > i_flags_lock ) ;
return ret ;
}
2007-08-29 05:44:50 +04:00
static inline int
xfs_iflags_test_and_clear ( xfs_inode_t * ip , unsigned short flags )
{
int ret ;
spin_lock ( & ip - > i_flags_lock ) ;
ret = ip - > i_flags & flags ;
if ( ret )
ip - > i_flags & = ~ flags ;
spin_unlock ( & ip - > i_flags_lock ) ;
return ret ;
}
2005-04-17 02:20:36 +04:00
2011-12-19 00:00:09 +04:00
static inline int
xfs_iflags_test_and_set ( xfs_inode_t * ip , unsigned short flags )
{
int ret ;
spin_lock ( & ip - > i_flags_lock ) ;
ret = ip - > i_flags & flags ;
if ( ! ret )
ip - > i_flags | = flags ;
spin_unlock ( & ip - > i_flags_lock ) ;
return ret ;
}
2010-09-26 10:10:18 +04:00
/*
* Project quota id helpers ( previously projid was 16 bit only
2011-03-31 05:57:33 +04:00
* and using two 16 bit values to hold new 32 bit projid was chosen
2010-09-26 10:10:18 +04:00
* to retain compatibility with " old " filesystems ) .
*/
static inline prid_t
xfs_get_projid ( struct xfs_inode * ip )
{
return ( prid_t ) ip - > i_d . di_projid_hi < < 16 | ip - > i_d . di_projid_lo ;
}
static inline void
xfs_set_projid ( struct xfs_inode * ip ,
prid_t projid )
{
ip - > i_d . di_projid_hi = ( __uint16_t ) ( projid > > 16 ) ;
ip - > i_d . di_projid_lo = ( __uint16_t ) ( projid & 0xffff ) ;
}
2005-04-17 02:20:36 +04:00
/*
* In - core inode flags .
*/
2011-12-19 00:00:09 +04:00
# define XFS_IRECLAIM (1 << 0) /* started reclaiming this inode */
# define XFS_ISTALE (1 << 1) /* inode has been staled */
# define XFS_IRECLAIMABLE (1 << 2) /* inode can be reclaimed */
# define XFS_INEW (1 << 3) /* inode has just been allocated */
# define XFS_IFILESTREAM (1 << 4) /* inode is in a filestream dir. */
# define XFS_ITRUNCATED (1 << 5) /* truncated down so flush-on-close */
# define XFS_IDIRTY_RELEASE (1 << 6) /* dirty release already seen */
# define __XFS_IFLOCK_BIT 7 /* inode is being flushed right now */
# define XFS_IFLOCK (1 << __XFS_IFLOCK_BIT)
2011-12-19 00:00:10 +04:00
# define __XFS_IPINNED_BIT 8 /* wakeup key for zero pin count */
# define XFS_IPINNED (1 << __XFS_IPINNED_BIT)
2012-03-22 09:15:10 +04:00
# define XFS_IDONTCACHE (1 << 9) /* don't cache the inode long term */
2005-04-17 02:20:36 +04:00
2011-06-23 05:34:59 +04:00
/*
* Per - lifetime flags need to be reset when re - using a reclaimable inode during
2012-03-22 09:15:10 +04:00
* inode lookup . This prevents unintended behaviour on the new inode from
2011-06-23 05:34:59 +04:00
* ocurring .
*/
# define XFS_IRECLAIM_RESET_FLAGS \
( XFS_IRECLAIMABLE | XFS_IRECLAIM | \
XFS_IDIRTY_RELEASE | XFS_ITRUNCATED | \
XFS_IFILESTREAM ) ;
2011-12-19 00:00:09 +04:00
/*
* Synchronize processes attempting to flush the in - core inode back to disk .
*/
extern void __xfs_iflock ( struct xfs_inode * ip ) ;
static inline int xfs_iflock_nowait ( struct xfs_inode * ip )
{
return ! xfs_iflags_test_and_set ( ip , XFS_IFLOCK ) ;
}
static inline void xfs_iflock ( struct xfs_inode * ip )
{
if ( ! xfs_iflock_nowait ( ip ) )
__xfs_iflock ( ip ) ;
}
static inline void xfs_ifunlock ( struct xfs_inode * ip )
{
xfs_iflags_clear ( ip , XFS_IFLOCK ) ;
wake_up_bit ( & ip - > i_flags , __XFS_IFLOCK_BIT ) ;
}
static inline int xfs_isiflocked ( struct xfs_inode * ip )
{
return xfs_iflags_test ( ip , XFS_IFLOCK ) ;
}
2005-04-17 02:20:36 +04:00
/*
* Flags for inode locking .
2007-05-08 07:50:19 +04:00
* Bit ranges : 1 < < 1 - 1 < < 16 - 1 - - iolock / ilock modes ( bitfield )
* 1 < < 16 - 1 < < 32 - 1 - - lockdep annotation ( integers )
2005-04-17 02:20:36 +04:00
*/
2007-05-08 07:50:19 +04:00
# define XFS_IOLOCK_EXCL (1<<0)
# define XFS_IOLOCK_SHARED (1<<1)
# define XFS_ILOCK_EXCL (1<<2)
# define XFS_ILOCK_SHARED (1<<3)
2005-04-17 02:20:36 +04:00
2007-05-08 07:50:19 +04:00
# define XFS_LOCK_MASK (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED \
2008-04-22 11:34:00 +04:00
| XFS_ILOCK_EXCL | XFS_ILOCK_SHARED )
2007-05-08 07:50:19 +04:00
2009-12-15 02:14:59 +03:00
# define XFS_LOCK_FLAGS \
{ XFS_IOLOCK_EXCL , " IOLOCK_EXCL " } , \
{ XFS_IOLOCK_SHARED , " IOLOCK_SHARED " } , \
{ XFS_ILOCK_EXCL , " ILOCK_EXCL " } , \
2012-02-20 06:31:22 +04:00
{ XFS_ILOCK_SHARED , " ILOCK_SHARED " }
2009-12-15 02:14:59 +03:00
2007-05-08 07:50:19 +04:00
/*
* Flags for lockdep annotations .
*
2011-01-25 12:06:21 +03:00
* XFS_LOCK_PARENT - for directory operations that require locking a
* parent directory inode and a child entry inode . The parent gets locked
* with this flag so it gets a lockdep subclass of 1 and the child entry
* lock will have a lockdep subclass of 0.
*
* XFS_LOCK_RTBITMAP / XFS_LOCK_RTSUM - the realtime device bitmap and summary
* inodes do not participate in the normal lock order , and thus have their
* own subclasses .
2007-05-08 07:50:19 +04:00
*
2007-06-29 11:26:09 +04:00
* XFS_LOCK_INUMORDER - for locking several inodes at the some time
2007-05-08 07:50:19 +04:00
* with xfs_lock_inodes ( ) . This flag is used as the starting subclass
* and each subsequent lock acquired will increment the subclass by one .
2011-01-25 12:06:21 +03:00
* So the first lock acquired will have a lockdep subclass of 4 , the
* second lock will have a lockdep subclass of 5 , and so on . It is
2007-06-29 11:26:09 +04:00
* the responsibility of the class builder to shift this to the correct
* portion of the lock_mode lockdep mask .
2007-05-08 07:50:19 +04:00
*/
2007-06-29 11:26:09 +04:00
# define XFS_LOCK_PARENT 1
2011-01-25 12:06:21 +03:00
# define XFS_LOCK_RTBITMAP 2
# define XFS_LOCK_RTSUM 3
# define XFS_LOCK_INUMORDER 4
2007-06-29 11:26:09 +04:00
2007-05-08 07:50:19 +04:00
# define XFS_IOLOCK_SHIFT 16
2007-06-29 11:26:09 +04:00
# define XFS_IOLOCK_PARENT (XFS_LOCK_PARENT << XFS_IOLOCK_SHIFT)
2007-05-08 07:50:19 +04:00
# define XFS_ILOCK_SHIFT 24
2007-06-29 11:26:09 +04:00
# define XFS_ILOCK_PARENT (XFS_LOCK_PARENT << XFS_ILOCK_SHIFT)
2011-01-25 12:06:21 +03:00
# define XFS_ILOCK_RTBITMAP (XFS_LOCK_RTBITMAP << XFS_ILOCK_SHIFT)
# define XFS_ILOCK_RTSUM (XFS_LOCK_RTSUM << XFS_ILOCK_SHIFT)
2007-05-08 07:50:19 +04:00
# define XFS_IOLOCK_DEP_MASK 0x00ff0000
# define XFS_ILOCK_DEP_MASK 0xff000000
# define XFS_LOCK_DEP_MASK (XFS_IOLOCK_DEP_MASK | XFS_ILOCK_DEP_MASK)
# define XFS_IOLOCK_DEP(flags) (((flags) & XFS_IOLOCK_DEP_MASK) >> XFS_IOLOCK_SHIFT)
# define XFS_ILOCK_DEP(flags) (((flags) & XFS_ILOCK_DEP_MASK) >> XFS_ILOCK_SHIFT)
2005-04-17 02:20:36 +04:00
/*
* For multiple groups support : if S_ISGID bit is set in the parent
* directory , group of new file is set to that of the parent , and
* new subdirectory gets S_ISGID bit from parent .
*/
2007-08-30 11:21:12 +04:00
# define XFS_INHERIT_GID(pip) \
( ( ( pip ) - > i_mount - > m_flags & XFS_MOUNT_GRPID ) | | \
( ( pip ) - > i_d . di_mode & S_ISGID ) )
2005-04-17 02:20:36 +04:00
2012-10-08 14:56:11 +04:00
2006-09-28 05:02:23 +04:00
/*
2012-10-08 14:56:11 +04:00
* xfs_inode . c prototypes .
2006-09-28 05:02:23 +04:00
*/
2005-04-17 02:20:36 +04:00
void xfs_ilock ( xfs_inode_t * , uint ) ;
int xfs_ilock_nowait ( xfs_inode_t * , uint ) ;
void xfs_iunlock ( xfs_inode_t * , uint ) ;
void xfs_ilock_demote ( xfs_inode_t * , uint ) ;
2008-04-22 11:34:00 +04:00
int xfs_isilocked ( xfs_inode_t * , uint ) ;
2005-04-17 02:20:36 +04:00
uint xfs_ilock_map_shared ( xfs_inode_t * ) ;
void xfs_iunlock_map_shared ( xfs_inode_t * , uint ) ;
2011-07-26 10:50:15 +04:00
int xfs_ialloc ( struct xfs_trans * , xfs_inode_t * , umode_t ,
2010-09-26 10:10:18 +04:00
xfs_nlink_t , xfs_dev_t , prid_t , int ,
2012-07-04 18:54:47 +04:00
struct xfs_buf * * , xfs_inode_t * * ) ;
2007-08-28 07:57:51 +04:00
2005-04-17 02:20:36 +04:00
uint xfs_ip2xflags ( struct xfs_inode * ) ;
2007-12-07 06:07:20 +03:00
uint xfs_dic2xflags ( struct xfs_dinode * ) ;
2005-04-17 02:20:36 +04:00
int xfs_ifree ( struct xfs_trans * , xfs_inode_t * ,
struct xfs_bmap_free * ) ;
2011-07-08 16:34:34 +04:00
int xfs_itruncate_extents ( struct xfs_trans * * , struct xfs_inode * ,
int , xfs_fsize_t ) ;
2005-04-17 02:20:36 +04:00
int xfs_iunlink ( struct xfs_trans * , xfs_inode_t * ) ;
void xfs_iext_realloc ( xfs_inode_t * , int , int ) ;
2010-02-06 04:37:26 +03:00
void xfs_iunpin_wait ( xfs_inode_t * ) ;
2012-04-23 09:58:36 +04:00
int xfs_iflush ( struct xfs_inode * , struct xfs_buf * * ) ;
2008-04-22 11:34:06 +04:00
void xfs_lock_inodes ( xfs_inode_t * * , int , uint ) ;
2008-08-13 10:18:07 +04:00
void xfs_lock_two_inodes ( xfs_inode_t * , xfs_inode_t * , uint ) ;
2005-04-17 02:20:36 +04:00
2012-04-23 09:59:02 +04:00
xfs_extlen_t xfs_get_extsz_hint ( struct xfs_inode * ip ) ;
2008-12-03 14:20:40 +03:00
# define IHOLD(ip) \
do { \
ASSERT ( atomic_read ( & VFS_I ( ip ) - > i_count ) > 0 ) ; \
2010-10-23 19:11:40 +04:00
ihold ( VFS_I ( ip ) ) ; \
2009-12-15 02:14:59 +03:00
trace_xfs_ihold ( ip , _THIS_IP_ ) ; \
2008-12-03 14:20:40 +03:00
} while ( 0 )
# define IRELE(ip) \
do { \
2009-12-15 02:14:59 +03:00
trace_xfs_irele ( ip , _THIS_IP_ ) ; \
2008-12-03 14:20:40 +03:00
iput ( VFS_I ( ip ) ) ; \
} while ( 0 )
2008-10-30 09:05:38 +03:00
# endif /* __KERNEL__ */
2008-12-09 12:47:32 +03:00
/*
* Flags for xfs_iget ( )
*/
# define XFS_IGET_CREATE 0x1
2010-06-24 05:15:47 +04:00
# define XFS_IGET_UNTRUSTED 0x2
2012-03-22 09:15:10 +04:00
# define XFS_IGET_DONTCACHE 0x4
2008-12-09 12:47:32 +03:00
2012-07-03 20:21:22 +04:00
int xfs_imap_to_bp ( struct xfs_mount * , struct xfs_trans * ,
struct xfs_imap * , struct xfs_dinode * * ,
struct xfs_buf * * , uint , uint ) ;
2008-12-09 12:47:32 +03:00
int xfs_iread ( struct xfs_mount * , struct xfs_trans * ,
2010-06-24 05:35:17 +04:00
struct xfs_inode * , uint ) ;
2008-11-28 06:23:39 +03:00
void xfs_dinode_to_disk ( struct xfs_dinode * ,
2008-10-30 09:05:38 +03:00
struct xfs_icdinode * ) ;
void xfs_idestroy_fork ( struct xfs_inode * , int ) ;
void xfs_idata_realloc ( struct xfs_inode * , int , int ) ;
void xfs_iroot_realloc ( struct xfs_inode * , int , int ) ;
int xfs_iread_extents ( struct xfs_trans * , struct xfs_inode * , int ) ;
int xfs_iextents_copy ( struct xfs_inode * , xfs_bmbt_rec_t * , int ) ;
2007-08-16 10:23:40 +04:00
xfs_bmbt_rec_host_t * xfs_iext_get_ext ( xfs_ifork_t * , xfs_extnum_t ) ;
2009-11-25 03:00:21 +03:00
void xfs_iext_insert ( xfs_inode_t * , xfs_extnum_t , xfs_extnum_t ,
xfs_bmbt_irec_t * , int ) ;
2006-03-14 05:29:52 +03:00
void xfs_iext_add ( xfs_ifork_t * , xfs_extnum_t , int ) ;
2006-03-14 05:30:23 +03:00
void xfs_iext_add_indirect_multi ( xfs_ifork_t * , int , xfs_extnum_t , int ) ;
2009-11-25 03:00:21 +03:00
void xfs_iext_remove ( xfs_inode_t * , xfs_extnum_t , int , int ) ;
2006-03-14 05:29:52 +03:00
void xfs_iext_remove_inline ( xfs_ifork_t * , xfs_extnum_t , int ) ;
void xfs_iext_remove_direct ( xfs_ifork_t * , xfs_extnum_t , int ) ;
2006-03-14 05:30:23 +03:00
void xfs_iext_remove_indirect ( xfs_ifork_t * , xfs_extnum_t , int ) ;
2006-03-14 05:29:52 +03:00
void xfs_iext_realloc_direct ( xfs_ifork_t * , int ) ;
void xfs_iext_direct_to_inline ( xfs_ifork_t * , xfs_extnum_t ) ;
void xfs_iext_inline_to_direct ( xfs_ifork_t * , int ) ;
void xfs_iext_destroy ( xfs_ifork_t * ) ;
2007-08-16 10:23:40 +04:00
xfs_bmbt_rec_host_t * xfs_iext_bno_to_ext ( xfs_ifork_t * , xfs_fileoff_t , int * ) ;
2006-03-14 05:30:23 +03:00
xfs_ext_irec_t * xfs_iext_bno_to_irec ( xfs_ifork_t * , xfs_fileoff_t , int * ) ;
xfs_ext_irec_t * xfs_iext_idx_to_irec ( xfs_ifork_t * , xfs_extnum_t * , int * , int ) ;
void xfs_iext_irec_init ( xfs_ifork_t * ) ;
xfs_ext_irec_t * xfs_iext_irec_new ( xfs_ifork_t * , int ) ;
void xfs_iext_irec_remove ( xfs_ifork_t * , int ) ;
void xfs_iext_irec_compact ( xfs_ifork_t * ) ;
void xfs_iext_irec_compact_pages ( xfs_ifork_t * ) ;
void xfs_iext_irec_compact_full ( xfs_ifork_t * ) ;
void xfs_iext_irec_update_extoffs ( xfs_ifork_t * , int , int ) ;
2012-11-06 18:50:40 +04:00
bool xfs_can_free_eofblocks ( struct xfs_inode * , bool ) ;
2006-03-14 05:29:52 +03:00
2005-04-17 02:20:36 +04:00
# define xfs_ipincount(ip) ((unsigned int) atomic_read(&ip->i_pincount))
# if defined(DEBUG)
void xfs_inobp_check ( struct xfs_mount * , struct xfs_buf * ) ;
# else
# define xfs_inobp_check(mp, bp)
# endif /* DEBUG */
extern struct kmem_zone * xfs_ifork_zone ;
extern struct kmem_zone * xfs_inode_zone ;
extern struct kmem_zone * xfs_ili_zone ;
# endif /* __XFS_INODE_H__ */