diff mbox

[U-Boot] getting ubifs to run

Message ID 1470909369-8282-1-git-send-email-marco.hoefle@nanotronic.ch
State Deferred
Delegated to: Michal Simek
Headers show

Commit Message

Hoefle Marco Aug. 11, 2016, 9:56 a.m. UTC
Signed-off-by: Marco <marco.hoefle@nanotronic.ch>
---
 arch/microblaze/include/asm/atomic.h | 114 +++++++++++++++++++++++++++++++++++
 arch/microblaze/include/asm/bitops.h |   8 +--
 fs/ubifs/io.c                        |   2 +-
 fs/ubifs/log.c                       |  99 ++++++++++++++++++++++++++++++
 fs/ubifs/lpt_commit.c                |  21 +++++++
 5 files changed, 239 insertions(+), 5 deletions(-)
 create mode 100644 arch/microblaze/include/asm/atomic.h

Comments

Heiko Schocher Aug. 12, 2016, 5:05 a.m. UTC | #1
Hello Marco,

Am 11.08.2016 um 11:56 schrieb Marco:
> Signed-off-by: Marco <marco.hoefle@nanotronic.ch>
> ---
>   arch/microblaze/include/asm/atomic.h | 114 +++++++++++++++++++++++++++++++++++
>   arch/microblaze/include/asm/bitops.h |   8 +--
>   fs/ubifs/io.c                        |   2 +-
>   fs/ubifs/log.c                       |  99 ++++++++++++++++++++++++++++++
>   fs/ubifs/lpt_commit.c                |  21 +++++++
>   5 files changed, 239 insertions(+), 5 deletions(-)
>   create mode 100644 arch/microblaze/include/asm/atomic.h

Hmm... what exactly do you fix? Can you add a commit message please?

It seems to me, you get ubifs working on microblaze arch?

And may you can split this patch into at least two pieces, one for the
arch fixes, and one for the ubifs fixes?

ubifs read support works for me on some arm based plattforms ...
what exactly do you fix with your fs/ubifs/* changes?

Thanks!

bye,
Heiko
> diff --git a/arch/microblaze/include/asm/atomic.h b/arch/microblaze/include/asm/atomic.h
> new file mode 100644
> index 0000000..2872149
> --- /dev/null
> +++ b/arch/microblaze/include/asm/atomic.h
> @@ -0,0 +1,114 @@
> +/*
> + *  linux/include/asm-arm/atomic.h
> + *
> + *  Copyright (c) 1996 Russell King.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + *
> + *  Changelog:
> + *   27-06-1996	RMK	Created
> + *   13-04-1997	RMK	Made functions atomic!
> + *   07-12-1997	RMK	Upgraded for v2.1.
> + *   26-08-1998	PJB	Added #ifdef __KERNEL__
> + */
> +#ifndef __ASM_ARM_ATOMIC_H
> +#define __ASM_ARM_ATOMIC_H
> +
> +#ifdef CONFIG_SMP
> +#error SMP not supported
> +#endif
> +
> +typedef struct { volatile int counter; } atomic_t;
> +
> +#define ATOMIC_INIT(i)	{ (i) }
> +
> +#ifdef __KERNEL__
> +#include <asm/system.h>
> +
> +#define atomic_read(v)	((v)->counter)
> +#define atomic_set(v,i)	(((v)->counter) = (i))
> +
> +
> +
> +
> +static inline void atomic_add(int i, volatile atomic_t *v)
> +{
> +	unsigned long flags = 0;
> +
> +	local_irq_save(flags);
> +	v->counter += i;
> +	local_irq_restore(flags);
> +}
> +
> +static inline void atomic_sub(int i, volatile atomic_t *v)
> +{
> +	unsigned long flags = 0;
> +
> +	local_irq_save(flags);
> +	v->counter -= i;
> +	local_irq_restore(flags);
> +}
> +
> +static inline void atomic_inc(volatile atomic_t *v)
> +{
> +	unsigned long flags = 0;
> +
> +	local_irq_save(flags);
> +	v->counter += 1;
> +	local_irq_restore(flags);
> +}
> +
> +static inline void atomic_dec(volatile atomic_t *v)
> +{
> +	unsigned long flags = 0;
> +
> +	local_irq_save(flags);
> +	v->counter -= 1;
> +	local_irq_restore(flags);
> +}
> +
> +static inline int atomic_dec_and_test(volatile atomic_t *v)
> +{
> +	unsigned long flags = 0;
> +	int val;
> +
> +	local_irq_save(flags);
> +	val = v->counter;
> +	v->counter = val -= 1;
> +	local_irq_restore(flags);
> +
> +	return val == 0;
> +}
> +
> +static inline int atomic_add_negative(int i, volatile atomic_t *v)
> +{
> +	unsigned long flags = 0;
> +	int val;
> +
> +	local_irq_save(flags);
> +	val = v->counter;
> +	v->counter = val += i;
> +	local_irq_restore(flags);
> +
> +	return val < 0;
> +}
> +
> +static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
> +{
> +	unsigned long flags = 0;
> +
> +	local_irq_save(flags);
> +	*addr &= ~mask;
> +	local_irq_restore(flags);
> +}
> +
> +/* Atomic operations are already serializing on ARM */
> +#define smp_mb__before_atomic_dec()	barrier()
> +#define smp_mb__after_atomic_dec()	barrier()
> +#define smp_mb__before_atomic_inc()	barrier()
> +#define smp_mb__after_atomic_inc()	barrier()
> +
> +#endif
> +#endif
> diff --git a/arch/microblaze/include/asm/bitops.h b/arch/microblaze/include/asm/bitops.h
> index 2cab2ac..b3b17b9 100644
> --- a/arch/microblaze/include/asm/bitops.h
> +++ b/arch/microblaze/include/asm/bitops.h
> @@ -204,10 +204,10 @@ static inline int __test_bit(int nr, volatile void *addr)
>   	return ((mask & *a) != 0);
>   }
>
> -#define test_bit(nr,addr) \
> -(__builtin_constant_p(nr) ? \
> - __constant_test_bit((nr),(addr)) : \
> - __test_bit((nr),(addr)))
> +static inline int test_bit(int nr, const void * addr)
> +{
> +	return ((unsigned char *) addr)[nr >> 3] & (1U << (nr & 7));
> +}
>
>   #define find_first_zero_bit(addr, size) \
>   	find_next_zero_bit((addr), (size), 0)
> diff --git a/fs/ubifs/io.c b/fs/ubifs/io.c
> index 51a95bb..685713e 100644
> --- a/fs/ubifs/io.c
> +++ b/fs/ubifs/io.c
> @@ -847,6 +847,7 @@ out:
>   	ubifs_dump_leb(c, wbuf->lnum);
>   	return err;
>   }
> +#endif
>
>   /**
>    * ubifs_write_node - write node to the media.
> @@ -885,7 +886,6 @@ int ubifs_write_node(struct ubifs_info *c, void *buf, int len, int lnum,
>
>   	return err;
>   }
> -#endif
>
>   /**
>    * ubifs_read_node_wbuf - read node from the media or write-buffer.
> diff --git a/fs/ubifs/log.c b/fs/ubifs/log.c
> index a07fdef..10302b9 100644
> --- a/fs/ubifs/log.c
> +++ b/fs/ubifs/log.c
> @@ -743,3 +743,102 @@ static int dbg_check_bud_bytes(struct ubifs_info *c)
>
>   	return err;
>   }
> +
> +
> +/**
> + * ubifs_commit_required - set commit state to "required".
> + * @c: UBIFS file-system description object
> + *
> + * This function is called if a commit is required but cannot be done from the
> + * calling function, so it is just flagged instead.
> + */
> +void ubifs_commit_required(struct ubifs_info *c)
> +{
> +	spin_lock(&c->cs_lock);
> +	switch (c->cmt_state) {
> +	case COMMIT_RESTING:
> +	case COMMIT_BACKGROUND:
> +		dbg_cmt("old: %s, new: %s", dbg_cstate(c->cmt_state),
> +			dbg_cstate(COMMIT_REQUIRED));
> +		c->cmt_state = COMMIT_REQUIRED;
> +		break;
> +	case COMMIT_RUNNING_BACKGROUND:
> +		dbg_cmt("old: %s, new: %s", dbg_cstate(c->cmt_state),
> +			dbg_cstate(COMMIT_RUNNING_REQUIRED));
> +		c->cmt_state = COMMIT_RUNNING_REQUIRED;
> +		break;
> +	case COMMIT_REQUIRED:
> +	case COMMIT_RUNNING_REQUIRED:
> +	case COMMIT_BROKEN:
> +		break;
> +	}
> +	spin_unlock(&c->cs_lock);
> +}
> +
> +/**
> + * ubifs_write_master - write master node.
> + * @c: UBIFS file-system description object
> + *
> + * This function writes the master node. Returns zero in case of success and a
> + * negative error code in case of failure. The master node is written twice to
> + * enable recovery.
> + */
> +int ubifs_write_master(struct ubifs_info *c)
> +{
> +	int err, lnum, offs, len;
> +
> +	ubifs_assert(!c->ro_media && !c->ro_mount);
> +	if (c->ro_error)
> +		return -EROFS;
> +
> +	lnum = UBIFS_MST_LNUM;
> +	offs = c->mst_offs + c->mst_node_alsz;
> +	len = UBIFS_MST_NODE_SZ;
> +
> +	if (offs + UBIFS_MST_NODE_SZ > c->leb_size) {
> +		err = ubifs_leb_unmap(c, lnum);
> +		if (err)
> +			return err;
> +		offs = 0;
> +	}
> +
> +	c->mst_offs = offs;
> +	c->mst_node->highest_inum = cpu_to_le64(c->highest_inum);
> +
> +	err = ubifs_write_node(c, c->mst_node, len, lnum, offs);
> +	if (err)
> +		return err;
> +
> +	lnum += 1;
> +
> +	if (offs == 0) {
> +		err = ubifs_leb_unmap(c, lnum);
> +		if (err)
> +			return err;
> +	}
> +	err = ubifs_write_node(c, c->mst_node, len, lnum, offs);
> +
> +	return err;
> +}
> +
> +/**
> + * ubifs_request_bg_commit - notify the background thread to do a commit.
> + * @c: UBIFS file-system description object
> + *
> + * This function is called if the journal is full enough to make a commit
> + * worthwhile, so background thread is kicked to start it.
> + */
> +void ubifs_request_bg_commit(struct ubifs_info *c)
> +{
> +	spin_lock(&c->cs_lock);
> +	if (c->cmt_state == COMMIT_RESTING) {
> +		dbg_cmt("old: %s, new: %s", dbg_cstate(c->cmt_state),
> +			dbg_cstate(COMMIT_BACKGROUND));
> +		c->cmt_state = COMMIT_BACKGROUND;
> +		spin_unlock(&c->cs_lock);
> +		ubifs_wake_up_bgt(c);
> +	} else
> +		spin_unlock(&c->cs_lock);
> +}
> +
> +
> diff --git a/fs/ubifs/lpt_commit.c b/fs/ubifs/lpt_commit.c
> index 2df9130..61b2cc8 100644
> --- a/fs/ubifs/lpt_commit.c
> +++ b/fs/ubifs/lpt_commit.c
> @@ -2039,4 +2039,25 @@ static int dbg_populate_lsave(struct ubifs_info *c)
>
>   	return 1;
>   }
> +#else
> +
> +int dbg_chk_lpt_free_spc(struct ubifs_info *c)
> +{
> +	return 0;
> +}
> +
> +int dbg_check_ltab(struct ubifs_info *c)
> +{
> +	return 0;
> +}
> +
> +int dbg_chk_lpt_sz(struct ubifs_info *c, int action, int len)
> +{
> +	return 0;
> +}
> +
> +void ubifs_dump_lpt_lebs(const struct ubifs_info *c)
> +{
> +}
> +
>   #endif
>
Hoefle Marco Aug. 12, 2016, 7:24 a.m. UTC | #2
Hello Heiko,
You are right, there are two parts: the Microblaze part and the ubifs stuff.
To get u-boot compiled I added the following to the Microblaze architecture:
atomic.h based on the ARM architecture, was missing before.
Modified bitops.h to get rid of compiler warnings
The three ubifs files had #defines which didn't work for me.
With the changes of the patch I sent I can successfully load the Kernel from a ubifs partition on a Microblaze.


That were the problems:

CC      fs/ubifs/ubifs.o
In file included from /home/hoefle/projects/u-boot_patch/fs/ubifs/ubifs.c:17:0:
/home/hoefle/projects/u-boot_patch/fs/ubifs/ubifs.h:35:24: fatal error: asm/atomic.h: No such file or directory
 #include <asm/atomic.h>
                        ^
compilation terminated.


/home/hoefle/projects/u-boot_patch/arch/microblaze/include/asm/bitops.h:197:19: note: expected 'volatile void *' but argument is of type 'const long unsigned int *'
 static inline int __test_bit(int nr, volatile void *addr)
                   ^
/home/hoefle/projects/u-boot_patch/fs/ubifs/misc.h: In function 'ubifs_zn_obsolete':
/home/hoefle/projects/u-boot_patch/arch/microblaze/include/asm/bitops.h:210:18: warning: passing argument 2 of '__test_bit' discards 'const' qualifier from pointer target type
  __test_bit((nr),(addr)))
                  ^
/home/hoefle/projects/u-boot_patch/fs/ubifs/misc.h:38:11: note: in expansion of macro 'test_bit'
  return !!test_bit(OBSOLETE_ZNODE, &znode->flags);
           ^
/home/hoefle/projects/u-boot_patch/arch/microblaze/include/asm/bitops.h:197:19: note: expected 'volatile void *' but argument is of type 'const long unsigned int *'
 static inline int __test_bit(int nr, volatile void *addr)
                   ^
/home/hoefle/projects/u-boot_patch/fs/ubifs/misc.h: In function 'ubifs_zn_cow':
/home/hoefle/projects/u-boot_patch/arch/microblaze/include/asm/bitops.h:210:18: warning: passing argument 2 of '__test_bit' discards 'const' qualifier from pointer target type
  __test_bit((nr),(addr)))
                  ^
/home/hoefle/projects/u-boot_patch/fs/ubifs/misc.h:50:11: note: in expansion of macro 'test_bit'
  return !!test_bit(COW_ZNODE, &znode->flags);
           ^
/home/hoefle/projects/u-boot_patch/arch/microblaze/include/asm/bitops.h:197:19: note: expected 'volatile void *' but argument is of type 'const long unsigned int *'
 static inline int __test_bit(int nr, volatile void *addr)
                   ^



fs/built-in.o: In function `ubifs_lpt_start_commit':
/home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:1232: undefined reference to `dbg_chk_lpt_free_spc'
/home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:1235: undefined reference to `dbg_check_ltab'
fs/built-in.o: In function `layout_cnodes':
/home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:195: undefined reference to `dbg_chk_lpt_sz'
/home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:211: undefined reference to `dbg_chk_lpt_sz'
/home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:219: undefined reference to `dbg_chk_lpt_sz'
/home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:233: undefined reference to `dbg_chk_lpt_sz'
/home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:246: undefined reference to `dbg_chk_lpt_sz'
fs/built-in.o:/home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:254: more undefined references to `dbg_chk_lpt_sz' follow
fs/built-in.o: In function `layout_cnodes':
/home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:322: undefined reference to `ubifs_dump_lpt_lebs'
fs/built-in.o: In function `ubifs_add_bud_to_log':
/home/hoefle/projects/u-boot_patch/fs/ubifs/log.c:194: undefined reference to `ubifs_commit_required'
/home/hoefle/projects/u-boot_patch/fs/ubifs/log.c:225: undefined reference to `ubifs_request_bg_commit'
/home/hoefle/projects/u-boot_patch/fs/ubifs/log.c:265: undefined reference to `ubifs_write_node'
fs/built-in.o: In function `ubifs_log_end_commit':
/home/hoefle/projects/u-boot_patch/fs/ubifs/log.c:479: undefined reference to `ubifs_write_master'
fs/built-in.o: In function `write_orph_node':
/home/hoefle/projects/u-boot_patch/fs/ubifs/orphan.c:248: undefined reference to `ubifs_write_node'


Regards,
Marco



> -----Original Message-----
> From: Heiko Schocher [mailto:hs@denx.de]
> Sent: Freitag, 12. August 2016 07:05
> To: Hoefle Marco <Marco.Hoefle@nanotronic.ch>
> Cc: monstr@monstr.eu; u-boot@lists.denx.de
> Subject: Re: [U-Boot] [PATCH] getting ubifs to run
> 
> Hello Marco,
> 
> Am 11.08.2016 um 11:56 schrieb Marco:
> > Signed-off-by: Marco <marco.hoefle@nanotronic.ch>
> > ---
> >   arch/microblaze/include/asm/atomic.h | 114
> +++++++++++++++++++++++++++++++++++
> >   arch/microblaze/include/asm/bitops.h |   8 +--
> >   fs/ubifs/io.c                        |   2 +-
> >   fs/ubifs/log.c                       |  99 ++++++++++++++++++++++++++++++
> >   fs/ubifs/lpt_commit.c                |  21 +++++++
> >   5 files changed, 239 insertions(+), 5 deletions(-)
> >   create mode 100644 arch/microblaze/include/asm/atomic.h
> 
> Hmm... what exactly do you fix? Can you add a commit message please?
> 
> It seems to me, you get ubifs working on microblaze arch?
> 
> And may you can split this patch into at least two pieces, one for the arch
> fixes, and one for the ubifs fixes?
> 
> ubifs read support works for me on some arm based plattforms ...
> what exactly do you fix with your fs/ubifs/* changes?
> 
> Thanks!
> 
> bye,
> Heiko
> > diff --git a/arch/microblaze/include/asm/atomic.h
> > b/arch/microblaze/include/asm/atomic.h
> > new file mode 100644
> > index 0000000..2872149
> > --- /dev/null
> > +++ b/arch/microblaze/include/asm/atomic.h
> > @@ -0,0 +1,114 @@
> > +/*
> > + *  linux/include/asm-arm/atomic.h
> > + *
> > + *  Copyright (c) 1996 Russell King.
> > + *
> > + * This program is free software; you can redistribute it and/or
> > +modify
> > + * it under the terms of the GNU General Public License version 2 as
> > + * published by the Free Software Foundation.
> > + *
> > + *  Changelog:
> > + *   27-06-1996	RMK	Created
> > + *   13-04-1997	RMK	Made functions atomic!
> > + *   07-12-1997	RMK	Upgraded for v2.1.
> > + *   26-08-1998	PJB	Added #ifdef __KERNEL__
> > + */
> > +#ifndef __ASM_ARM_ATOMIC_H
> > +#define __ASM_ARM_ATOMIC_H
> > +
> > +#ifdef CONFIG_SMP
> > +#error SMP not supported
> > +#endif
> > +
> > +typedef struct { volatile int counter; } atomic_t;
> > +
> > +#define ATOMIC_INIT(i)	{ (i) }
> > +
> > +#ifdef __KERNEL__
> > +#include <asm/system.h>
> > +
> > +#define atomic_read(v)	((v)->counter)
> > +#define atomic_set(v,i)	(((v)->counter) = (i))
> > +
> > +
> > +
> > +
> > +static inline void atomic_add(int i, volatile atomic_t *v) {
> > +	unsigned long flags = 0;
> > +
> > +	local_irq_save(flags);
> > +	v->counter += i;
> > +	local_irq_restore(flags);
> > +}
> > +
> > +static inline void atomic_sub(int i, volatile atomic_t *v) {
> > +	unsigned long flags = 0;
> > +
> > +	local_irq_save(flags);
> > +	v->counter -= i;
> > +	local_irq_restore(flags);
> > +}
> > +
> > +static inline void atomic_inc(volatile atomic_t *v) {
> > +	unsigned long flags = 0;
> > +
> > +	local_irq_save(flags);
> > +	v->counter += 1;
> > +	local_irq_restore(flags);
> > +}
> > +
> > +static inline void atomic_dec(volatile atomic_t *v) {
> > +	unsigned long flags = 0;
> > +
> > +	local_irq_save(flags);
> > +	v->counter -= 1;
> > +	local_irq_restore(flags);
> > +}
> > +
> > +static inline int atomic_dec_and_test(volatile atomic_t *v) {
> > +	unsigned long flags = 0;
> > +	int val;
> > +
> > +	local_irq_save(flags);
> > +	val = v->counter;
> > +	v->counter = val -= 1;
> > +	local_irq_restore(flags);
> > +
> > +	return val == 0;
> > +}
> > +
> > +static inline int atomic_add_negative(int i, volatile atomic_t *v) {
> > +	unsigned long flags = 0;
> > +	int val;
> > +
> > +	local_irq_save(flags);
> > +	val = v->counter;
> > +	v->counter = val += i;
> > +	local_irq_restore(flags);
> > +
> > +	return val < 0;
> > +}
> > +
> > +static inline void atomic_clear_mask(unsigned long mask, unsigned
> > +long *addr) {
> > +	unsigned long flags = 0;
> > +
> > +	local_irq_save(flags);
> > +	*addr &= ~mask;
> > +	local_irq_restore(flags);
> > +}
> > +
> > +/* Atomic operations are already serializing on ARM */
> > +#define smp_mb__before_atomic_dec()	barrier()
> > +#define smp_mb__after_atomic_dec()	barrier()
> > +#define smp_mb__before_atomic_inc()	barrier()
> > +#define smp_mb__after_atomic_inc()	barrier()
> > +
> > +#endif
> > +#endif
> > diff --git a/arch/microblaze/include/asm/bitops.h
> > b/arch/microblaze/include/asm/bitops.h
> > index 2cab2ac..b3b17b9 100644
> > --- a/arch/microblaze/include/asm/bitops.h
> > +++ b/arch/microblaze/include/asm/bitops.h
> > @@ -204,10 +204,10 @@ static inline int __test_bit(int nr, volatile void
> *addr)
> >   	return ((mask & *a) != 0);
> >   }
> >
> > -#define test_bit(nr,addr) \
> > -(__builtin_constant_p(nr) ? \
> > - __constant_test_bit((nr),(addr)) : \
> > - __test_bit((nr),(addr)))
> > +static inline int test_bit(int nr, const void * addr) {
> > +	return ((unsigned char *) addr)[nr >> 3] & (1U << (nr & 7)); }
> >
> >   #define find_first_zero_bit(addr, size) \
> >   	find_next_zero_bit((addr), (size), 0) diff --git a/fs/ubifs/io.c
> > b/fs/ubifs/io.c index 51a95bb..685713e 100644
> > --- a/fs/ubifs/io.c
> > +++ b/fs/ubifs/io.c
> > @@ -847,6 +847,7 @@ out:
> >   	ubifs_dump_leb(c, wbuf->lnum);
> >   	return err;
> >   }
> > +#endif
> >
> >   /**
> >    * ubifs_write_node - write node to the media.
> > @@ -885,7 +886,6 @@ int ubifs_write_node(struct ubifs_info *c, void
> > *buf, int len, int lnum,
> >
> >   	return err;
> >   }
> > -#endif
> >
> >   /**
> >    * ubifs_read_node_wbuf - read node from the media or write-buffer.
> > diff --git a/fs/ubifs/log.c b/fs/ubifs/log.c index a07fdef..10302b9
> > 100644
> > --- a/fs/ubifs/log.c
> > +++ b/fs/ubifs/log.c
> > @@ -743,3 +743,102 @@ static int dbg_check_bud_bytes(struct ubifs_info
> > *c)
> >
> >   	return err;
> >   }
> > +
> > +
> > +/**
> > + * ubifs_commit_required - set commit state to "required".
> > + * @c: UBIFS file-system description object
> > + *
> > + * This function is called if a commit is required but cannot be done
> > +from the
> > + * calling function, so it is just flagged instead.
> > + */
> > +void ubifs_commit_required(struct ubifs_info *c) {
> > +	spin_lock(&c->cs_lock);
> > +	switch (c->cmt_state) {
> > +	case COMMIT_RESTING:
> > +	case COMMIT_BACKGROUND:
> > +		dbg_cmt("old: %s, new: %s", dbg_cstate(c->cmt_state),
> > +			dbg_cstate(COMMIT_REQUIRED));
> > +		c->cmt_state = COMMIT_REQUIRED;
> > +		break;
> > +	case COMMIT_RUNNING_BACKGROUND:
> > +		dbg_cmt("old: %s, new: %s", dbg_cstate(c->cmt_state),
> > +			dbg_cstate(COMMIT_RUNNING_REQUIRED));
> > +		c->cmt_state = COMMIT_RUNNING_REQUIRED;
> > +		break;
> > +	case COMMIT_REQUIRED:
> > +	case COMMIT_RUNNING_REQUIRED:
> > +	case COMMIT_BROKEN:
> > +		break;
> > +	}
> > +	spin_unlock(&c->cs_lock);
> > +}
> > +
> > +/**
> > + * ubifs_write_master - write master node.
> > + * @c: UBIFS file-system description object
> > + *
> > + * This function writes the master node. Returns zero in case of
> > +success and a
> > + * negative error code in case of failure. The master node is written
> > +twice to
> > + * enable recovery.
> > + */
> > +int ubifs_write_master(struct ubifs_info *c) {
> > +	int err, lnum, offs, len;
> > +
> > +	ubifs_assert(!c->ro_media && !c->ro_mount);
> > +	if (c->ro_error)
> > +		return -EROFS;
> > +
> > +	lnum = UBIFS_MST_LNUM;
> > +	offs = c->mst_offs + c->mst_node_alsz;
> > +	len = UBIFS_MST_NODE_SZ;
> > +
> > +	if (offs + UBIFS_MST_NODE_SZ > c->leb_size) {
> > +		err = ubifs_leb_unmap(c, lnum);
> > +		if (err)
> > +			return err;
> > +		offs = 0;
> > +	}
> > +
> > +	c->mst_offs = offs;
> > +	c->mst_node->highest_inum = cpu_to_le64(c->highest_inum);
> > +
> > +	err = ubifs_write_node(c, c->mst_node, len, lnum, offs);
> > +	if (err)
> > +		return err;
> > +
> > +	lnum += 1;
> > +
> > +	if (offs == 0) {
> > +		err = ubifs_leb_unmap(c, lnum);
> > +		if (err)
> > +			return err;
> > +	}
> > +	err = ubifs_write_node(c, c->mst_node, len, lnum, offs);
> > +
> > +	return err;
> > +}
> > +
> > +/**
> > + * ubifs_request_bg_commit - notify the background thread to do a
> commit.
> > + * @c: UBIFS file-system description object
> > + *
> > + * This function is called if the journal is full enough to make a
> > +commit
> > + * worthwhile, so background thread is kicked to start it.
> > + */
> > +void ubifs_request_bg_commit(struct ubifs_info *c) {
> > +	spin_lock(&c->cs_lock);
> > +	if (c->cmt_state == COMMIT_RESTING) {
> > +		dbg_cmt("old: %s, new: %s", dbg_cstate(c->cmt_state),
> > +			dbg_cstate(COMMIT_BACKGROUND));
> > +		c->cmt_state = COMMIT_BACKGROUND;
> > +		spin_unlock(&c->cs_lock);
> > +		ubifs_wake_up_bgt(c);
> > +	} else
> > +		spin_unlock(&c->cs_lock);
> > +}
> > +
> > +
> > diff --git a/fs/ubifs/lpt_commit.c b/fs/ubifs/lpt_commit.c index
> > 2df9130..61b2cc8 100644
> > --- a/fs/ubifs/lpt_commit.c
> > +++ b/fs/ubifs/lpt_commit.c
> > @@ -2039,4 +2039,25 @@ static int dbg_populate_lsave(struct ubifs_info
> > *c)
> >
> >   	return 1;
> >   }
> > +#else
> > +
> > +int dbg_chk_lpt_free_spc(struct ubifs_info *c) {
> > +	return 0;
> > +}
> > +
> > +int dbg_check_ltab(struct ubifs_info *c) {
> > +	return 0;
> > +}
> > +
> > +int dbg_chk_lpt_sz(struct ubifs_info *c, int action, int len) {
> > +	return 0;
> > +}
> > +
> > +void ubifs_dump_lpt_lebs(const struct ubifs_info *c) { }
> > +
> >   #endif
> >
> 
> --
> DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
>
Hoefle Marco Aug. 15, 2016, 11:55 a.m. UTC | #3
Hello Heiko,
You are right, there are two parts: the Microblaze part and the ubifs stuff.
To get u-boot compiled I added the following to the Microblaze architecture:
atomic.h based on the ARM architecture, was missing before.
Modified bitops.h to get rid of compiler warnings
The three ubifs files had #defines which didn’t work for me.
With the changes of the patch I sent I can successfully load the Kernel from a ubifs partition on a Microblaze.


That were the problems:

CC      fs/ubifs/ubifs.o
In file included from /home/hoefle/projects/u-boot_patch/fs/ubifs/ubifs.c:17:0:
/home/hoefle/projects/u-boot_patch/fs/ubifs/ubifs.h:35:24: fatal error: asm/atomic.h: No such file or directory
 #include <asm/atomic.h>
                        ^
compilation terminated.


/home/hoefle/projects/u-boot_patch/arch/microblaze/include/asm/bitops.h:197:19: note: expected 'volatile void *' but argument is of type 'const long unsigned int *'
 static inline int __test_bit(int nr, volatile void *addr)
                   ^
/home/hoefle/projects/u-boot_patch/fs/ubifs/misc.h: In function 'ubifs_zn_obsolete':
/home/hoefle/projects/u-boot_patch/arch/microblaze/include/asm/bitops.h:210:18: warning: passing argument 2 of '__test_bit' discards 'const' qualifier from pointer target type
  __test_bit((nr),(addr)))
                  ^
/home/hoefle/projects/u-boot_patch/fs/ubifs/misc.h:38:11: note: in expansion of macro 'test_bit'
  return !!test_bit(OBSOLETE_ZNODE, &znode->flags);
           ^
/home/hoefle/projects/u-boot_patch/arch/microblaze/include/asm/bitops.h:197:19: note: expected 'volatile void *' but argument is of type 'const long unsigned int *'
 static inline int __test_bit(int nr, volatile void *addr)
                   ^
/home/hoefle/projects/u-boot_patch/fs/ubifs/misc.h: In function 'ubifs_zn_cow':
/home/hoefle/projects/u-boot_patch/arch/microblaze/include/asm/bitops.h:210:18: warning: passing argument 2 of '__test_bit' discards 'const' qualifier from pointer target type
  __test_bit((nr),(addr)))
                  ^
/home/hoefle/projects/u-boot_patch/fs/ubifs/misc.h:50:11: note: in expansion of macro 'test_bit'
  return !!test_bit(COW_ZNODE, &znode->flags);
           ^
/home/hoefle/projects/u-boot_patch/arch/microblaze/include/asm/bitops.h:197:19: note: expected 'volatile void *' but argument is of type 'const long unsigned int *'
 static inline int __test_bit(int nr, volatile void *addr)
                   ^



fs/built-in.o: In function `ubifs_lpt_start_commit':
/home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:1232: undefined reference to `dbg_chk_lpt_free_spc'
/home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:1235: undefined reference to `dbg_check_ltab'
fs/built-in.o: In function `layout_cnodes':
/home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:195: undefined reference to `dbg_chk_lpt_sz'
/home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:211: undefined reference to `dbg_chk_lpt_sz'
/home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:219: undefined reference to `dbg_chk_lpt_sz'
/home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:233: undefined reference to `dbg_chk_lpt_sz'
/home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:246: undefined reference to `dbg_chk_lpt_sz'
fs/built-in.o:/home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:254: more undefined references to `dbg_chk_lpt_sz' follow
fs/built-in.o: In function `layout_cnodes':
/home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:322: undefined reference to `ubifs_dump_lpt_lebs'
fs/built-in.o: In function `ubifs_add_bud_to_log':
/home/hoefle/projects/u-boot_patch/fs/ubifs/log.c:194: undefined reference to `ubifs_commit_required'
/home/hoefle/projects/u-boot_patch/fs/ubifs/log.c:225: undefined reference to `ubifs_request_bg_commit'
/home/hoefle/projects/u-boot_patch/fs/ubifs/log.c:265: undefined reference to `ubifs_write_node'
fs/built-in.o: In function `ubifs_log_end_commit':
/home/hoefle/projects/u-boot_patch/fs/ubifs/log.c:479: undefined reference to `ubifs_write_master'
fs/built-in.o: In function `write_orph_node':
/home/hoefle/projects/u-boot_patch/fs/ubifs/orphan.c:248: undefined reference to `ubifs_write_node'


Regards,
Marco



> -----Original Message-----
> From: Heiko Schocher [mailto:hs@denx.de]
> Sent: Freitag, 12. August 2016 07:05
> To: Hoefle Marco <Marco.Hoefle@nanotronic.ch>
> Cc: monstr@monstr.eu; u-boot@lists.denx.de
> Subject: Re: [U-Boot] [PATCH] getting ubifs to run
>
> Hello Marco,
>
> Am 11.08.2016 um 11:56 schrieb Marco:
> > Signed-off-by: Marco <marco.hoefle@nanotronic.ch>
> > ---
> >   arch/microblaze/include/asm/atomic.h | 114
> +++++++++++++++++++++++++++++++++++
> >   arch/microblaze/include/asm/bitops.h |   8 +--
> >   fs/ubifs/io.c                        |   2 +-
> >   fs/ubifs/log.c                       |  99 ++++++++++++++++++++++++++++++
> >   fs/ubifs/lpt_commit.c                |  21 +++++++
> >   5 files changed, 239 insertions(+), 5 deletions(-)
> >   create mode 100644 arch/microblaze/include/asm/atomic.h
>
> Hmm... what exactly do you fix? Can you add a commit message please?
>
> It seems to me, you get ubifs working on microblaze arch?
>
> And may you can split this patch into at least two pieces, one for the arch
> fixes, and one for the ubifs fixes?
>
> ubifs read support works for me on some arm based plattforms ...
> what exactly do you fix with your fs/ubifs/* changes?
>
> Thanks!
>
> bye,
> Heiko
> > diff --git a/arch/microblaze/include/asm/atomic.h
> > b/arch/microblaze/include/asm/atomic.h
> > new file mode 100644
> > index 0000000..2872149
> > --- /dev/null
> > +++ b/arch/microblaze/include/asm/atomic.h
> > @@ -0,0 +1,114 @@
> > +/*
> > + *  linux/include/asm-arm/atomic.h
> > + *
> > + *  Copyright (c) 1996 Russell King.
> > + *
> > + * This program is free software; you can redistribute it and/or
> > +modify
> > + * it under the terms of the GNU General Public License version 2 as
> > + * published by the Free Software Foundation.
> > + *
> > + *  Changelog:
> > + *   27-06-1996    RMK     Created
> > + *   13-04-1997    RMK     Made functions atomic!
> > + *   07-12-1997    RMK     Upgraded for v2.1.
> > + *   26-08-1998    PJB     Added #ifdef __KERNEL__
> > + */
> > +#ifndef __ASM_ARM_ATOMIC_H
> > +#define __ASM_ARM_ATOMIC_H
> > +
> > +#ifdef CONFIG_SMP
> > +#error SMP not supported
> > +#endif
> > +
> > +typedef struct { volatile int counter; } atomic_t;
> > +
> > +#define ATOMIC_INIT(i)     { (i) }
> > +
> > +#ifdef __KERNEL__
> > +#include <asm/system.h>
> > +
> > +#define atomic_read(v)     ((v)->counter)
> > +#define atomic_set(v,i)    (((v)->counter) = (i))
> > +
> > +
> > +
> > +
> > +static inline void atomic_add(int i, volatile atomic_t *v) {
> > +   unsigned long flags = 0;
> > +
> > +   local_irq_save(flags);
> > +   v->counter += i;
> > +   local_irq_restore(flags);
> > +}
> > +
> > +static inline void atomic_sub(int i, volatile atomic_t *v) {
> > +   unsigned long flags = 0;
> > +
> > +   local_irq_save(flags);
> > +   v->counter -= i;
> > +   local_irq_restore(flags);
> > +}
> > +
> > +static inline void atomic_inc(volatile atomic_t *v) {
> > +   unsigned long flags = 0;
> > +
> > +   local_irq_save(flags);
> > +   v->counter += 1;
> > +   local_irq_restore(flags);
> > +}
> > +
> > +static inline void atomic_dec(volatile atomic_t *v) {
> > +   unsigned long flags = 0;
> > +
> > +   local_irq_save(flags);
> > +   v->counter -= 1;
> > +   local_irq_restore(flags);
> > +}
> > +
> > +static inline int atomic_dec_and_test(volatile atomic_t *v) {
> > +   unsigned long flags = 0;
> > +   int val;
> > +
> > +   local_irq_save(flags);
> > +   val = v->counter;
> > +   v->counter = val -= 1;
> > +   local_irq_restore(flags);
> > +
> > +   return val == 0;
> > +}
> > +
> > +static inline int atomic_add_negative(int i, volatile atomic_t *v) {
> > +   unsigned long flags = 0;
> > +   int val;
> > +
> > +   local_irq_save(flags);
> > +   val = v->counter;
> > +   v->counter = val += i;
> > +   local_irq_restore(flags);
> > +
> > +   return val < 0;
> > +}
> > +
> > +static inline void atomic_clear_mask(unsigned long mask, unsigned
> > +long *addr) {
> > +   unsigned long flags = 0;
> > +
> > +   local_irq_save(flags);
> > +   *addr &= ~mask;
> > +   local_irq_restore(flags);
> > +}
> > +
> > +/* Atomic operations are already serializing on ARM */
> > +#define smp_mb__before_atomic_dec()        barrier()
> > +#define smp_mb__after_atomic_dec() barrier()
> > +#define smp_mb__before_atomic_inc()        barrier()
> > +#define smp_mb__after_atomic_inc() barrier()
> > +
> > +#endif
> > +#endif
> > diff --git a/arch/microblaze/include/asm/bitops.h
> > b/arch/microblaze/include/asm/bitops.h
> > index 2cab2ac..b3b17b9 100644
> > --- a/arch/microblaze/include/asm/bitops.h
> > +++ b/arch/microblaze/include/asm/bitops.h
> > @@ -204,10 +204,10 @@ static inline int __test_bit(int nr, volatile void
> *addr)
> >     return ((mask & *a) != 0);
> >   }
> >
> > -#define test_bit(nr,addr) \
> > -(__builtin_constant_p(nr) ? \
> > - __constant_test_bit((nr),(addr)) : \
> > - __test_bit((nr),(addr)))
> > +static inline int test_bit(int nr, const void * addr) {
> > +   return ((unsigned char *) addr)[nr >> 3] & (1U << (nr & 7)); }
> >
> >   #define find_first_zero_bit(addr, size) \
> >     find_next_zero_bit((addr), (size), 0) diff --git a/fs/ubifs/io.c
> > b/fs/ubifs/io.c index 51a95bb..685713e 100644
> > --- a/fs/ubifs/io.c
> > +++ b/fs/ubifs/io.c
> > @@ -847,6 +847,7 @@ out:
> >     ubifs_dump_leb(c, wbuf->lnum);
> >     return err;
> >   }
> > +#endif
> >
> >   /**
> >    * ubifs_write_node - write node to the media.
> > @@ -885,7 +886,6 @@ int ubifs_write_node(struct ubifs_info *c, void
> > *buf, int len, int lnum,
> >
> >     return err;
> >   }
> > -#endif
> >
> >   /**
> >    * ubifs_read_node_wbuf - read node from the media or write-buffer.
> > diff --git a/fs/ubifs/log.c b/fs/ubifs/log.c index a07fdef..10302b9
> > 100644
> > --- a/fs/ubifs/log.c
> > +++ b/fs/ubifs/log.c
> > @@ -743,3 +743,102 @@ static int dbg_check_bud_bytes(struct ubifs_info
> > *c)
> >
> >     return err;
> >   }
> > +
> > +
> > +/**
> > + * ubifs_commit_required - set commit state to "required".
> > + * @c: UBIFS file-system description object
> > + *
> > + * This function is called if a commit is required but cannot be done
> > +from the
> > + * calling function, so it is just flagged instead.
> > + */
> > +void ubifs_commit_required(struct ubifs_info *c) {
> > +   spin_lock(&c->cs_lock);
> > +   switch (c->cmt_state) {
> > +   case COMMIT_RESTING:
> > +   case COMMIT_BACKGROUND:
> > +           dbg_cmt("old: %s, new: %s", dbg_cstate(c->cmt_state),
> > +                   dbg_cstate(COMMIT_REQUIRED));
> > +           c->cmt_state = COMMIT_REQUIRED;
> > +           break;
> > +   case COMMIT_RUNNING_BACKGROUND:
> > +           dbg_cmt("old: %s, new: %s", dbg_cstate(c->cmt_state),
> > +                   dbg_cstate(COMMIT_RUNNING_REQUIRED));
> > +           c->cmt_state = COMMIT_RUNNING_REQUIRED;
> > +           break;
> > +   case COMMIT_REQUIRED:
> > +   case COMMIT_RUNNING_REQUIRED:
> > +   case COMMIT_BROKEN:
> > +           break;
> > +   }
> > +   spin_unlock(&c->cs_lock);
> > +}
> > +
> > +/**
> > + * ubifs_write_master - write master node.
> > + * @c: UBIFS file-system description object
> > + *
> > + * This function writes the master node. Returns zero in case of
> > +success and a
> > + * negative error code in case of failure. The master node is written
> > +twice to
> > + * enable recovery.
> > + */
> > +int ubifs_write_master(struct ubifs_info *c) {
> > +   int err, lnum, offs, len;
> > +
> > +   ubifs_assert(!c->ro_media && !c->ro_mount);
> > +   if (c->ro_error)
> > +           return -EROFS;
> > +
> > +   lnum = UBIFS_MST_LNUM;
> > +   offs = c->mst_offs + c->mst_node_alsz;
> > +   len = UBIFS_MST_NODE_SZ;
> > +
> > +   if (offs + UBIFS_MST_NODE_SZ > c->leb_size) {
> > +           err = ubifs_leb_unmap(c, lnum);
> > +           if (err)
> > +                   return err;
> > +           offs = 0;
> > +   }
> > +
> > +   c->mst_offs = offs;
> > +   c->mst_node->highest_inum = cpu_to_le64(c->highest_inum);
> > +
> > +   err = ubifs_write_node(c, c->mst_node, len, lnum, offs);
> > +   if (err)
> > +           return err;
> > +
> > +   lnum += 1;
> > +
> > +   if (offs == 0) {
> > +           err = ubifs_leb_unmap(c, lnum);
> > +           if (err)
> > +                   return err;
> > +   }
> > +   err = ubifs_write_node(c, c->mst_node, len, lnum, offs);
> > +
> > +   return err;
> > +}
> > +
> > +/**
> > + * ubifs_request_bg_commit - notify the background thread to do a
> commit.
> > + * @c: UBIFS file-system description object
> > + *
> > + * This function is called if the journal is full enough to make a
> > +commit
> > + * worthwhile, so background thread is kicked to start it.
> > + */
> > +void ubifs_request_bg_commit(struct ubifs_info *c) {
> > +   spin_lock(&c->cs_lock);
> > +   if (c->cmt_state == COMMIT_RESTING) {
> > +           dbg_cmt("old: %s, new: %s", dbg_cstate(c->cmt_state),
> > +                   dbg_cstate(COMMIT_BACKGROUND));
> > +           c->cmt_state = COMMIT_BACKGROUND;
> > +           spin_unlock(&c->cs_lock);
> > +           ubifs_wake_up_bgt(c);
> > +   } else
> > +           spin_unlock(&c->cs_lock);
> > +}
> > +
> > +
> > diff --git a/fs/ubifs/lpt_commit.c b/fs/ubifs/lpt_commit.c index
> > 2df9130..61b2cc8 100644
> > --- a/fs/ubifs/lpt_commit.c
> > +++ b/fs/ubifs/lpt_commit.c
> > @@ -2039,4 +2039,25 @@ static int dbg_populate_lsave(struct ubifs_info
> > *c)
> >
> >     return 1;
> >   }
> > +#else
> > +
> > +int dbg_chk_lpt_free_spc(struct ubifs_info *c) {
> > +   return 0;
> > +}
> > +
> > +int dbg_check_ltab(struct ubifs_info *c) {
> > +   return 0;
> > +}
> > +
> > +int dbg_chk_lpt_sz(struct ubifs_info *c, int action, int len) {
> > +   return 0;
> > +}
> > +
> > +void ubifs_dump_lpt_lebs(const struct ubifs_info *c) { }
> > +
> >   #endif
> >
>
> --
> DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
>
Hoefle Marco Sept. 1, 2016, 12:45 p.m. UTC | #4
Hello Heiko and Michal,
Do you agree that the u-boot sources need to be adapted in order to have ubifs on the Microblaze?
It would be good if the changes are somehow in the mainline.
BR
Marco


> -----Original Message-----
> From: Hoefle Marco
> Sent: Montag, 15. August 2016 13:55
> To: u-boot@lists.denx.de; hs@denx.de
> Cc: monstr@monstr.eu
> Subject: WG: [U-Boot] [PATCH] getting ubifs to run
> 
> Hello Heiko,
> You are right, there are two parts: the Microblaze part and the ubifs stuff.
> To get u-boot compiled I added the following to the Microblaze architecture:
> atomic.h based on the ARM architecture, was missing before.
> Modified bitops.h to get rid of compiler warnings The three ubifs files had
> #defines which didn't work for me.
> With the changes of the patch I sent I can successfully load the Kernel from a
> ubifs partition on a Microblaze.
> 
> 
> That were the problems:
> 
> CC      fs/ubifs/ubifs.o
> In file included from /home/hoefle/projects/u-
> boot_patch/fs/ubifs/ubifs.c:17:0:
> /home/hoefle/projects/u-boot_patch/fs/ubifs/ubifs.h:35:24: fatal error:
> asm/atomic.h: No such file or directory  #include <asm/atomic.h>
>                         ^
> compilation terminated.
> 
> 
> /home/hoefle/projects/u-
> boot_patch/arch/microblaze/include/asm/bitops.h:197:19: note: expected
> 'volatile void *' but argument is of type 'const long unsigned int *'
>  static inline int __test_bit(int nr, volatile void *addr)
>                    ^
> /home/hoefle/projects/u-boot_patch/fs/ubifs/misc.h: In function
> 'ubifs_zn_obsolete':
> /home/hoefle/projects/u-
> boot_patch/arch/microblaze/include/asm/bitops.h:210:18: warning: passing
> argument 2 of '__test_bit' discards 'const' qualifier from pointer target type
>   __test_bit((nr),(addr)))
>                   ^
> /home/hoefle/projects/u-boot_patch/fs/ubifs/misc.h:38:11: note: in
> expansion of macro 'test_bit'
>   return !!test_bit(OBSOLETE_ZNODE, &znode->flags);
>            ^
> /home/hoefle/projects/u-
> boot_patch/arch/microblaze/include/asm/bitops.h:197:19: note: expected
> 'volatile void *' but argument is of type 'const long unsigned int *'
>  static inline int __test_bit(int nr, volatile void *addr)
>                    ^
> /home/hoefle/projects/u-boot_patch/fs/ubifs/misc.h: In function
> 'ubifs_zn_cow':
> /home/hoefle/projects/u-
> boot_patch/arch/microblaze/include/asm/bitops.h:210:18: warning: passing
> argument 2 of '__test_bit' discards 'const' qualifier from pointer target type
>   __test_bit((nr),(addr)))
>                   ^
> /home/hoefle/projects/u-boot_patch/fs/ubifs/misc.h:50:11: note: in
> expansion of macro 'test_bit'
>   return !!test_bit(COW_ZNODE, &znode->flags);
>            ^
> /home/hoefle/projects/u-
> boot_patch/arch/microblaze/include/asm/bitops.h:197:19: note: expected
> 'volatile void *' but argument is of type 'const long unsigned int *'
>  static inline int __test_bit(int nr, volatile void *addr)
>                    ^
> 
> 
> 
> fs/built-in.o: In function `ubifs_lpt_start_commit':
> /home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:1232:
> undefined reference to `dbg_chk_lpt_free_spc'
> /home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:1235:
> undefined reference to `dbg_check_ltab'
> fs/built-in.o: In function `layout_cnodes':
> /home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:195: undefined
> reference to `dbg_chk_lpt_sz'
> /home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:211: undefined
> reference to `dbg_chk_lpt_sz'
> /home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:219: undefined
> reference to `dbg_chk_lpt_sz'
> /home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:233: undefined
> reference to `dbg_chk_lpt_sz'
> /home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:246: undefined
> reference to `dbg_chk_lpt_sz'
> fs/built-in.o:/home/hoefle/projects/u-
> boot_patch/fs/ubifs/lpt_commit.c:254: more undefined references to
> `dbg_chk_lpt_sz' follow
> fs/built-in.o: In function `layout_cnodes':
> /home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:322: undefined
> reference to `ubifs_dump_lpt_lebs'
> fs/built-in.o: In function `ubifs_add_bud_to_log':
> /home/hoefle/projects/u-boot_patch/fs/ubifs/log.c:194: undefined
> reference to `ubifs_commit_required'
> /home/hoefle/projects/u-boot_patch/fs/ubifs/log.c:225: undefined
> reference to `ubifs_request_bg_commit'
> /home/hoefle/projects/u-boot_patch/fs/ubifs/log.c:265: undefined
> reference to `ubifs_write_node'
> fs/built-in.o: In function `ubifs_log_end_commit':
> /home/hoefle/projects/u-boot_patch/fs/ubifs/log.c:479: undefined
> reference to `ubifs_write_master'
> fs/built-in.o: In function `write_orph_node':
> /home/hoefle/projects/u-boot_patch/fs/ubifs/orphan.c:248: undefined
> reference to `ubifs_write_node'
> 
> 
> Regards,
> Marco
> 
> 
> 
> > -----Original Message-----
> > From: Heiko Schocher [mailto:hs@denx.de]
> > Sent: Freitag, 12. August 2016 07:05
> > To: Hoefle Marco <Marco.Hoefle@nanotronic.ch>
> > Cc: monstr@monstr.eu; u-boot@lists.denx.de
> > Subject: Re: [U-Boot] [PATCH] getting ubifs to run
> >
> > Hello Marco,
> >
> > Am 11.08.2016 um 11:56 schrieb Marco:
> > > Signed-off-by: Marco <marco.hoefle@nanotronic.ch>
> > > ---
> > >   arch/microblaze/include/asm/atomic.h | 114
> > +++++++++++++++++++++++++++++++++++
> > >   arch/microblaze/include/asm/bitops.h |   8 +--
> > >   fs/ubifs/io.c                        |   2 +-
> > >   fs/ubifs/log.c                       |  99 ++++++++++++++++++++++++++++++
> > >   fs/ubifs/lpt_commit.c                |  21 +++++++
> > >   5 files changed, 239 insertions(+), 5 deletions(-)
> > >   create mode 100644 arch/microblaze/include/asm/atomic.h
> >
> > Hmm... what exactly do you fix? Can you add a commit message please?
> >
> > It seems to me, you get ubifs working on microblaze arch?
> >
> > And may you can split this patch into at least two pieces, one for the
> > arch fixes, and one for the ubifs fixes?
> >
> > ubifs read support works for me on some arm based plattforms ...
> > what exactly do you fix with your fs/ubifs/* changes?
> >
> > Thanks!
> >
> > bye,
> > Heiko
> > > diff --git a/arch/microblaze/include/asm/atomic.h
> > > b/arch/microblaze/include/asm/atomic.h
> > > new file mode 100644
> > > index 0000000..2872149
> > > --- /dev/null
> > > +++ b/arch/microblaze/include/asm/atomic.h
> > > @@ -0,0 +1,114 @@
> > > +/*
> > > + *  linux/include/asm-arm/atomic.h
> > > + *
> > > + *  Copyright (c) 1996 Russell King.
> > > + *
> > > + * This program is free software; you can redistribute it and/or
> > > +modify
> > > + * it under the terms of the GNU General Public License version 2
> > > +as
> > > + * published by the Free Software Foundation.
> > > + *
> > > + *  Changelog:
> > > + *   27-06-1996    RMK     Created
> > > + *   13-04-1997    RMK     Made functions atomic!
> > > + *   07-12-1997    RMK     Upgraded for v2.1.
> > > + *   26-08-1998    PJB     Added #ifdef __KERNEL__
> > > + */
> > > +#ifndef __ASM_ARM_ATOMIC_H
> > > +#define __ASM_ARM_ATOMIC_H
> > > +
> > > +#ifdef CONFIG_SMP
> > > +#error SMP not supported
> > > +#endif
> > > +
> > > +typedef struct { volatile int counter; } atomic_t;
> > > +
> > > +#define ATOMIC_INIT(i)     { (i) }
> > > +
> > > +#ifdef __KERNEL__
> > > +#include <asm/system.h>
> > > +
> > > +#define atomic_read(v)     ((v)->counter)
> > > +#define atomic_set(v,i)    (((v)->counter) = (i))
> > > +
> > > +
> > > +
> > > +
> > > +static inline void atomic_add(int i, volatile atomic_t *v) {
> > > +   unsigned long flags = 0;
> > > +
> > > +   local_irq_save(flags);
> > > +   v->counter += i;
> > > +   local_irq_restore(flags);
> > > +}
> > > +
> > > +static inline void atomic_sub(int i, volatile atomic_t *v) {
> > > +   unsigned long flags = 0;
> > > +
> > > +   local_irq_save(flags);
> > > +   v->counter -= i;
> > > +   local_irq_restore(flags);
> > > +}
> > > +
> > > +static inline void atomic_inc(volatile atomic_t *v) {
> > > +   unsigned long flags = 0;
> > > +
> > > +   local_irq_save(flags);
> > > +   v->counter += 1;
> > > +   local_irq_restore(flags);
> > > +}
> > > +
> > > +static inline void atomic_dec(volatile atomic_t *v) {
> > > +   unsigned long flags = 0;
> > > +
> > > +   local_irq_save(flags);
> > > +   v->counter -= 1;
> > > +   local_irq_restore(flags);
> > > +}
> > > +
> > > +static inline int atomic_dec_and_test(volatile atomic_t *v) {
> > > +   unsigned long flags = 0;
> > > +   int val;
> > > +
> > > +   local_irq_save(flags);
> > > +   val = v->counter;
> > > +   v->counter = val -= 1;
> > > +   local_irq_restore(flags);
> > > +
> > > +   return val == 0;
> > > +}
> > > +
> > > +static inline int atomic_add_negative(int i, volatile atomic_t *v) {
> > > +   unsigned long flags = 0;
> > > +   int val;
> > > +
> > > +   local_irq_save(flags);
> > > +   val = v->counter;
> > > +   v->counter = val += i;
> > > +   local_irq_restore(flags);
> > > +
> > > +   return val < 0;
> > > +}
> > > +
> > > +static inline void atomic_clear_mask(unsigned long mask, unsigned
> > > +long *addr) {
> > > +   unsigned long flags = 0;
> > > +
> > > +   local_irq_save(flags);
> > > +   *addr &= ~mask;
> > > +   local_irq_restore(flags);
> > > +}
> > > +
> > > +/* Atomic operations are already serializing on ARM */
> > > +#define smp_mb__before_atomic_dec()        barrier()
> > > +#define smp_mb__after_atomic_dec() barrier()
> > > +#define smp_mb__before_atomic_inc()        barrier()
> > > +#define smp_mb__after_atomic_inc() barrier()
> > > +
> > > +#endif
> > > +#endif
> > > diff --git a/arch/microblaze/include/asm/bitops.h
> > > b/arch/microblaze/include/asm/bitops.h
> > > index 2cab2ac..b3b17b9 100644
> > > --- a/arch/microblaze/include/asm/bitops.h
> > > +++ b/arch/microblaze/include/asm/bitops.h
> > > @@ -204,10 +204,10 @@ static inline int __test_bit(int nr, volatile
> > > void
> > *addr)
> > >     return ((mask & *a) != 0);
> > >   }
> > >
> > > -#define test_bit(nr,addr) \
> > > -(__builtin_constant_p(nr) ? \
> > > - __constant_test_bit((nr),(addr)) : \
> > > - __test_bit((nr),(addr)))
> > > +static inline int test_bit(int nr, const void * addr) {
> > > +   return ((unsigned char *) addr)[nr >> 3] & (1U << (nr & 7)); }
> > >
> > >   #define find_first_zero_bit(addr, size) \
> > >     find_next_zero_bit((addr), (size), 0) diff --git a/fs/ubifs/io.c
> > > b/fs/ubifs/io.c index 51a95bb..685713e 100644
> > > --- a/fs/ubifs/io.c
> > > +++ b/fs/ubifs/io.c
> > > @@ -847,6 +847,7 @@ out:
> > >     ubifs_dump_leb(c, wbuf->lnum);
> > >     return err;
> > >   }
> > > +#endif
> > >
> > >   /**
> > >    * ubifs_write_node - write node to the media.
> > > @@ -885,7 +886,6 @@ int ubifs_write_node(struct ubifs_info *c, void
> > > *buf, int len, int lnum,
> > >
> > >     return err;
> > >   }
> > > -#endif
> > >
> > >   /**
> > >    * ubifs_read_node_wbuf - read node from the media or write-buffer.
> > > diff --git a/fs/ubifs/log.c b/fs/ubifs/log.c index a07fdef..10302b9
> > > 100644
> > > --- a/fs/ubifs/log.c
> > > +++ b/fs/ubifs/log.c
> > > @@ -743,3 +743,102 @@ static int dbg_check_bud_bytes(struct
> > > ubifs_info
> > > *c)
> > >
> > >     return err;
> > >   }
> > > +
> > > +
> > > +/**
> > > + * ubifs_commit_required - set commit state to "required".
> > > + * @c: UBIFS file-system description object
> > > + *
> > > + * This function is called if a commit is required but cannot be
> > > +done from the
> > > + * calling function, so it is just flagged instead.
> > > + */
> > > +void ubifs_commit_required(struct ubifs_info *c) {
> > > +   spin_lock(&c->cs_lock);
> > > +   switch (c->cmt_state) {
> > > +   case COMMIT_RESTING:
> > > +   case COMMIT_BACKGROUND:
> > > +           dbg_cmt("old: %s, new: %s", dbg_cstate(c->cmt_state),
> > > +                   dbg_cstate(COMMIT_REQUIRED));
> > > +           c->cmt_state = COMMIT_REQUIRED;
> > > +           break;
> > > +   case COMMIT_RUNNING_BACKGROUND:
> > > +           dbg_cmt("old: %s, new: %s", dbg_cstate(c->cmt_state),
> > > +                   dbg_cstate(COMMIT_RUNNING_REQUIRED));
> > > +           c->cmt_state = COMMIT_RUNNING_REQUIRED;
> > > +           break;
> > > +   case COMMIT_REQUIRED:
> > > +   case COMMIT_RUNNING_REQUIRED:
> > > +   case COMMIT_BROKEN:
> > > +           break;
> > > +   }
> > > +   spin_unlock(&c->cs_lock);
> > > +}
> > > +
> > > +/**
> > > + * ubifs_write_master - write master node.
> > > + * @c: UBIFS file-system description object
> > > + *
> > > + * This function writes the master node. Returns zero in case of
> > > +success and a
> > > + * negative error code in case of failure. The master node is
> > > +written twice to
> > > + * enable recovery.
> > > + */
> > > +int ubifs_write_master(struct ubifs_info *c) {
> > > +   int err, lnum, offs, len;
> > > +
> > > +   ubifs_assert(!c->ro_media && !c->ro_mount);
> > > +   if (c->ro_error)
> > > +           return -EROFS;
> > > +
> > > +   lnum = UBIFS_MST_LNUM;
> > > +   offs = c->mst_offs + c->mst_node_alsz;
> > > +   len = UBIFS_MST_NODE_SZ;
> > > +
> > > +   if (offs + UBIFS_MST_NODE_SZ > c->leb_size) {
> > > +           err = ubifs_leb_unmap(c, lnum);
> > > +           if (err)
> > > +                   return err;
> > > +           offs = 0;
> > > +   }
> > > +
> > > +   c->mst_offs = offs;
> > > +   c->mst_node->highest_inum = cpu_to_le64(c->highest_inum);
> > > +
> > > +   err = ubifs_write_node(c, c->mst_node, len, lnum, offs);
> > > +   if (err)
> > > +           return err;
> > > +
> > > +   lnum += 1;
> > > +
> > > +   if (offs == 0) {
> > > +           err = ubifs_leb_unmap(c, lnum);
> > > +           if (err)
> > > +                   return err;
> > > +   }
> > > +   err = ubifs_write_node(c, c->mst_node, len, lnum, offs);
> > > +
> > > +   return err;
> > > +}
> > > +
> > > +/**
> > > + * ubifs_request_bg_commit - notify the background thread to do a
> > commit.
> > > + * @c: UBIFS file-system description object
> > > + *
> > > + * This function is called if the journal is full enough to make a
> > > +commit
> > > + * worthwhile, so background thread is kicked to start it.
> > > + */
> > > +void ubifs_request_bg_commit(struct ubifs_info *c) {
> > > +   spin_lock(&c->cs_lock);
> > > +   if (c->cmt_state == COMMIT_RESTING) {
> > > +           dbg_cmt("old: %s, new: %s", dbg_cstate(c->cmt_state),
> > > +                   dbg_cstate(COMMIT_BACKGROUND));
> > > +           c->cmt_state = COMMIT_BACKGROUND;
> > > +           spin_unlock(&c->cs_lock);
> > > +           ubifs_wake_up_bgt(c);
> > > +   } else
> > > +           spin_unlock(&c->cs_lock); }
> > > +
> > > +
> > > diff --git a/fs/ubifs/lpt_commit.c b/fs/ubifs/lpt_commit.c index
> > > 2df9130..61b2cc8 100644
> > > --- a/fs/ubifs/lpt_commit.c
> > > +++ b/fs/ubifs/lpt_commit.c
> > > @@ -2039,4 +2039,25 @@ static int dbg_populate_lsave(struct
> > > ubifs_info
> > > *c)
> > >
> > >     return 1;
> > >   }
> > > +#else
> > > +
> > > +int dbg_chk_lpt_free_spc(struct ubifs_info *c) {
> > > +   return 0;
> > > +}
> > > +
> > > +int dbg_check_ltab(struct ubifs_info *c) {
> > > +   return 0;
> > > +}
> > > +
> > > +int dbg_chk_lpt_sz(struct ubifs_info *c, int action, int len) {
> > > +   return 0;
> > > +}
> > > +
> > > +void ubifs_dump_lpt_lebs(const struct ubifs_info *c) { }
> > > +
> > >   #endif
> > >
> >
> > --
> > DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
> > HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> >
Heiko Schocher Sept. 2, 2016, 7:57 a.m. UTC | #5
Hello Marco,

Am 01.09.2016 um 14:45 schrieb Hoefle Marco:
> Hello Heiko and Michal,
> Do you agree that the u-boot sources need to be adapted in order to have ubifs on the Microblaze?

As you found an error, yes!

> It would be good if the changes are somehow in the mainline.

Of course ... Hmm I wrote on"12.08.2016 07:05":
> Hmm... what exactly do you fix? Can you add a commit message please?
>
> It seems to me, you get ubifs working on microblaze arch?
>
> And may you can split this patch into at least two pieces, one for the
> arch fixes, and one for the ubifs fixes?
>
> ubifs read support works for me on some arm based plattforms ...
> what exactly do you fix with your fs/ubifs/* changes?

May I was unclear ... I am waiting for a v2 ;-)

Please split your patch into 2 pieces, write a commit message
and resend them as a v2 to the list with Michal and me in CC

Thanks!

bye,
Heiko

> BR
> Marco
>
>
>> -----Original Message-----
>> From: Hoefle Marco
>> Sent: Montag, 15. August 2016 13:55
>> To: u-boot@lists.denx.de; hs@denx.de
>> Cc: monstr@monstr.eu
>> Subject: WG: [U-Boot] [PATCH] getting ubifs to run
>>
>> Hello Heiko,
>> You are right, there are two parts: the Microblaze part and the ubifs stuff.
>> To get u-boot compiled I added the following to the Microblaze architecture:
>> atomic.h based on the ARM architecture, was missing before.
>> Modified bitops.h to get rid of compiler warnings The three ubifs files had
>> #defines which didn't work for me.
>> With the changes of the patch I sent I can successfully load the Kernel from a
>> ubifs partition on a Microblaze.
>>
>>
>> That were the problems:
>>
>> CC      fs/ubifs/ubifs.o
>> In file included from /home/hoefle/projects/u-
>> boot_patch/fs/ubifs/ubifs.c:17:0:
>> /home/hoefle/projects/u-boot_patch/fs/ubifs/ubifs.h:35:24: fatal error:
>> asm/atomic.h: No such file or directory  #include <asm/atomic.h>
>>                          ^
>> compilation terminated.
>>
>>
>> /home/hoefle/projects/u-
>> boot_patch/arch/microblaze/include/asm/bitops.h:197:19: note: expected
>> 'volatile void *' but argument is of type 'const long unsigned int *'
>>   static inline int __test_bit(int nr, volatile void *addr)
>>                     ^
>> /home/hoefle/projects/u-boot_patch/fs/ubifs/misc.h: In function
>> 'ubifs_zn_obsolete':
>> /home/hoefle/projects/u-
>> boot_patch/arch/microblaze/include/asm/bitops.h:210:18: warning: passing
>> argument 2 of '__test_bit' discards 'const' qualifier from pointer target type
>>    __test_bit((nr),(addr)))
>>                    ^
>> /home/hoefle/projects/u-boot_patch/fs/ubifs/misc.h:38:11: note: in
>> expansion of macro 'test_bit'
>>    return !!test_bit(OBSOLETE_ZNODE, &znode->flags);
>>             ^
>> /home/hoefle/projects/u-
>> boot_patch/arch/microblaze/include/asm/bitops.h:197:19: note: expected
>> 'volatile void *' but argument is of type 'const long unsigned int *'
>>   static inline int __test_bit(int nr, volatile void *addr)
>>                     ^
>> /home/hoefle/projects/u-boot_patch/fs/ubifs/misc.h: In function
>> 'ubifs_zn_cow':
>> /home/hoefle/projects/u-
>> boot_patch/arch/microblaze/include/asm/bitops.h:210:18: warning: passing
>> argument 2 of '__test_bit' discards 'const' qualifier from pointer target type
>>    __test_bit((nr),(addr)))
>>                    ^
>> /home/hoefle/projects/u-boot_patch/fs/ubifs/misc.h:50:11: note: in
>> expansion of macro 'test_bit'
>>    return !!test_bit(COW_ZNODE, &znode->flags);
>>             ^
>> /home/hoefle/projects/u-
>> boot_patch/arch/microblaze/include/asm/bitops.h:197:19: note: expected
>> 'volatile void *' but argument is of type 'const long unsigned int *'
>>   static inline int __test_bit(int nr, volatile void *addr)
>>                     ^
>>
>>
>>
>> fs/built-in.o: In function `ubifs_lpt_start_commit':
>> /home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:1232:
>> undefined reference to `dbg_chk_lpt_free_spc'
>> /home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:1235:
>> undefined reference to `dbg_check_ltab'
>> fs/built-in.o: In function `layout_cnodes':
>> /home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:195: undefined
>> reference to `dbg_chk_lpt_sz'
>> /home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:211: undefined
>> reference to `dbg_chk_lpt_sz'
>> /home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:219: undefined
>> reference to `dbg_chk_lpt_sz'
>> /home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:233: undefined
>> reference to `dbg_chk_lpt_sz'
>> /home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:246: undefined
>> reference to `dbg_chk_lpt_sz'
>> fs/built-in.o:/home/hoefle/projects/u-
>> boot_patch/fs/ubifs/lpt_commit.c:254: more undefined references to
>> `dbg_chk_lpt_sz' follow
>> fs/built-in.o: In function `layout_cnodes':
>> /home/hoefle/projects/u-boot_patch/fs/ubifs/lpt_commit.c:322: undefined
>> reference to `ubifs_dump_lpt_lebs'
>> fs/built-in.o: In function `ubifs_add_bud_to_log':
>> /home/hoefle/projects/u-boot_patch/fs/ubifs/log.c:194: undefined
>> reference to `ubifs_commit_required'
>> /home/hoefle/projects/u-boot_patch/fs/ubifs/log.c:225: undefined
>> reference to `ubifs_request_bg_commit'
>> /home/hoefle/projects/u-boot_patch/fs/ubifs/log.c:265: undefined
>> reference to `ubifs_write_node'
>> fs/built-in.o: In function `ubifs_log_end_commit':
>> /home/hoefle/projects/u-boot_patch/fs/ubifs/log.c:479: undefined
>> reference to `ubifs_write_master'
>> fs/built-in.o: In function `write_orph_node':
>> /home/hoefle/projects/u-boot_patch/fs/ubifs/orphan.c:248: undefined
>> reference to `ubifs_write_node'
>>
>>
>> Regards,
>> Marco
>>
>>
>>
>>> -----Original Message-----
>>> From: Heiko Schocher [mailto:hs@denx.de]
>>> Sent: Freitag, 12. August 2016 07:05
>>> To: Hoefle Marco <Marco.Hoefle@nanotronic.ch>
>>> Cc: monstr@monstr.eu; u-boot@lists.denx.de
>>> Subject: Re: [U-Boot] [PATCH] getting ubifs to run
>>>
>>> Hello Marco,
>>>
>>> Am 11.08.2016 um 11:56 schrieb Marco:
>>>> Signed-off-by: Marco <marco.hoefle@nanotronic.ch>
>>>> ---
>>>>    arch/microblaze/include/asm/atomic.h | 114
>>> +++++++++++++++++++++++++++++++++++
>>>>    arch/microblaze/include/asm/bitops.h |   8 +--
>>>>    fs/ubifs/io.c                        |   2 +-
>>>>    fs/ubifs/log.c                       |  99 ++++++++++++++++++++++++++++++
>>>>    fs/ubifs/lpt_commit.c                |  21 +++++++
>>>>    5 files changed, 239 insertions(+), 5 deletions(-)
>>>>    create mode 100644 arch/microblaze/include/asm/atomic.h
>>>
>>> Hmm... what exactly do you fix? Can you add a commit message please?
>>>
>>> It seems to me, you get ubifs working on microblaze arch?
>>>
>>> And may you can split this patch into at least two pieces, one for the
>>> arch fixes, and one for the ubifs fixes?
>>>
>>> ubifs read support works for me on some arm based plattforms ...
>>> what exactly do you fix with your fs/ubifs/* changes?
>>>
>>> Thanks!
>>>
>>> bye,
>>> Heiko
>>>> diff --git a/arch/microblaze/include/asm/atomic.h
>>>> b/arch/microblaze/include/asm/atomic.h
>>>> new file mode 100644
>>>> index 0000000..2872149
>>>> --- /dev/null
>>>> +++ b/arch/microblaze/include/asm/atomic.h
>>>> @@ -0,0 +1,114 @@
>>>> +/*
>>>> + *  linux/include/asm-arm/atomic.h
>>>> + *
>>>> + *  Copyright (c) 1996 Russell King.
>>>> + *
>>>> + * This program is free software; you can redistribute it and/or
>>>> +modify
>>>> + * it under the terms of the GNU General Public License version 2
>>>> +as
>>>> + * published by the Free Software Foundation.
>>>> + *
>>>> + *  Changelog:
>>>> + *   27-06-1996    RMK     Created
>>>> + *   13-04-1997    RMK     Made functions atomic!
>>>> + *   07-12-1997    RMK     Upgraded for v2.1.
>>>> + *   26-08-1998    PJB     Added #ifdef __KERNEL__
>>>> + */
>>>> +#ifndef __ASM_ARM_ATOMIC_H
>>>> +#define __ASM_ARM_ATOMIC_H
>>>> +
>>>> +#ifdef CONFIG_SMP
>>>> +#error SMP not supported
>>>> +#endif
>>>> +
>>>> +typedef struct { volatile int counter; } atomic_t;
>>>> +
>>>> +#define ATOMIC_INIT(i)     { (i) }
>>>> +
>>>> +#ifdef __KERNEL__
>>>> +#include <asm/system.h>
>>>> +
>>>> +#define atomic_read(v)     ((v)->counter)
>>>> +#define atomic_set(v,i)    (((v)->counter) = (i))
>>>> +
>>>> +
>>>> +
>>>> +
>>>> +static inline void atomic_add(int i, volatile atomic_t *v) {
>>>> +   unsigned long flags = 0;
>>>> +
>>>> +   local_irq_save(flags);
>>>> +   v->counter += i;
>>>> +   local_irq_restore(flags);
>>>> +}
>>>> +
>>>> +static inline void atomic_sub(int i, volatile atomic_t *v) {
>>>> +   unsigned long flags = 0;
>>>> +
>>>> +   local_irq_save(flags);
>>>> +   v->counter -= i;
>>>> +   local_irq_restore(flags);
>>>> +}
>>>> +
>>>> +static inline void atomic_inc(volatile atomic_t *v) {
>>>> +   unsigned long flags = 0;
>>>> +
>>>> +   local_irq_save(flags);
>>>> +   v->counter += 1;
>>>> +   local_irq_restore(flags);
>>>> +}
>>>> +
>>>> +static inline void atomic_dec(volatile atomic_t *v) {
>>>> +   unsigned long flags = 0;
>>>> +
>>>> +   local_irq_save(flags);
>>>> +   v->counter -= 1;
>>>> +   local_irq_restore(flags);
>>>> +}
>>>> +
>>>> +static inline int atomic_dec_and_test(volatile atomic_t *v) {
>>>> +   unsigned long flags = 0;
>>>> +   int val;
>>>> +
>>>> +   local_irq_save(flags);
>>>> +   val = v->counter;
>>>> +   v->counter = val -= 1;
>>>> +   local_irq_restore(flags);
>>>> +
>>>> +   return val == 0;
>>>> +}
>>>> +
>>>> +static inline int atomic_add_negative(int i, volatile atomic_t *v) {
>>>> +   unsigned long flags = 0;
>>>> +   int val;
>>>> +
>>>> +   local_irq_save(flags);
>>>> +   val = v->counter;
>>>> +   v->counter = val += i;
>>>> +   local_irq_restore(flags);
>>>> +
>>>> +   return val < 0;
>>>> +}
>>>> +
>>>> +static inline void atomic_clear_mask(unsigned long mask, unsigned
>>>> +long *addr) {
>>>> +   unsigned long flags = 0;
>>>> +
>>>> +   local_irq_save(flags);
>>>> +   *addr &= ~mask;
>>>> +   local_irq_restore(flags);
>>>> +}
>>>> +
>>>> +/* Atomic operations are already serializing on ARM */
>>>> +#define smp_mb__before_atomic_dec()        barrier()
>>>> +#define smp_mb__after_atomic_dec() barrier()
>>>> +#define smp_mb__before_atomic_inc()        barrier()
>>>> +#define smp_mb__after_atomic_inc() barrier()
>>>> +
>>>> +#endif
>>>> +#endif
>>>> diff --git a/arch/microblaze/include/asm/bitops.h
>>>> b/arch/microblaze/include/asm/bitops.h
>>>> index 2cab2ac..b3b17b9 100644
>>>> --- a/arch/microblaze/include/asm/bitops.h
>>>> +++ b/arch/microblaze/include/asm/bitops.h
>>>> @@ -204,10 +204,10 @@ static inline int __test_bit(int nr, volatile
>>>> void
>>> *addr)
>>>>      return ((mask & *a) != 0);
>>>>    }
>>>>
>>>> -#define test_bit(nr,addr) \
>>>> -(__builtin_constant_p(nr) ? \
>>>> - __constant_test_bit((nr),(addr)) : \
>>>> - __test_bit((nr),(addr)))
>>>> +static inline int test_bit(int nr, const void * addr) {
>>>> +   return ((unsigned char *) addr)[nr >> 3] & (1U << (nr & 7)); }
>>>>
>>>>    #define find_first_zero_bit(addr, size) \
>>>>      find_next_zero_bit((addr), (size), 0) diff --git a/fs/ubifs/io.c
>>>> b/fs/ubifs/io.c index 51a95bb..685713e 100644
>>>> --- a/fs/ubifs/io.c
>>>> +++ b/fs/ubifs/io.c
>>>> @@ -847,6 +847,7 @@ out:
>>>>      ubifs_dump_leb(c, wbuf->lnum);
>>>>      return err;
>>>>    }
>>>> +#endif
>>>>
>>>>    /**
>>>>     * ubifs_write_node - write node to the media.
>>>> @@ -885,7 +886,6 @@ int ubifs_write_node(struct ubifs_info *c, void
>>>> *buf, int len, int lnum,
>>>>
>>>>      return err;
>>>>    }
>>>> -#endif
>>>>
>>>>    /**
>>>>     * ubifs_read_node_wbuf - read node from the media or write-buffer.
>>>> diff --git a/fs/ubifs/log.c b/fs/ubifs/log.c index a07fdef..10302b9
>>>> 100644
>>>> --- a/fs/ubifs/log.c
>>>> +++ b/fs/ubifs/log.c
>>>> @@ -743,3 +743,102 @@ static int dbg_check_bud_bytes(struct
>>>> ubifs_info
>>>> *c)
>>>>
>>>>      return err;
>>>>    }
>>>> +
>>>> +
>>>> +/**
>>>> + * ubifs_commit_required - set commit state to "required".
>>>> + * @c: UBIFS file-system description object
>>>> + *
>>>> + * This function is called if a commit is required but cannot be
>>>> +done from the
>>>> + * calling function, so it is just flagged instead.
>>>> + */
>>>> +void ubifs_commit_required(struct ubifs_info *c) {
>>>> +   spin_lock(&c->cs_lock);
>>>> +   switch (c->cmt_state) {
>>>> +   case COMMIT_RESTING:
>>>> +   case COMMIT_BACKGROUND:
>>>> +           dbg_cmt("old: %s, new: %s", dbg_cstate(c->cmt_state),
>>>> +                   dbg_cstate(COMMIT_REQUIRED));
>>>> +           c->cmt_state = COMMIT_REQUIRED;
>>>> +           break;
>>>> +   case COMMIT_RUNNING_BACKGROUND:
>>>> +           dbg_cmt("old: %s, new: %s", dbg_cstate(c->cmt_state),
>>>> +                   dbg_cstate(COMMIT_RUNNING_REQUIRED));
>>>> +           c->cmt_state = COMMIT_RUNNING_REQUIRED;
>>>> +           break;
>>>> +   case COMMIT_REQUIRED:
>>>> +   case COMMIT_RUNNING_REQUIRED:
>>>> +   case COMMIT_BROKEN:
>>>> +           break;
>>>> +   }
>>>> +   spin_unlock(&c->cs_lock);
>>>> +}
>>>> +
>>>> +/**
>>>> + * ubifs_write_master - write master node.
>>>> + * @c: UBIFS file-system description object
>>>> + *
>>>> + * This function writes the master node. Returns zero in case of
>>>> +success and a
>>>> + * negative error code in case of failure. The master node is
>>>> +written twice to
>>>> + * enable recovery.
>>>> + */
>>>> +int ubifs_write_master(struct ubifs_info *c) {
>>>> +   int err, lnum, offs, len;
>>>> +
>>>> +   ubifs_assert(!c->ro_media && !c->ro_mount);
>>>> +   if (c->ro_error)
>>>> +           return -EROFS;
>>>> +
>>>> +   lnum = UBIFS_MST_LNUM;
>>>> +   offs = c->mst_offs + c->mst_node_alsz;
>>>> +   len = UBIFS_MST_NODE_SZ;
>>>> +
>>>> +   if (offs + UBIFS_MST_NODE_SZ > c->leb_size) {
>>>> +           err = ubifs_leb_unmap(c, lnum);
>>>> +           if (err)
>>>> +                   return err;
>>>> +           offs = 0;
>>>> +   }
>>>> +
>>>> +   c->mst_offs = offs;
>>>> +   c->mst_node->highest_inum = cpu_to_le64(c->highest_inum);
>>>> +
>>>> +   err = ubifs_write_node(c, c->mst_node, len, lnum, offs);
>>>> +   if (err)
>>>> +           return err;
>>>> +
>>>> +   lnum += 1;
>>>> +
>>>> +   if (offs == 0) {
>>>> +           err = ubifs_leb_unmap(c, lnum);
>>>> +           if (err)
>>>> +                   return err;
>>>> +   }
>>>> +   err = ubifs_write_node(c, c->mst_node, len, lnum, offs);
>>>> +
>>>> +   return err;
>>>> +}
>>>> +
>>>> +/**
>>>> + * ubifs_request_bg_commit - notify the background thread to do a
>>> commit.
>>>> + * @c: UBIFS file-system description object
>>>> + *
>>>> + * This function is called if the journal is full enough to make a
>>>> +commit
>>>> + * worthwhile, so background thread is kicked to start it.
>>>> + */
>>>> +void ubifs_request_bg_commit(struct ubifs_info *c) {
>>>> +   spin_lock(&c->cs_lock);
>>>> +   if (c->cmt_state == COMMIT_RESTING) {
>>>> +           dbg_cmt("old: %s, new: %s", dbg_cstate(c->cmt_state),
>>>> +                   dbg_cstate(COMMIT_BACKGROUND));
>>>> +           c->cmt_state = COMMIT_BACKGROUND;
>>>> +           spin_unlock(&c->cs_lock);
>>>> +           ubifs_wake_up_bgt(c);
>>>> +   } else
>>>> +           spin_unlock(&c->cs_lock); }
>>>> +
>>>> +
>>>> diff --git a/fs/ubifs/lpt_commit.c b/fs/ubifs/lpt_commit.c index
>>>> 2df9130..61b2cc8 100644
>>>> --- a/fs/ubifs/lpt_commit.c
>>>> +++ b/fs/ubifs/lpt_commit.c
>>>> @@ -2039,4 +2039,25 @@ static int dbg_populate_lsave(struct
>>>> ubifs_info
>>>> *c)
>>>>
>>>>      return 1;
>>>>    }
>>>> +#else
>>>> +
>>>> +int dbg_chk_lpt_free_spc(struct ubifs_info *c) {
>>>> +   return 0;
>>>> +}
>>>> +
>>>> +int dbg_check_ltab(struct ubifs_info *c) {
>>>> +   return 0;
>>>> +}
>>>> +
>>>> +int dbg_chk_lpt_sz(struct ubifs_info *c, int action, int len) {
>>>> +   return 0;
>>>> +}
>>>> +
>>>> +void ubifs_dump_lpt_lebs(const struct ubifs_info *c) { }
>>>> +
>>>>    #endif
>>>>
>>>
>>> --
>>> DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
>>> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
>>>
>
diff mbox

Patch

diff --git a/arch/microblaze/include/asm/atomic.h b/arch/microblaze/include/asm/atomic.h
new file mode 100644
index 0000000..2872149
--- /dev/null
+++ b/arch/microblaze/include/asm/atomic.h
@@ -0,0 +1,114 @@ 
+/*
+ *  linux/include/asm-arm/atomic.h
+ *
+ *  Copyright (c) 1996 Russell King.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  Changelog:
+ *   27-06-1996	RMK	Created
+ *   13-04-1997	RMK	Made functions atomic!
+ *   07-12-1997	RMK	Upgraded for v2.1.
+ *   26-08-1998	PJB	Added #ifdef __KERNEL__
+ */
+#ifndef __ASM_ARM_ATOMIC_H
+#define __ASM_ARM_ATOMIC_H
+
+#ifdef CONFIG_SMP
+#error SMP not supported
+#endif
+
+typedef struct { volatile int counter; } atomic_t;
+
+#define ATOMIC_INIT(i)	{ (i) }
+
+#ifdef __KERNEL__
+#include <asm/system.h>
+
+#define atomic_read(v)	((v)->counter)
+#define atomic_set(v,i)	(((v)->counter) = (i))
+
+
+
+
+static inline void atomic_add(int i, volatile atomic_t *v)
+{
+	unsigned long flags = 0;
+
+	local_irq_save(flags);
+	v->counter += i;
+	local_irq_restore(flags);
+}
+
+static inline void atomic_sub(int i, volatile atomic_t *v)
+{
+	unsigned long flags = 0;
+
+	local_irq_save(flags);
+	v->counter -= i;
+	local_irq_restore(flags);
+}
+
+static inline void atomic_inc(volatile atomic_t *v)
+{
+	unsigned long flags = 0;
+
+	local_irq_save(flags);
+	v->counter += 1;
+	local_irq_restore(flags);
+}
+
+static inline void atomic_dec(volatile atomic_t *v)
+{
+	unsigned long flags = 0;
+
+	local_irq_save(flags);
+	v->counter -= 1;
+	local_irq_restore(flags);
+}
+
+static inline int atomic_dec_and_test(volatile atomic_t *v)
+{
+	unsigned long flags = 0;
+	int val;
+
+	local_irq_save(flags);
+	val = v->counter;
+	v->counter = val -= 1;
+	local_irq_restore(flags);
+
+	return val == 0;
+}
+
+static inline int atomic_add_negative(int i, volatile atomic_t *v)
+{
+	unsigned long flags = 0;
+	int val;
+
+	local_irq_save(flags);
+	val = v->counter;
+	v->counter = val += i;
+	local_irq_restore(flags);
+
+	return val < 0;
+}
+
+static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
+{
+	unsigned long flags = 0;
+
+	local_irq_save(flags);
+	*addr &= ~mask;
+	local_irq_restore(flags);
+}
+
+/* Atomic operations are already serializing on ARM */
+#define smp_mb__before_atomic_dec()	barrier()
+#define smp_mb__after_atomic_dec()	barrier()
+#define smp_mb__before_atomic_inc()	barrier()
+#define smp_mb__after_atomic_inc()	barrier()
+
+#endif
+#endif
diff --git a/arch/microblaze/include/asm/bitops.h b/arch/microblaze/include/asm/bitops.h
index 2cab2ac..b3b17b9 100644
--- a/arch/microblaze/include/asm/bitops.h
+++ b/arch/microblaze/include/asm/bitops.h
@@ -204,10 +204,10 @@  static inline int __test_bit(int nr, volatile void *addr)
 	return ((mask & *a) != 0);
 }
 
-#define test_bit(nr,addr) \
-(__builtin_constant_p(nr) ? \
- __constant_test_bit((nr),(addr)) : \
- __test_bit((nr),(addr)))
+static inline int test_bit(int nr, const void * addr)
+{
+	return ((unsigned char *) addr)[nr >> 3] & (1U << (nr & 7));
+}
 
 #define find_first_zero_bit(addr, size) \
 	find_next_zero_bit((addr), (size), 0)
diff --git a/fs/ubifs/io.c b/fs/ubifs/io.c
index 51a95bb..685713e 100644
--- a/fs/ubifs/io.c
+++ b/fs/ubifs/io.c
@@ -847,6 +847,7 @@  out:
 	ubifs_dump_leb(c, wbuf->lnum);
 	return err;
 }
+#endif
 
 /**
  * ubifs_write_node - write node to the media.
@@ -885,7 +886,6 @@  int ubifs_write_node(struct ubifs_info *c, void *buf, int len, int lnum,
 
 	return err;
 }
-#endif
 
 /**
  * ubifs_read_node_wbuf - read node from the media or write-buffer.
diff --git a/fs/ubifs/log.c b/fs/ubifs/log.c
index a07fdef..10302b9 100644
--- a/fs/ubifs/log.c
+++ b/fs/ubifs/log.c
@@ -743,3 +743,102 @@  static int dbg_check_bud_bytes(struct ubifs_info *c)
 
 	return err;
 }
+
+
+/**
+ * ubifs_commit_required - set commit state to "required".
+ * @c: UBIFS file-system description object
+ *
+ * This function is called if a commit is required but cannot be done from the
+ * calling function, so it is just flagged instead.
+ */
+void ubifs_commit_required(struct ubifs_info *c)
+{
+	spin_lock(&c->cs_lock);
+	switch (c->cmt_state) {
+	case COMMIT_RESTING:
+	case COMMIT_BACKGROUND:
+		dbg_cmt("old: %s, new: %s", dbg_cstate(c->cmt_state),
+			dbg_cstate(COMMIT_REQUIRED));
+		c->cmt_state = COMMIT_REQUIRED;
+		break;
+	case COMMIT_RUNNING_BACKGROUND:
+		dbg_cmt("old: %s, new: %s", dbg_cstate(c->cmt_state),
+			dbg_cstate(COMMIT_RUNNING_REQUIRED));
+		c->cmt_state = COMMIT_RUNNING_REQUIRED;
+		break;
+	case COMMIT_REQUIRED:
+	case COMMIT_RUNNING_REQUIRED:
+	case COMMIT_BROKEN:
+		break;
+	}
+	spin_unlock(&c->cs_lock);
+}
+
+/**
+ * ubifs_write_master - write master node.
+ * @c: UBIFS file-system description object
+ *
+ * This function writes the master node. Returns zero in case of success and a
+ * negative error code in case of failure. The master node is written twice to
+ * enable recovery.
+ */
+int ubifs_write_master(struct ubifs_info *c)
+{
+	int err, lnum, offs, len;
+
+	ubifs_assert(!c->ro_media && !c->ro_mount);
+	if (c->ro_error)
+		return -EROFS;
+
+	lnum = UBIFS_MST_LNUM;
+	offs = c->mst_offs + c->mst_node_alsz;
+	len = UBIFS_MST_NODE_SZ;
+
+	if (offs + UBIFS_MST_NODE_SZ > c->leb_size) {
+		err = ubifs_leb_unmap(c, lnum);
+		if (err)
+			return err;
+		offs = 0;
+	}
+
+	c->mst_offs = offs;
+	c->mst_node->highest_inum = cpu_to_le64(c->highest_inum);
+
+	err = ubifs_write_node(c, c->mst_node, len, lnum, offs);
+	if (err)
+		return err;
+
+	lnum += 1;
+
+	if (offs == 0) {
+		err = ubifs_leb_unmap(c, lnum);
+		if (err)
+			return err;
+	}
+	err = ubifs_write_node(c, c->mst_node, len, lnum, offs);
+
+	return err;
+}
+
+/**
+ * ubifs_request_bg_commit - notify the background thread to do a commit.
+ * @c: UBIFS file-system description object
+ *
+ * This function is called if the journal is full enough to make a commit
+ * worthwhile, so background thread is kicked to start it.
+ */
+void ubifs_request_bg_commit(struct ubifs_info *c)
+{
+	spin_lock(&c->cs_lock);
+	if (c->cmt_state == COMMIT_RESTING) {
+		dbg_cmt("old: %s, new: %s", dbg_cstate(c->cmt_state),
+			dbg_cstate(COMMIT_BACKGROUND));
+		c->cmt_state = COMMIT_BACKGROUND;
+		spin_unlock(&c->cs_lock);
+		ubifs_wake_up_bgt(c);
+	} else
+		spin_unlock(&c->cs_lock);
+}
+
+
diff --git a/fs/ubifs/lpt_commit.c b/fs/ubifs/lpt_commit.c
index 2df9130..61b2cc8 100644
--- a/fs/ubifs/lpt_commit.c
+++ b/fs/ubifs/lpt_commit.c
@@ -2039,4 +2039,25 @@  static int dbg_populate_lsave(struct ubifs_info *c)
 
 	return 1;
 }
+#else
+
+int dbg_chk_lpt_free_spc(struct ubifs_info *c)
+{
+	return 0;
+}
+
+int dbg_check_ltab(struct ubifs_info *c)
+{
+	return 0;
+}
+
+int dbg_chk_lpt_sz(struct ubifs_info *c, int action, int len)
+{
+	return 0;
+}
+
+void ubifs_dump_lpt_lebs(const struct ubifs_info *c)
+{
+}
+
 #endif