diff options
Diffstat (limited to 'fs/xfs/xfs_inode.h')
| -rw-r--r-- | fs/xfs/xfs_inode.h | 493 | 
1 files changed, 157 insertions, 336 deletions
diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index fb2ca2e4cdc..f72bffa6726 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -18,201 +18,15 @@  #ifndef	__XFS_INODE_H__  #define	__XFS_INODE_H__ -struct posix_acl; -struct xfs_dinode; -struct xfs_inode; - -/* - * Fork identifiers. - */ -#define	XFS_DATA_FORK	0 -#define	XFS_ATTR_FORK	1 - -/* - * 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 4k in size, since 4k 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 4k 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 { -	xfs_bmbt_rec_host_t *er_extbuf;	/* block of extent records */ -	xfs_extnum_t	er_extoff;	/* extent offset in file */ -	xfs_extnum_t	er_extcount;	/* number of extents in page/block */ -} xfs_ext_irec_t; +#include "xfs_inode_buf.h" +#include "xfs_inode_fork.h" +#include "xfs_dinode.h"  /* - * File incore extent information, present for each of data & attr forks. + * Kernel only inode definitions   */ -#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 -typedef struct xfs_ifork { -	int			if_bytes;	/* bytes in if_u1 */ -	int			if_real_bytes;	/* bytes allocated in if_u1 */ -	struct xfs_btree_block	*if_broot;	/* file's incore btree root */ -	short			if_broot_bytes;	/* bytes allocated for root */ -	unsigned char		if_flags;	/* per-fork flags */ -	unsigned char		if_ext_max;	/* max # of extent records */ -	xfs_extnum_t		if_lastex;	/* last if_extents used */ -	union { -		xfs_bmbt_rec_host_t *if_extents;/* linear map file exts */ -		xfs_ext_irec_t	*if_ext_irec;	/* irec map file exts */ -		char		*if_data;	/* inline file data */ -	} if_u1; -	union { -		xfs_bmbt_rec_host_t if_inline_ext[XFS_INLINE_EXTS]; -						/* 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; - -/* - * 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 */ -}; - -/* - * 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. - * - * xfs_iptr_t contains all the inode fields upto and including the - * i_mnext and i_mprev fields, it is used as a marker in the inode - * chain off the mount structure by xfs_sync calls. - */ - -typedef struct xfs_ictimestamp { -	__int32_t	t_sec;		/* timestamp seconds */ -	__int32_t	t_nsec;		/* timestamp nanoseconds */ -} xfs_ictimestamp_t; - -/* - * NOTE:  This structure must be kept identical to struct xfs_dinode - * 	  in xfs_dinode.h except for the endianness annotations. - */ -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 */ -	__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 */ -	__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; - -/* - * 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))) - - - -#ifdef __KERNEL__ - -struct bhv_desc; +struct xfs_dinode; +struct xfs_inode;  struct xfs_buf;  struct xfs_bmap_free;  struct xfs_bmbt_irec; @@ -221,17 +35,12 @@ struct xfs_mount;  struct xfs_trans;  struct xfs_dquot; -typedef struct dm_attrs_s { -	__uint32_t	da_dmevmask;	/* DMIG event mask */ -	__uint16_t	da_dmstate;	/* DMIG state info */ -	__uint16_t	da_pad;		/* DMIG extra padding */ -} dm_attrs_t; -  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 */ +	struct xfs_dquot	*i_pdquot;	/* project dquot */  	/* Inode location stuff */  	xfs_ino_t		i_ino;		/* inode number (agno/agino)*/ @@ -241,33 +50,25 @@ typedef struct xfs_inode {  	xfs_ifork_t		*i_afp;		/* attribute fork pointer */  	xfs_ifork_t		i_df;		/* data fork */ +	/* operations vectors */ +	const struct xfs_dir_ops *d_ops;		/* directory ops vector */ +  	/* Transaction and locking information. */ -	struct xfs_trans	*i_transp;	/* ptr to owning transaction*/  	struct xfs_inode_log_item *i_itemp;	/* logging information */  	mrlock_t		i_lock;		/* inode lock */  	mrlock_t		i_iolock;	/* inode IO lock */ -	struct completion	i_flush;	/* inode flush completion q */  	atomic_t		i_pincount;	/* inode pin count */ -	wait_queue_head_t	i_ipin_wait;	/* inode pinning wait queue */  	spinlock_t		i_flags_lock;	/* inode i_flags lock */  	/* Miscellaneous state. */ -	unsigned short		i_flags;	/* see defined flags below */ -	unsigned char		i_update_core;	/* timestamps/size is dirty */ +	unsigned long		i_flags;	/* see defined flags below */  	unsigned int		i_delayed_blks;	/* count of delay alloc blks */  	xfs_icdinode_t		i_d;		/* most of ondisk inode */ -	xfs_fsize_t		i_size;		/* in-memory size */ -	xfs_fsize_t		i_new_size;	/* size when write completes */ -	atomic_t		i_iocount;	/* outstanding I/O count */ -  	/* VFS inode */  	struct inode		i_vnode;	/* embedded VFS inode */  } xfs_inode_t; -#define XFS_ISIZE(ip)	(((ip)->i_d.di_mode & S_IFMT) == S_IFREG) ? \ -				(ip)->i_size : (ip)->i_d.di_size; -  /* Convert from vfs inode to xfs inode */  static inline struct xfs_inode *XFS_I(struct inode *inode)  { @@ -281,6 +82,32 @@ static inline struct inode *VFS_I(struct xfs_inode *ip)  }  /* + * 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; +} + +/* + * 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; +} + +/*   * i_flags helper functions   */  static inline void @@ -334,9 +161,22 @@ xfs_iflags_test_and_clear(xfs_inode_t *ip, unsigned short flags)  	return ret;  } +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; +} +  /*   * Project quota id helpers (previously projid was 16bit only - * and using two 16bit values to hold new 32bit projid was choosen + * and using two 16bit values to hold new 32bit projid was chosen   * to retain compatibility with "old" filesystems).   */  static inline prid_t @@ -353,35 +193,67 @@ xfs_set_projid(struct xfs_inode *ip,  	ip->i_d.di_projid_lo = (__uint16_t) (projid & 0xffff);  } +static inline prid_t +xfs_get_initial_prid(struct xfs_inode *dp) +{ +	if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) +		return xfs_get_projid(dp); + +	return XFS_PROJID_DEFAULT; +} + +/* + * In-core inode flags. + */ +#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_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) +#define __XFS_IPINNED_BIT	8	 /* wakeup key for zero pin count */ +#define XFS_IPINNED		(1 << __XFS_IPINNED_BIT) +#define XFS_IDONTCACHE		(1 << 9) /* don't cache the inode long term */ +  /* - * Manage the i_flush queue embedded in the inode.  This completion - * queue synchronizes processes attempting to flush the in-core - * inode back to disk. + * Per-lifetime flags need to be reset when re-using a reclaimable inode during + * inode lookup. This prevents unintended behaviour on the new inode from + * ocurring.   */ -static inline void xfs_iflock(xfs_inode_t *ip) +#define XFS_IRECLAIM_RESET_FLAGS	\ +	(XFS_IRECLAIMABLE | XFS_IRECLAIM | \ +	 XFS_IDIRTY_RELEASE | XFS_ITRUNCATED) + +/* + * 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)  { -	wait_for_completion(&ip->i_flush); +	return !xfs_iflags_test_and_set(ip, XFS_IFLOCK);  } -static inline int xfs_iflock_nowait(xfs_inode_t *ip) +static inline void xfs_iflock(struct xfs_inode *ip)  { -	return try_wait_for_completion(&ip->i_flush); +	if (!xfs_iflock_nowait(ip)) +		__xfs_iflock(ip);  } -static inline void xfs_ifunlock(xfs_inode_t *ip) +static inline void xfs_ifunlock(struct xfs_inode *ip)  { -	complete(&ip->i_flush); +	xfs_iflags_clear(ip, XFS_IFLOCK); +	smp_mb(); +	wake_up_bit(&ip->i_flags, __XFS_IFLOCK_BIT);  } -/* - * In-core inode flags. - */ -#define XFS_IRECLAIM    0x0001  /* we have started reclaiming this inode    */ -#define XFS_ISTALE	0x0002	/* inode has been staled */ -#define XFS_IRECLAIMABLE 0x0004 /* inode can be reclaimed */ -#define XFS_INEW	0x0008	/* inode has just been allocated */ -#define XFS_IFILESTREAM	0x0010	/* inode is in a filestream directory */ -#define XFS_ITRUNCATED	0x0020	/* truncated down so flush-on-close */ +static inline int xfs_isiflocked(struct xfs_inode *ip) +{ +	return xfs_iflags_test(ip, XFS_IFLOCK); +}  /*   * Flags for inode locking. @@ -392,7 +264,6 @@ static inline void xfs_ifunlock(xfs_inode_t *ip)  #define	XFS_IOLOCK_SHARED	(1<<1)  #define	XFS_ILOCK_EXCL		(1<<2)  #define	XFS_ILOCK_SHARED	(1<<3) -#define	XFS_IUNLOCK_NONOTIFY	(1<<4)  #define XFS_LOCK_MASK		(XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED \  				| XFS_ILOCK_EXCL | XFS_ILOCK_SHARED) @@ -401,35 +272,41 @@ static inline void xfs_ifunlock(xfs_inode_t *ip)  	{ XFS_IOLOCK_EXCL,	"IOLOCK_EXCL" }, \  	{ XFS_IOLOCK_SHARED,	"IOLOCK_SHARED" }, \  	{ XFS_ILOCK_EXCL,	"ILOCK_EXCL" }, \ -	{ XFS_ILOCK_SHARED,	"ILOCK_SHARED" }, \ -	{ XFS_IUNLOCK_NONOTIFY,	"IUNLOCK_NONOTIFY" } +	{ XFS_ILOCK_SHARED,	"ILOCK_SHARED" }  /*   * Flags for lockdep annotations.   * - * XFS_I[O]LOCK_PARENT - for operations that require locking two inodes - * (ie directory operations that require locking a directory inode and - * an entry inode).  The first inode gets locked with this flag so it - * gets a lockdep subclass of 1 and the second lock will have a lockdep - * subclass of 0. + * 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.   *   * XFS_LOCK_INUMORDER - for locking several inodes at the some time   * with xfs_lock_inodes().  This flag is used as the starting subclass   * and each subsequent lock acquired will increment the subclass by one. - * So the first lock acquired will have a lockdep subclass of 2, the - * second lock will have a lockdep subclass of 3, and so on. It is + * 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   * the responsibility of the class builder to shift this to the correct   * portion of the lock_mode lockdep mask.   */  #define XFS_LOCK_PARENT		1 -#define XFS_LOCK_INUMORDER	2 +#define XFS_LOCK_RTBITMAP	2 +#define XFS_LOCK_RTSUM		3 +#define XFS_LOCK_INUMORDER	4  #define XFS_IOLOCK_SHIFT	16  #define	XFS_IOLOCK_PARENT	(XFS_LOCK_PARENT << XFS_IOLOCK_SHIFT)  #define XFS_ILOCK_SHIFT		24  #define	XFS_ILOCK_PARENT	(XFS_LOCK_PARENT << XFS_ILOCK_SHIFT) +#define	XFS_ILOCK_RTBITMAP	(XFS_LOCK_RTBITMAP << XFS_ILOCK_SHIFT) +#define	XFS_ILOCK_RTSUM		(XFS_LOCK_RTSUM << XFS_ILOCK_SHIFT)  #define XFS_IOLOCK_DEP_MASK	0x00ff0000  #define XFS_ILOCK_DEP_MASK	0xff000000 @@ -439,16 +316,6 @@ static inline void xfs_ifunlock(xfs_inode_t *ip)  #define XFS_ILOCK_DEP(flags)	(((flags) & XFS_ILOCK_DEP_MASK) >> XFS_ILOCK_SHIFT)  /* - * Flags for xfs_itruncate_start(). - */ -#define	XFS_ITRUNC_DEFINITE	0x1 -#define	XFS_ITRUNC_MAYBE	0x2 - -#define XFS_ITRUNC_FLAGS \ -	{ XFS_ITRUNC_DEFINITE,	"DEFINITE" }, \ -	{ XFS_ITRUNC_MAYBE,	"MAYBE" } - -/*   * 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. @@ -457,45 +324,64 @@ static inline void xfs_ifunlock(xfs_inode_t *ip)  	(((pip)->i_mount->m_flags & XFS_MOUNT_GRPID) || \  	 ((pip)->i_d.di_mode & S_ISGID)) -/* - * xfs_iget.c prototypes. - */ -int		xfs_iget(struct xfs_mount *, struct xfs_trans *, xfs_ino_t, -			 uint, uint, xfs_inode_t **); + +int		xfs_release(struct xfs_inode *ip); +void		xfs_inactive(struct xfs_inode *ip); +int		xfs_lookup(struct xfs_inode *dp, struct xfs_name *name, +			   struct xfs_inode **ipp, struct xfs_name *ci_name); +int		xfs_create(struct xfs_inode *dp, struct xfs_name *name, +			   umode_t mode, xfs_dev_t rdev, struct xfs_inode **ipp); +int		xfs_create_tmpfile(struct xfs_inode *dp, struct dentry *dentry, +			   umode_t mode, struct xfs_inode **ipp); +int		xfs_remove(struct xfs_inode *dp, struct xfs_name *name, +			   struct xfs_inode *ip); +int		xfs_link(struct xfs_inode *tdp, struct xfs_inode *sip, +			 struct xfs_name *target_name); +int		xfs_rename(struct xfs_inode *src_dp, struct xfs_name *src_name, +			   struct xfs_inode *src_ip, struct xfs_inode *target_dp, +			   struct xfs_name *target_name, +			   struct xfs_inode *target_ip); +  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);  int		xfs_isilocked(xfs_inode_t *, uint); -uint		xfs_ilock_map_shared(xfs_inode_t *); -void		xfs_iunlock_map_shared(xfs_inode_t *, uint); -void		xfs_inode_free(struct xfs_inode *ip); - -/* - * xfs_inode.c prototypes. - */ -int		xfs_ialloc(struct xfs_trans *, xfs_inode_t *, mode_t, +uint		xfs_ilock_data_map_shared(struct xfs_inode *); +uint		xfs_ilock_attr_map_shared(struct xfs_inode *); +int		xfs_ialloc(struct xfs_trans *, xfs_inode_t *, umode_t,  			   xfs_nlink_t, xfs_dev_t, prid_t, int, -			   struct xfs_buf **, boolean_t *, xfs_inode_t **); +			   struct xfs_buf **, xfs_inode_t **);  uint		xfs_ip2xflags(struct xfs_inode *);  uint		xfs_dic2xflags(struct xfs_dinode *);  int		xfs_ifree(struct xfs_trans *, xfs_inode_t *,  			   struct xfs_bmap_free *); -int		xfs_itruncate_start(xfs_inode_t *, uint, xfs_fsize_t); -int		xfs_itruncate_finish(struct xfs_trans **, xfs_inode_t *, -				     xfs_fsize_t, int, int); +int		xfs_itruncate_extents(struct xfs_trans **, struct xfs_inode *, +				      int, xfs_fsize_t);  int		xfs_iunlink(struct xfs_trans *, xfs_inode_t *);  void		xfs_iext_realloc(xfs_inode_t *, int, int); +  void		xfs_iunpin_wait(xfs_inode_t *); -int		xfs_iflush(xfs_inode_t *, uint); +#define xfs_ipincount(ip)	((unsigned int) atomic_read(&ip->i_pincount)) + +int		xfs_iflush(struct xfs_inode *, struct xfs_buf **);  void		xfs_lock_inodes(xfs_inode_t **, int, uint);  void		xfs_lock_two_inodes(xfs_inode_t *, xfs_inode_t *, uint); -void		xfs_synchronize_times(xfs_inode_t *); -void		xfs_mark_inode_dirty(xfs_inode_t *); -void		xfs_mark_inode_dirty_sync(xfs_inode_t *); +xfs_extlen_t	xfs_get_extsz_hint(struct xfs_inode *ip); + +int		xfs_dir_ialloc(struct xfs_trans **, struct xfs_inode *, umode_t, +			       xfs_nlink_t, xfs_dev_t, prid_t, int, +			       struct xfs_inode **, int *); +int		xfs_droplink(struct xfs_trans *, struct xfs_inode *); +int		xfs_bumplink(struct xfs_trans *, struct xfs_inode *); + +/* from xfs_file.c */ +int		xfs_zero_eof(struct xfs_inode *, xfs_off_t, xfs_fsize_t); +int		xfs_iozero(struct xfs_inode *, loff_t, size_t); +  #define IHOLD(ip) \  do { \ @@ -510,71 +396,6 @@ do { \  	iput(VFS_I(ip)); \  } while (0) -#endif /* __KERNEL__ */ - -/* - * Flags for xfs_iget() - */ -#define XFS_IGET_CREATE		0x1 -#define XFS_IGET_UNTRUSTED	0x2 - -int		xfs_inotobp(struct xfs_mount *, struct xfs_trans *, -			    xfs_ino_t, struct xfs_dinode **, -			    struct xfs_buf **, int *, uint); -int		xfs_itobp(struct xfs_mount *, struct xfs_trans *, -			  struct xfs_inode *, struct xfs_dinode **, -			  struct xfs_buf **, uint); -int		xfs_iread(struct xfs_mount *, struct xfs_trans *, -			  struct xfs_inode *, uint); -void		xfs_dinode_to_disk(struct xfs_dinode *, -				   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); - -xfs_bmbt_rec_host_t *xfs_iext_get_ext(xfs_ifork_t *, xfs_extnum_t); -void		xfs_iext_insert(xfs_inode_t *, xfs_extnum_t, xfs_extnum_t, -				xfs_bmbt_irec_t *, int); -void		xfs_iext_add(xfs_ifork_t *, xfs_extnum_t, int); -void		xfs_iext_add_indirect_multi(xfs_ifork_t *, int, xfs_extnum_t, int); -void		xfs_iext_remove(xfs_inode_t *, xfs_extnum_t, int, int); -void		xfs_iext_remove_inline(xfs_ifork_t *, xfs_extnum_t, int); -void		xfs_iext_remove_direct(xfs_ifork_t *, xfs_extnum_t, int); -void		xfs_iext_remove_indirect(xfs_ifork_t *, xfs_extnum_t, int); -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 *); -xfs_bmbt_rec_host_t *xfs_iext_bno_to_ext(xfs_ifork_t *, xfs_fileoff_t, int *); -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); - -#define xfs_ipincount(ip)	((unsigned int) atomic_read(&ip->i_pincount)) - -#ifdef DEBUG -void		xfs_isize_check(struct xfs_mount *, struct xfs_inode *, -				xfs_fsize_t); -#else	/* DEBUG */ -#define xfs_isize_check(mp, ip, isize) -#endif	/* DEBUG */ - -#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__ */  | 
