Re: libxfs 5.7 resync

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, May 07, 2020 at 05:54:54PM +0200, Christoph Hellwig wrote:
> On Thu, May 07, 2020 at 08:48:09AM -0700, Darrick J. Wong wrote:
> > >    xfs_check fails after various tests with multiply claimed extents.
> > >    This seems like some weird race, as neither repair nor manually
> > >    running check finds anything.  I had to patch out running xfs_check
> > >    to get useful xfstests runs
> > >  - but xfs/017 manually runs check and also still sees this
> > 
> > /me wonders if that's due to the onstack xfs_inode in db/check.c...
> 
> Not sure how that would affect us, but it definitively is going to be
> a problem going ahead.
> 
> I'd so love to finally kill off the check command with all its problems.

I've got a series fixing /most/ of the "check barfed but repair didn't
notice" bugs ready to go whenever we finish our libxfs 5.7 sync party.

(Still totally unwritten is checking the quota values.)

> > I guess you could compare your git tree with mine:
> > https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfsprogs-dev.git/log/?h=libxfs-5.7-sync
> 
> Diff from your to my version attached.  I find a few version in
> yours nicer, some in mine, but didn't spot anything substantial
> except that your version of db/attrset.c is missing various sanity
> checks that we removed from libxfs.

Yeah, I saw the LIBXFS_ATTR_* mess in there and decided to cut and run
for the exits....

--D

> diff --git a/db/agfl.c b/db/agfl.c
> index 874d1174..ce7a2548 100644
> --- a/db/agfl.c
> +++ b/db/agfl.c
> @@ -47,8 +47,9 @@ const field_t	agfl_crc_flds[] = {
>  	{ "uuid", FLDT_UUID, OI(OFF(uuid)), C1, 0, TYP_NONE },
>  	{ "lsn", FLDT_UINT64X, OI(OFF(lsn)), C1, 0, TYP_NONE },
>  	{ "crc", FLDT_CRC, OI(OFF(crc)), C1, 0, TYP_NONE },
> +	/* the bno array really is behind the actual structure */
>  	{ "bno", FLDT_AGBLOCKNZ, OI(bitize(sizeof(struct xfs_agfl))),
> -		agfl_bno_size, FLD_ARRAY | FLD_COUNT, TYP_DATA },
> +	  agfl_bno_size, FLD_ARRAY|FLD_COUNT, TYP_DATA },
>  	{ NULL }
>  };
>  
> diff --git a/db/attrset.c b/db/attrset.c
> index 8e1fcdf0..6ff3e6c8 100644
> --- a/db/attrset.c
> +++ b/db/attrset.c
> @@ -66,10 +66,9 @@ attr_set_f(
>  	int			argc,
>  	char			**argv)
>  {
> -	struct xfs_da_args	args = { NULL };
> -	struct xfs_inode	*ip = NULL;
> -	char			*name, *value, *sp;
> -	int			c, valuelen = 0;
> +	struct xfs_da_args	args = { };
> +	char			*sp;
> +	int			c;
>  
>  	if (cur_typ == NULL) {
>  		dbprintf(_("no current type\n"));
> @@ -84,24 +83,26 @@ attr_set_f(
>  		switch (c) {
>  		/* namespaces */
>  		case 'r':
> -			args.attr_filter |= LIBXFS_ATTR_ROOT;
> -			args.attr_filter &= ~LIBXFS_ATTR_SECURE;
> +			args.attr_filter |= XFS_ATTR_ROOT;
> +			args.attr_filter &= ~XFS_ATTR_SECURE;
>  			break;
>  		case 'u':
> -			args.attr_filter &= ~(LIBXFS_ATTR_ROOT |
> -					      LIBXFS_ATTR_SECURE);
> +			args.attr_filter &= ~XFS_ATTR_ROOT;
> +			args.attr_filter &= ~XFS_ATTR_SECURE;
>  			break;
>  		case 's':
> -			args.attr_filter |= LIBXFS_ATTR_SECURE;
> -			args.attr_filter &= ~LIBXFS_ATTR_ROOT;
> +			args.attr_filter |= XFS_ATTR_SECURE;
> +			args.attr_filter &= ~XFS_ATTR_ROOT;
>  			break;
>  
>  		/* modifiers */
>  		case 'C':
> -			args.attr_flags |= LIBXFS_ATTR_CREATE;
> +			args.attr_flags |= XATTR_CREATE;
> +			args.attr_flags &= ~XATTR_REPLACE;
>  			break;
>  		case 'R':
> -			args.attr_flags |= LIBXFS_ATTR_REPLACE;
> +			args.attr_flags |= XATTR_REPLACE;
> +			args.attr_flags &= ~XATTR_CREATE;
>  			break;
>  
>  		case 'n':
> @@ -110,8 +111,9 @@ attr_set_f(
>  
>  		/* value length */
>  		case 'v':
> -			valuelen = (int)strtol(optarg, &sp, 0);
> -			if (*sp != '\0' || valuelen < 0 || valuelen > 64*1024) {
> +			args.valuelen = strtol(optarg, &sp, 0);
> +			if (*sp != '\0' ||
> +			    args.valuelen < 0 || args.valuelen > 64 * 1024) {
>  				dbprintf(_("bad attr_set valuelen %s\n"), optarg);
>  				return 0;
>  			}
> @@ -128,34 +130,38 @@ attr_set_f(
>  		return 0;
>  	}
>  
> -	name = argv[optind];
> +	args.name = (const unsigned char *)argv[optind];
> +	if (!args.name) {
> +		dbprintf(_("invalid name\n"));
> +		return 0;
> +	}
> +
> +	args.namelen = strlen(argv[optind]);
> +	if (args.namelen >= MAXNAMELEN) {
> +		dbprintf(_("name too long\n"));
> +		return 0;
> +	}
>  
> -	if (valuelen) {
> -		value = (char *)memalign(getpagesize(), valuelen);
> -		if (!value) {
> -			dbprintf(_("cannot allocate buffer (%d)\n"), valuelen);
> +	if (args.valuelen) {
> +		args.value = memalign(getpagesize(), args.valuelen);
> +		if (!args.value) {
> +			dbprintf(_("cannot allocate buffer (%d)\n"),
> +				args.valuelen);
>  			goto out;
>  		}
> -		memset(value, 'v', valuelen);
> -	} else {
> -		value = NULL;
> +		memset(args.value, 'v', args.valuelen);
>  	}
>  
> -	if (libxfs_iget(mp, NULL, iocur_top->ino, 0, &ip,
> +	if (libxfs_iget(mp, NULL, iocur_top->ino, 0, &args.dp,
>  			&xfs_default_ifork_ops)) {
>  		dbprintf(_("failed to iget inode %llu\n"),
>  			(unsigned long long)iocur_top->ino);
>  		goto out;
>  	}
>  
> -	args.dp = ip;
> -	args.name = (unsigned char *)name;
> -	args.namelen = strlen(name);
> -	args.value = value;
> -
> -	if (libxfs_attr_set(&args)){
> +	if (libxfs_attr_set(&args)) {
>  		dbprintf(_("failed to set attr %s on inode %llu\n"),
> -			name, (unsigned long long)iocur_top->ino);
> +			args.name, (unsigned long long)iocur_top->ino);
>  		goto out;
>  	}
>  
> @@ -164,10 +170,10 @@ attr_set_f(
>  
>  out:
>  	mp->m_flags &= ~LIBXFS_MOUNT_COMPAT_ATTR;
> -	if (ip)
> -		libxfs_irele(ip);
> -	if (value)
> -		free(value);
> +	if (args.dp)
> +		libxfs_irele(args.dp);
> +	if (args.value)
> +		free(args.value);
>  	return 0;
>  }
>  
> @@ -176,9 +182,7 @@ attr_remove_f(
>  	int			argc,
>  	char			**argv)
>  {
> -	struct xfs_da_args	args = { NULL };
> -	struct xfs_inode	*ip = NULL;
> -	char			*name;
> +	struct xfs_da_args	args = { };
>  	int			c;
>  
>  	if (cur_typ == NULL) {
> @@ -194,16 +198,16 @@ attr_remove_f(
>  		switch (c) {
>  		/* namespaces */
>  		case 'r':
> -			args.attr_filter |= LIBXFS_ATTR_ROOT;
> -			args.attr_filter &= ~LIBXFS_ATTR_SECURE;
> +			args.attr_filter |= XFS_ATTR_ROOT;
> +			args.attr_filter &= ~XFS_ATTR_SECURE;
>  			break;
>  		case 'u':
> -			args.attr_filter &= ~(LIBXFS_ATTR_ROOT |
> -					      LIBXFS_ATTR_SECURE);
> +			args.attr_filter &= ~XFS_ATTR_ROOT;
> +			args.attr_filter &= ~XFS_ATTR_SECURE;
>  			break;
>  		case 's':
> -			args.attr_filter |= LIBXFS_ATTR_SECURE;
> -			args.attr_filter &= ~LIBXFS_ATTR_ROOT;
> +			args.attr_filter |= XFS_ATTR_SECURE;
> +			args.attr_filter &= ~XFS_ATTR_ROOT;
>  			break;
>  
>  		case 'n':
> @@ -221,22 +225,29 @@ attr_remove_f(
>  		return 0;
>  	}
>  
> -	name = argv[optind];
> +	args.name = (const unsigned char *)argv[optind];
> +	if (!args.name) {
> +		dbprintf(_("invalid name\n"));
> +		return 0;
> +	}
>  
> -	if (libxfs_iget(mp, NULL, iocur_top->ino, 0, &ip,
> +	args.namelen = strlen(argv[optind]);
> +	if (args.namelen >= MAXNAMELEN) {
> +		dbprintf(_("name too long\n"));
> +		return 0;
> +	}
> +
> +	if (libxfs_iget(mp, NULL, iocur_top->ino, 0, &args.dp,
>  			&xfs_default_ifork_ops)) {
>  		dbprintf(_("failed to iget inode %llu\n"),
>  			(unsigned long long)iocur_top->ino);
>  		goto out;
>  	}
>  
> -	args.dp = ip;
> -	args.name = (unsigned char *)name;
> -	args.namelen = strlen(name);
> -
>  	if (libxfs_attr_set(&args)) {
>  		dbprintf(_("failed to remove attr %s from inode %llu\n"),
> -			name, (unsigned long long)iocur_top->ino);
> +			(unsigned char *)args.name,
> +			(unsigned long long)iocur_top->ino);
>  		goto out;
>  	}
>  
> @@ -245,7 +256,7 @@ attr_remove_f(
>  
>  out:
>  	mp->m_flags &= ~LIBXFS_MOUNT_COMPAT_ATTR;
> -	if (ip)
> -		libxfs_irele(ip);
> +	if (args.dp)
> +		libxfs_irele(args.dp);
>  	return 0;
>  }
> diff --git a/db/check.c b/db/check.c
> index 799baa5b..a57a692a 100644
> --- a/db/check.c
> +++ b/db/check.c
> @@ -2771,7 +2771,7 @@ process_inode(
>  		error++;
>  		return;
>  	}
> -	if ((unsigned int)XFS_DFORK_ASIZE(dip, mp) >= XFS_LITINO(mp)) {
> +	if ((unsigned int)XFS_DFORK_ASIZE(dip, mp) >= XFS_LITINO(mp))  {
>  		if (v)
>  			dbprintf(_("bad fork offset %d for inode %lld\n"),
>  				xino.i_d.di_forkoff, id->ino);
> @@ -2897,11 +2897,8 @@ process_inode(
>  			break;
>  		}
>  		if (ic) {
> -			xfs_dqid_t	uid = i_uid_read(VFS_I(&xino));
> -			xfs_dqid_t	gid = i_gid_read(VFS_I(&xino));
> -
> -			quota_add(&xino.i_d.di_projid, &gid, &uid, 0, bc, ic,
> -				  rc);
> +			quota_add(&xino.i_d.di_projid, &xino.i_vnode.i_gid,
> +				  &xino.i_vnode.i_uid, 0, bc, ic, rc);
>  		}
>  	}
>  	totblocks = totdblocks + totiblocks + atotdblocks + atotiblocks;
> @@ -4076,7 +4073,7 @@ scan_freelist(
>  		return;
>  	}
>  
> -	/* open coded XFS_BUF_TO_AGFL_BNO */
> +	/* open coded xfs_buf_to_agfl_bno */
>  	state.count = 0;
>  	state.agno = seqno;
>  	libxfs_agfl_walk(mp, agf, iocur_top->bp, scan_agfl, &state);
> diff --git a/db/metadump.c b/db/metadump.c
> index 14e7eaa7..e5cb3aa5 100644
> --- a/db/metadump.c
> +++ b/db/metadump.c
> @@ -2415,8 +2415,7 @@ process_inode(
>  	nametable_clear();
>  
>  	/* copy extended attributes if they exist and forkoff is valid */
> -	if (success &&
> -	    XFS_DFORK_DSIZE(dip, mp) < XFS_LITINO(mp)) {
> +	if (success && XFS_DFORK_DSIZE(dip, mp) < XFS_LITINO(mp)) {
>  		attr_data.remote_val_count = 0;
>  		switch (dip->di_aformat) {
>  			case XFS_DINODE_FMT_LOCAL:
> diff --git a/include/libxfs.h b/include/libxfs.h
> index 661aa674..12447835 100644
> --- a/include/libxfs.h
> +++ b/include/libxfs.h
> @@ -67,7 +67,6 @@ struct iomap;
>  #include "xfs_inode_buf.h"
>  #include "xfs_alloc.h"
>  #include "xfs_btree.h"
> -#include "xfs_btree_staging.h"
>  #include "xfs_btree_trace.h"
>  #include "xfs_bmap.h"
>  #include "xfs_trace.h"
> diff --git a/include/linux.h b/include/linux.h
> index 57726bb1..0c7173c8 100644
> --- a/include/linux.h
> +++ b/include/linux.h
> @@ -11,6 +11,7 @@
>  #include <sys/param.h>
>  #include <sys/sysmacros.h>
>  #include <sys/stat.h>
> +#include <sys/xattr.h>
>  #include <inttypes.h>
>  #include <malloc.h>
>  #include <getopt.h>
> diff --git a/include/platform_defs.h.in b/include/platform_defs.h.in
> index cef1be1e..1f7ceafb 100644
> --- a/include/platform_defs.h.in
> +++ b/include/platform_defs.h.in
> @@ -24,15 +24,6 @@
>  #include <stdbool.h>
>  #include <libgen.h>
>  
> -/* Get XATTR_CREATE and XATTR_REPLACE from somewhere... */
> -#ifdef HAVE_FSETXATTR
> -# include <sys/xattr.h>
> -#elif defined HAVE_LIBATTR
> -# include <attr/xattr.h>
> -#else
> -# include <linux/xattr.h>
> -#endif /* HAVE_FSETXATTR */
> -
>  typedef struct filldir		filldir_t;
>  
>  /* long and pointer must be either 32 bit or 64 bit */
> diff --git a/include/xfs_inode.h b/include/xfs_inode.h
> index 2fa26b8a..b9cdd8ca 100644
> --- a/include/xfs_inode.h
> +++ b/include/xfs_inode.h
> @@ -26,16 +26,6 @@ struct xfs_dir_ops;
>  #define IS_I_VERSION(inode)			(0)
>  #define inode_maybe_inc_iversion(inode,flags)	(0)
>  
> -/* Borrow the kernel's uid/gid types. */
> -
> -typedef struct {
> -	uid_t val;
> -} kuid_t;
> -
> -typedef struct {
> -	gid_t val;
> -} kgid_t;
> -
>  /*
>   * Inode interface. This fakes up a "VFS inode" to make the xfs_inode appear
>   * similar to the kernel which now is used tohold certain parts of the on-disk
> @@ -44,6 +34,8 @@ typedef struct {
>  struct inode {
>  	mode_t		i_mode;
>  	uint32_t	i_nlink;
> +	uint32_t	i_uid;
> +	uint32_t	i_gid;
>  	xfs_dev_t	i_rdev;		/* This actually holds xfs_dev_t */
>  	unsigned long	i_state;	/* Not actually used in userspace */
>  	uint32_t	i_generation;
> @@ -51,29 +43,13 @@ struct inode {
>  	struct timespec	i_atime;
>  	struct timespec	i_mtime;
>  	struct timespec	i_ctime;
> -	kuid_t		i_uid;
> -	kgid_t		i_gid;
>  };
>  
> -static inline void i_uid_write(struct inode *inode, uid_t uid)
> -{
> -	inode->i_uid.val = uid;
> -}
> +#define i_uid_write(inode, uid)		(inode)->i_uid = (uid)
> +#define i_uid_read(inode)		((inode)->i_uid)
>  
> -static inline void i_gid_write(struct inode *inode, gid_t gid)
> -{
> -	inode->i_gid.val = gid;
> -}
> -
> -static inline uid_t i_uid_read(const struct inode *inode)
> -{
> -	return inode->i_uid.val;
> -}
> -
> -static inline gid_t i_gid_read(const struct inode *inode)
> -{
> -	return inode->i_gid.val;
> -}
> +#define i_gid_write(inode, gid)		(inode)->i_gid = (gid)
> +#define i_gid_read(inode)		((inode)->i_gid)
>  
>  typedef struct xfs_inode {
>  	struct cache_node	i_node;
> diff --git a/include/xfs_trace.h b/include/xfs_trace.h
> index 344f4541..8a9dd794 100644
> --- a/include/xfs_trace.h
> +++ b/include/xfs_trace.h
> @@ -46,6 +46,13 @@
>  #define trace_xfs_btree_corrupt(a,b)		((void) 0)
>  #define trace_xfs_btree_updkeys(a,b,c)		((void) 0)
>  #define trace_xfs_btree_overlapped_query_range(a,b,c)	((void) 0)
> +#define trace_xfs_btree_commit_afakeroot(cur)	((void) 0)
> +#define trace_xfs_btree_commit_ifakeroot(cur)	((void) 0)
> +#define trace_xfs_btree_bload_level_geometry(cur, level, nr_this_level, \
> +		avg_per_block, desired_npb, blocks, blocks_with_extra) \
> +						((void) 0)
> +#define trace_xfs_btree_bload_block(cur, level, i, blocks, ptr, nr_this_block) \
> +						((void) 0)
>  
>  #define trace_xfs_free_extent(a,b,c,d,e,f,g)	((void) 0)
>  #define trace_xfs_agf(a,b,c,d)			((void) 0)
> @@ -303,11 +310,6 @@
>  
>  #define trace_xfs_fs_mark_healthy(a,b)		((void) 0)
>  
> -#define trace_xfs_btree_commit_afakeroot(...)	((void) 0)
> -#define trace_xfs_btree_commit_ifakeroot(...)	((void) 0)
> -#define trace_xfs_btree_bload_level_geometry(...)	((void) 0)
> -#define trace_xfs_btree_bload_block(...)	((void )0)
> -
>  /* set c = c to avoid unused var warnings */
>  #define trace_xfs_perag_get(a,b,c,d)		((c) = (c))
>  #define trace_xfs_perag_get_tag(a,b,c,d)	((c) = (c))
> diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h
> index 2493680d..11e5a447 100644
> --- a/libxfs/libxfs_api_defs.h
> +++ b/libxfs/libxfs_api_defs.h
> @@ -13,11 +13,6 @@
>   * it can be included in both the internal and external libxfs header files
>   * without introducing any depenencies between the two.
>   */
> -#define LIBXFS_ATTR_CREATE		XATTR_CREATE
> -#define LIBXFS_ATTR_REPLACE		XATTR_REPLACE
> -#define LIBXFS_ATTR_ROOT		XFS_ATTR_ROOT
> -#define LIBXFS_ATTR_SECURE		XFS_ATTR_SECURE
> -
>  #define xfs_agfl_size			libxfs_agfl_size
>  #define xfs_agfl_walk			libxfs_agfl_walk
>  
> diff --git a/libxfs/libxfs_io.h b/libxfs/libxfs_io.h
> index 8a2e5a88..cfee2ea3 100644
> --- a/libxfs/libxfs_io.h
> +++ b/libxfs/libxfs_io.h
> @@ -258,7 +258,9 @@ xfs_buf_delwri_queue(struct xfs_buf *bp, struct list_head *buffer_list)
>  	return true;
>  }
>  
> +/* stub - only needed for the unused btree staging code to compile */
> +#define xfs_buf_delwri_cancel(list)	do { } while (0)
> +
>  int xfs_buf_delwri_submit(struct list_head *buffer_list);
> -void xfs_buf_delwri_cancel(struct list_head *buffer_list);
>  
>  #endif	/* __LIBXFS_IO_H__ */
> diff --git a/libxfs/libxfs_priv.h b/libxfs/libxfs_priv.h
> index 885282c8..70c70479 100644
> --- a/libxfs/libxfs_priv.h
> +++ b/libxfs/libxfs_priv.h
> @@ -258,26 +258,33 @@ div_u64_rem(uint64_t dividend, uint32_t divisor, uint32_t *remainder)
>   *
>   * Return: sets ``*remainder``, then returns dividend / divisor
>   */
> -static inline uint64_t
> -div64_u64_rem(
> -	uint64_t	dividend,
> -	uint64_t	divisor,
> -	uint64_t	*remainder)
> +static inline uint64_t div64_u64_rem(uint64_t dividend, uint64_t divisor,
> +		uint64_t *remainder)
>  {
>  	*remainder = dividend % divisor;
>  	return dividend / divisor;
>  }
>  
> -static inline uint64_t
> -div_u64(uint64_t dividend, uint32_t divisor)
> +/**
> + * div_u64 - unsigned 64bit divide with 32bit divisor
> + * @dividend: unsigned 64bit dividend
> + * @divisor: unsigned 32bit divisor
> + *
> + * This is the most common 64bit divide and should be used if possible,
> + * as many 32bit archs can optimize this variant better than a full 64bit
> + * divide.
> + */
> +static inline uint64_t div_u64(uint64_t dividend, uint32_t divisor)
>  {
> -	return dividend / divisor;
> +	uint32_t remainder;
> +	return div_u64_rem(dividend, divisor, &remainder);
>  }
>  
> -static inline uint64_t
> -howmany_64(uint64_t dividend, uint32_t divisor)
> +static inline uint64_t howmany_64(uint64_t x, uint32_t y)
>  {
> -	return div_u64(dividend + divisor - 1, divisor);
> +	x += y - 1;
> +	do_div(x, y);
> +	return x;
>  }
>  
>  #define min_t(type,x,y) \
> @@ -556,7 +563,7 @@ void xfs_inode_verifier_error(struct xfs_inode *ip, int error,
>  #define xfs_buf_verifier_error(bp,e,n,bu,bus,fa) \
>  	xfs_verifier_error(bp, e, fa)
>  void
> -xfs_buf_corruption_error(struct xfs_buf *bp, xfs_failaddr_t fa);
> +xfs_buf_corruption_error(struct xfs_buf *bp);
>  
>  void __xfs_buf_mark_corrupt(struct xfs_buf *bp, xfs_failaddr_t fa);
>  #define xfs_buf_mark_corrupt(bp) __xfs_buf_mark_corrupt((bp), __this_address)
> diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c
> index 8c549e20..fd656512 100644
> --- a/libxfs/rdwr.c
> +++ b/libxfs/rdwr.c
> @@ -1368,26 +1368,6 @@ xfs_buf_delwri_submit(
>  	return error;
>  }
>  
> -/*
> - * Cancel a delayed write list.
> - *
> - * Remove each buffer from the list, clear the delwri queue flag and drop the
> - * associated buffer reference.
> - */
> -void
> -xfs_buf_delwri_cancel(
> -	struct list_head	*buffer_list)
> -{
> -	struct xfs_buf		*bp;
> -
> -	while (!list_empty(buffer_list)) {
> -		bp = list_first_entry(buffer_list, struct xfs_buf, b_list);
> -		list_del_init(&bp->b_list);
> -		bp->b_flags &= ~LIBXFS_B_DIRTY;
> -		libxfs_buf_relse(bp);
> -	}
> -}
> -
>  /*
>   * Format the log. The caller provides either a buftarg which is used to access
>   * the log via buffers or a direct pointer to a buffer that encapsulates the
> diff --git a/libxfs/util.c b/libxfs/util.c
> index 5b389d65..dba83e76 100644
> --- a/libxfs/util.c
> +++ b/libxfs/util.c
> @@ -228,9 +228,9 @@ libxfs_ialloc(
>  	xfs_buf_t	**ialloc_context,
>  	xfs_inode_t	**ipp)
>  {
> +	struct xfs_mount *mp = tp->t_mountp;
>  	xfs_ino_t	ino;
>  	xfs_inode_t	*ip;
> -	struct inode	*inode;
>  	uint		flags;
>  	int		error;
>  
> @@ -254,18 +254,18 @@ libxfs_ialloc(
>  		return error;
>  	ASSERT(ip != NULL);
>  
> -	inode = VFS_I(ip);
> -	inode->i_mode = mode;
> -	set_nlink(inode, nlink);
> -	i_uid_write(inode, cr->cr_uid);
> -	i_gid_write(inode, cr->cr_gid);
> +	VFS_I(ip)->i_mode = mode;
> +	set_nlink(VFS_I(ip), nlink);
> +	VFS_I(ip)->i_uid = cr->cr_uid;
>  	ip->i_d.di_projid = pip ? 0 : fsx->fsx_projid;
>  	xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG | XFS_ICHGTIME_MOD);
>  
>  	if (pip && (VFS_I(pip)->i_mode & S_ISGID)) {
> -		inode->i_gid = VFS_I(pip)->i_gid;
> +		VFS_I(ip)->i_gid = VFS_I(pip)->i_gid;
>  		if ((VFS_I(pip)->i_mode & S_ISGID) && (mode & S_IFMT) == S_IFDIR)
>  			VFS_I(ip)->i_mode |= S_ISGID;
> +	} else {
> +		VFS_I(ip)->i_gid = cr->cr_gid;
>  	}
>  
>  	ip->i_d.di_size = 0;
> @@ -276,7 +276,7 @@ libxfs_ialloc(
>  	ip->i_d.di_dmstate = 0;
>  	ip->i_d.di_flags = pip ? 0 : xfs_flags2diflags(ip, fsx->fsx_xflags);
>  
> -	if (xfs_sb_version_has_v3inode(&ip->i_mount->m_sb)) {
> +	if (xfs_sb_version_has_v3inode(&mp->m_sb)) {
>  		ASSERT(ip->i_d.di_ino == ino);
>  		ASSERT(uuid_equal(&ip->i_d.di_uuid, &mp->m_sb.sb_meta_uuid));
>  		VFS_I(ip)->i_version = 1;
> @@ -369,7 +369,6 @@ libxfs_iflush_int(xfs_inode_t *ip, xfs_buf_t *bp)
>  
>  	ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE ||
>  		ip->i_d.di_nextents > ip->i_df.if_ext_max);
> -	ASSERT(ip->i_d.di_version > 1);
>  
>  	iip = ip->i_itemp;
>  	mp = ip->i_mount;
> @@ -631,11 +630,10 @@ xfs_inode_verifier_error(
>   */
>  void
>  xfs_buf_corruption_error(
> -	struct xfs_buf		*bp,
> -	xfs_failaddr_t		fa)
> +	struct xfs_buf		*bp)
>  {
>  	xfs_alert(NULL, "Metadata corruption detected at %p, %s block 0x%llx",
> -		  fa, bp->b_ops->name, bp->b_bn);
> +		  __return_address, bp->b_ops->name, bp->b_bn);
>  }
>  
>  /*
> @@ -656,7 +654,7 @@ __xfs_buf_mark_corrupt(
>  {
>  	ASSERT(bp->b_flags & XBF_DONE);
>  
> -	xfs_buf_corruption_error(bp, fa);
> +	xfs_buf_corruption_error(bp);
>  	xfs_buf_stale(bp);
>  }
>  
> diff --git a/libxfs/xfs_attr.c b/libxfs/xfs_attr.c
> index a8fc4aad..469d6804 100644
> --- a/libxfs/xfs_attr.c
> +++ b/libxfs/xfs_attr.c
> @@ -21,9 +21,9 @@
>  #include "xfs_attr.h"
>  #include "xfs_attr_leaf.h"
>  #include "xfs_attr_remote.h"
> +#include "xfs_quota_defs.h"
>  #include "xfs_trans_space.h"
>  #include "xfs_trace.h"
> -#include "xfs_quota_defs.h"
>  
>  /*
>   * xfs_attr.c
> diff --git a/logprint/log_misc.c b/logprint/log_misc.c
> index be889887..4a90b58c 100644
> --- a/logprint/log_misc.c
> +++ b/logprint/log_misc.c
> @@ -563,7 +563,10 @@ xlog_print_trans_inode(
>      mode = dino.di_mode & S_IFMT;
>      size = (int)dino.di_size;
>      xlog_print_trans_inode_core(&dino);
> -    *ptr += xfs_log_dinode_size(log->l_mp);
> +    if (dino.di_version >= 3)
> +	*ptr += sizeof(struct xfs_log_dinode);
> +    else
> +	*ptr += offsetof(struct xfs_log_dinode, di_next_unlinked);
>      skip_count--;
>  
>      switch (f->ilf_fields & (XFS_ILOG_DEV | XFS_ILOG_UUID)) {
> diff --git a/logprint/log_print_all.c b/logprint/log_print_all.c
> index cc759f4f..97c46aef 100644
> --- a/logprint/log_print_all.c
> +++ b/logprint/log_print_all.c
> @@ -285,9 +285,10 @@ xlog_recover_print_inode(
>  	       f->ilf_dsize);
>  
>  	/* core inode comes 2nd */
> -	ASSERT(item->ri_buf[1].i_len ==
> -			offsetof(struct xfs_log_dinode, di_next_unlinked) ||
> -	       item->ri_buf[1].i_len == sizeof(struct xfs_log_dinode));
> +	ASSERT(item->ri_buf[1].i_len == sizeof(struct xfs_log_dinode) ||
> +	       item->ri_buf[1].i_len ==
> +	       offsetof(struct xfs_log_dinode, di_next_unlinked));
> +
>  	xlog_recover_print_inode_core((struct xfs_log_dinode *)
>  				      item->ri_buf[1].i_addr);
>  
> diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
> index 4aa7563f..e76d2a7a 100644
> --- a/mkfs/xfs_mkfs.c
> +++ b/mkfs/xfs_mkfs.c
> @@ -3490,7 +3490,7 @@ rewrite_secondary_superblocks(
>  	struct xfs_mount	*mp)
>  {
>  	struct xfs_buf		*buf;
> -	struct xfs_dsb		*dsb;
> +	struct xfs_dsb		*sb;
>  	int			error;
>  
>  	/* rewrite the last superblock */
> @@ -3503,8 +3503,8 @@ rewrite_secondary_superblocks(
>  				progname, mp->m_sb.sb_agcount - 1);
>  		exit(1);
>  	}
> -	dsb = buf->b_addr;
> -	dsb->sb_rootino = cpu_to_be64(mp->m_sb.sb_rootino);
> +	sb = buf->b_addr;
> +	sb->sb_rootino = cpu_to_be64(mp->m_sb.sb_rootino);
>  	libxfs_buf_mark_dirty(buf);
>  	libxfs_buf_relse(buf);
>  
> @@ -3521,8 +3521,7 @@ rewrite_secondary_superblocks(
>  				progname, (mp->m_sb.sb_agcount - 1) / 2);
>  		exit(1);
>  	}
> -	dsb = buf->b_addr;
> -	dsb->sb_rootino = cpu_to_be64(mp->m_sb.sb_rootino);
> +	sb->sb_rootino = cpu_to_be64(mp->m_sb.sb_rootino);
>  	libxfs_buf_mark_dirty(buf);
>  	libxfs_buf_relse(buf);
>  }
> @@ -3585,7 +3584,6 @@ main(
>  	struct xfs_mount	mbuf = {};
>  	struct xfs_mount	*mp = &mbuf;
>  	struct xfs_sb		*sbp = &mp->m_sb;
> -	struct xfs_dsb		*dsb;
>  	struct fs_topology	ft = {};
>  	struct cli_params	cli = {
>  		.xi = &xi,
> @@ -3871,8 +3869,7 @@ main(
>  	buf = libxfs_getsb(mp);
>  	if (!buf || buf->b_error)
>  		exit(1);
> -	dsb = buf->b_addr;
> -	dsb->sb_inprogress = 0;
> +	((struct xfs_dsb *)buf->b_addr)->sb_inprogress = 0;
>  	libxfs_buf_mark_dirty(buf);
>  	libxfs_buf_relse(buf);
>  
> diff --git a/repair/dinode.c b/repair/dinode.c
> index 1f1cc26b..d06e38c0 100644
> --- a/repair/dinode.c
> +++ b/repair/dinode.c
> @@ -1017,7 +1017,7 @@ process_lclinode(
>  	if (whichfork == XFS_DATA_FORK && be64_to_cpu(dip->di_size) >
>  						XFS_DFORK_DSIZE(dip, mp)) {
>  		do_warn(
> -	_("local inode %" PRIu64 " data fork is too large (size = %lld, max = %zu)\n"),
> +	_("local inode %" PRIu64 " data fork is too large (size = %lld, max = %zd)\n"),
>  		       lino, (unsigned long long) be64_to_cpu(dip->di_size),
>  			XFS_DFORK_DSIZE(dip, mp));
>  		return(1);
> @@ -1025,7 +1025,7 @@ process_lclinode(
>  		asf = (xfs_attr_shortform_t *)XFS_DFORK_APTR(dip);
>  		if (be16_to_cpu(asf->hdr.totsize) > XFS_DFORK_ASIZE(dip, mp)) {
>  			do_warn(
> -	_("local inode %" PRIu64 " attr fork too large (size %d, max = %zu)\n"),
> +	_("local inode %" PRIu64 " attr fork too large (size %d, max = %zd)\n"),
>  				lino, be16_to_cpu(asf->hdr.totsize),
>  				XFS_DFORK_ASIZE(dip, mp));
>  			return(1);
> @@ -1799,8 +1799,9 @@ _("bad attr fork offset %d in dev inode %" PRIu64 ", should be %d\n"),
>  	case XFS_DINODE_FMT_BTREE:
>  		if (dino->di_forkoff >= (XFS_LITINO(mp) >> 3)) {
>  			do_warn(
> -_("bad attr fork offset %d in inode %" PRIu64 ", max=%zu\n"),
> -				dino->di_forkoff, lino, XFS_LITINO(mp) >> 3);
> +_("bad attr fork offset %d in inode %" PRIu64 ", max=%zd\n"),
> +				dino->di_forkoff, lino,
> +				XFS_LITINO(mp) >> 3);
>  			return 1;
>  		}
>  		break;
> diff --git a/repair/phase5.c b/repair/phase5.c
> index 13acc66b..677297fe 100644
> --- a/repair/phase5.c
> +++ b/repair/phase5.c
> @@ -2149,12 +2149,14 @@ build_agf_agfl(
>  
>  	/* setting to 0xff results in initialisation to NULLAGBLOCK */
>  	memset(agfl, 0xff, mp->m_sb.sb_sectsize);
> +	freelist = xfs_buf_to_agfl_bno(agfl_buf);
>  	if (xfs_sb_version_hascrc(&mp->m_sb)) {
>  		agfl->agfl_magicnum = cpu_to_be32(XFS_AGFL_MAGIC);
>  		agfl->agfl_seqno = cpu_to_be32(agno);
>  		platform_uuid_copy(&agfl->agfl_uuid, &mp->m_sb.sb_meta_uuid);
> +		for (i = 0; i < libxfs_agfl_size(mp); i++)
> +			freelist[i] = cpu_to_be32(NULLAGBLOCK);
>  	}
> -	freelist = xfs_buf_to_agfl_bno(agfl_buf);
>  
>  	/*
>  	 * do we have left-over blocks in the btree cursors that should



[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux