Message ID | 20150121154744.GA30163@chhabea-vm-machine |
---|---|
State | Superseded |
Delegated to: | Heiko Schocher |
Headers | show |
Hello Anton, Am 21.01.2015 16:47, schrieb Anton Habegger: > Hello Heiko > > Here the second patch you want. This needs to be applied > prior the real bug fix, becouse it solves the warning as > you mention as well. Thanks, I added Albert Aribaud to Cc, as he is the arm custodian, and please add such comments under a "---" line ... > > >>From fd0a1377825638d15bc66b5f07a05beb14fe747c Mon Sep 17 00:00:00 2001 > From: Anton Habegger <anton.habegger@delta-es.com> > Date: Wed, 21 Jan 2015 16:20:36 +0100 > Subject: [PATCH] ubifs: Import atomic_long operations from Linux > > The following operations are imported from Linux: > - atomic_long_read > - atomic_long_inc > - atomic_long_dec > - atomic_long_sub > > Therefor "include/asm-generic/atomic-long.h" is imported > from Linux 3.15 add please the commit id also here, thanks. > This commit is a preperation for a subsequent UBIFS commit > which needs such atomic_long operations > > Signed-off-by: Anton Habegger <anton.habegger@delta-es.com> > --- > fs/ubifs/ubifs.c | 6 + > fs/ubifs/ubifs.h | 12 +- > include/asm-generic/atomic-long.h | 270 ++++++++++++++++++++++++++++++++++++++ > include/linux/compat.h | 1 - > 4 files changed, 278 insertions(+), 11 deletions(-) > create mode 100644 include/asm-generic/atomic-long.h > > diff --git a/fs/ubifs/ubifs.c b/fs/ubifs/ubifs.c > index 49e6f46..6dd6174 100644 > --- a/fs/ubifs/ubifs.c > +++ b/fs/ubifs/ubifs.c > @@ -150,6 +150,12 @@ static inline int crypto_comp_decompress(struct crypto_comp *tfm, > > return 0; > } > + > +/* from shrinker.c */ > + > +/* Global clean znode counter (for all mounted UBIFS instances) */ > +atomic_long_t ubifs_clean_zn_cnt; > + > #endif > > /** > diff --git a/fs/ubifs/ubifs.h b/fs/ubifs/ubifs.h > index c120261..a51b237 100644 > --- a/fs/ubifs/ubifs.h > +++ b/fs/ubifs/ubifs.h > @@ -31,6 +31,8 @@ > #include <linux/backing-dev.h> > #include "ubifs-media.h" > #else > +#include <asm/atomic.h> > +#include <asm-generic/atomic-long.h> > #include <ubi_uboot.h> > > #include <linux/ctype.h> > @@ -63,16 +65,6 @@ struct page { > > void iput(struct inode *inode); > > -/* > - * The atomic operations are used for budgeting etc which is not > - * needed for the read-only U-Boot implementation: > - */ > -#define atomic_long_inc(a) > -#define atomic_long_dec(a) > -#define atomic_long_sub(a, b) > - > -typedef unsigned long atomic_long_t; > - > /* linux/include/time.h */ > #define NSEC_PER_SEC 1000000000L > #define get_seconds() 0 > diff --git a/include/asm-generic/atomic-long.h b/include/asm-generic/atomic-long.h > new file mode 100644 > index 0000000..61011ed > --- /dev/null > +++ b/include/asm-generic/atomic-long.h > @@ -0,0 +1,270 @@ > +#ifndef _ASM_GENERIC_ATOMIC_LONG_H > +#define _ASM_GENERIC_ATOMIC_LONG_H > +/* > + * Copyright (C) 2005 Silicon Graphics, Inc. > + * Christoph Lameter > + * > + * Allows to provide arch independent atomic definitions without the need to > + * edit all arch specific atomic.h files. > + */ > + > +#include <asm/types.h> > + > +/* > + * Suppport for atomic_long_t > + * > + * Casts for parameters are avoided for existing atomic functions in order to > + * avoid issues with cast-as-lval under gcc 4.x and other limitations that the > + * macros of a platform may have. > + */ > + > +#if BITS_PER_LONG == 64 > + > +typedef atomic64_t atomic_long_t; > + > +#define ATOMIC_LONG_INIT(i) ATOMIC64_INIT(i) > + > +static inline long atomic_long_read(atomic_long_t *l) > +{ > + atomic64_t *v = (atomic64_t *)l; > + > + return (long)atomic64_read(v); > +} > + > +#ifndef __UBOOT__ > +static inline void atomic_long_set(atomic_long_t *l, long i) > +{ > + atomic64_t *v = (atomic64_t *)l; > + > + atomic64_set(v, i); > +} > +#endif Do we really need to ifdef out the most functions? Could you compile without this "#ifndef __UBOOT__" and copmpare the resulting binarysize? Thanks! bye, Heiko > + > +static inline void atomic_long_inc(atomic_long_t *l) > +{ > + atomic64_t *v = (atomic64_t *)l; > + > + atomic64_inc(v); > +} > + > +static inline void atomic_long_dec(atomic_long_t *l) > +{ > + atomic64_t *v = (atomic64_t *)l; > + > + atomic64_dec(v); > +} > + > +#ifndef __UBOOT__ > +static inline void atomic_long_add(long i, atomic_long_t *l) > +{ > + atomic64_t *v = (atomic64_t *)l; > + > + atomic64_add(i, v); > +} > +#endif > + > +static inline void atomic_long_sub(long i, atomic_long_t *l) > +{ > + atomic64_t *v = (atomic64_t *)l; > + > + atomic64_sub(i, v); > +} > + > +#ifndef __UBOOT__ > +static inline int atomic_long_sub_and_test(long i, atomic_long_t *l) > +{ > + atomic64_t *v = (atomic64_t *)l; > + > + return atomic64_sub_and_test(i, v); > +} > + > +static inline int atomic_long_dec_and_test(atomic_long_t *l) > +{ > + atomic64_t *v = (atomic64_t *)l; > + > + return atomic64_dec_and_test(v); > +} > + > +static inline int atomic_long_inc_and_test(atomic_long_t *l) > +{ > + atomic64_t *v = (atomic64_t *)l; > + > + return atomic64_inc_and_test(v); > +} > + > +static inline int atomic_long_add_negative(long i, atomic_long_t *l) > +{ > + atomic64_t *v = (atomic64_t *)l; > + > + return atomic64_add_negative(i, v); > +} > + > +static inline long atomic_long_add_return(long i, atomic_long_t *l) > +{ > + atomic64_t *v = (atomic64_t *)l; > + > + return (long)atomic64_add_return(i, v); > +} > + > +static inline long atomic_long_sub_return(long i, atomic_long_t *l) > +{ > + atomic64_t *v = (atomic64_t *)l; > + > + return (long)atomic64_sub_return(i, v); > +} > + > +static inline long atomic_long_inc_return(atomic_long_t *l) > +{ > + atomic64_t *v = (atomic64_t *)l; > + > + return (long)atomic64_inc_return(v); > +} > + > +static inline long atomic_long_dec_return(atomic_long_t *l) > +{ > + atomic64_t *v = (atomic64_t *)l; > + > + return (long)atomic64_dec_return(v); > +} > + > +static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u) > +{ > + atomic64_t *v = (atomic64_t *)l; > + > + return (long)atomic64_add_unless(v, a, u); > +} > + > +#define atomic_long_inc_not_zero(l) atomic64_inc_not_zero((atomic64_t *)(l)) > + > +#define atomic_long_cmpxchg(l, old, new) \ > + (atomic64_cmpxchg((atomic64_t *)(l), (old), (new))) > +#define atomic_long_xchg(v, new) \ > + (atomic64_xchg((atomic64_t *)(v), (new))) > +#endif /* __UBOOT__ */ > + > +#else /* BITS_PER_LONG == 64 */ > + > +typedef atomic_t atomic_long_t; > + > +#define ATOMIC_LONG_INIT(i) ATOMIC_INIT(i) > +static inline long atomic_long_read(atomic_long_t *l) > +{ > + atomic_t *v = (atomic_t *)l; > + > + return (long)atomic_read(v); > +} > + > +#ifndef __UBOOT__ > +static inline void atomic_long_set(atomic_long_t *l, long i) > +{ > + atomic_t *v = (atomic_t *)l; > + > + atomic_set(v, i); > +} > +#endif > + > +static inline void atomic_long_inc(atomic_long_t *l) > +{ > + atomic_t *v = (atomic_t *)l; > + > + atomic_inc(v); > +} > + > +static inline void atomic_long_dec(atomic_long_t *l) > +{ > + atomic_t *v = (atomic_t *)l; > + > + atomic_dec(v); > +} > + > +#ifndef __UBOOT__ > +static inline void atomic_long_add(long i, atomic_long_t *l) > +{ > + atomic_t *v = (atomic_t *)l; > + > + atomic_add(i, v); > +} > +#endif > + > +static inline void atomic_long_sub(long i, atomic_long_t *l) > +{ > + atomic_t *v = (atomic_t *)l; > + > + atomic_sub(i, v); > +} > + > +#ifndef __UBOOT__ > +static inline int atomic_long_sub_and_test(long i, atomic_long_t *l) > +{ > + atomic_t *v = (atomic_t *)l; > + > + return atomic_sub_and_test(i, v); > +} > + > +static inline int atomic_long_dec_and_test(atomic_long_t *l) > +{ > + atomic_t *v = (atomic_t *)l; > + > + return atomic_dec_and_test(v); > +} > + > +static inline int atomic_long_inc_and_test(atomic_long_t *l) > +{ > + atomic_t *v = (atomic_t *)l; > + > + return atomic_inc_and_test(v); > +} > + > +static inline int atomic_long_add_negative(long i, atomic_long_t *l) > +{ > + atomic_t *v = (atomic_t *)l; > + > + return atomic_add_negative(i, v); > +} > + > +static inline long atomic_long_add_return(long i, atomic_long_t *l) > +{ > + atomic_t *v = (atomic_t *)l; > + > + return (long)atomic_add_return(i, v); > +} > + > +static inline long atomic_long_sub_return(long i, atomic_long_t *l) > +{ > + atomic_t *v = (atomic_t *)l; > + > + return (long)atomic_sub_return(i, v); > +} > + > +static inline long atomic_long_inc_return(atomic_long_t *l) > +{ > + atomic_t *v = (atomic_t *)l; > + > + return (long)atomic_inc_return(v); > +} > + > +static inline long atomic_long_dec_return(atomic_long_t *l) > +{ > + atomic_t *v = (atomic_t *)l; > + > + return (long)atomic_dec_return(v); > +} > + > +static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u) > +{ > + atomic_t *v = (atomic_t *)l; > + > + return (long)atomic_add_unless(v, a, u); > +} > + > +#define atomic_long_inc_not_zero(l) atomic_inc_not_zero((atomic_t *)(l)) > + > +#define atomic_long_cmpxchg(l, old, new) \ > + (atomic_cmpxchg((atomic_t *)(l), (old), (new))) > +#define atomic_long_xchg(v, new) \ > + (atomic_xchg((atomic_t *)(v), (new))) > +#endif /* __UBOOT__ */ > + > +#endif /* BITS_PER_LONG == 64 */ > + > +#endif /* _ASM_GENERIC_ATOMIC_LONG_H */ > diff --git a/include/linux/compat.h b/include/linux/compat.h > index b40133c..6eac17f 100644 > --- a/include/linux/compat.h > +++ b/include/linux/compat.h > @@ -262,7 +262,6 @@ typedef struct { > > /* from include/linux/types.h */ > > -typedef int atomic_t; > /** > * struct callback_head - callback structure for use with RCU and task_work > * @next: next update requests in a list >
Hello Heiko On Thu, Jan 22, 2015 at 7:30 AM, Heiko Schocher <hs@denx.de> wrote: > Hello Anton, > > Am 21.01.2015 16:47, schrieb Anton Habegger: >> >> Hello Heiko >> >> Here the second patch you want. This needs to be applied >> prior the real bug fix, becouse it solves the warning as >> you mention as well. > > > Thanks, I added Albert Aribaud to Cc, as he is the arm custodian, > and please add such comments under a "---" line ... >> >> >> >>> From fd0a1377825638d15bc66b5f07a05beb14fe747c Mon Sep 17 00:00:00 2001 >> >> From: Anton Habegger <anton.habegger@delta-es.com> >> Date: Wed, 21 Jan 2015 16:20:36 +0100 >> Subject: [PATCH] ubifs: Import atomic_long operations from Linux >> >> The following operations are imported from Linux: >> - atomic_long_read >> - atomic_long_inc >> - atomic_long_dec >> - atomic_long_sub >> >> Therefor "include/asm-generic/atomic-long.h" is imported >> from Linux 3.15 > > > add please the commit id also here, thanks. OK, I will do it in the next version. > > >> This commit is a preperation for a subsequent UBIFS commit >> which needs such atomic_long operations >> >> Signed-off-by: Anton Habegger <anton.habegger@delta-es.com> >> --- >> fs/ubifs/ubifs.c | 6 + >> fs/ubifs/ubifs.h | 12 +- >> include/asm-generic/atomic-long.h | 270 >> ++++++++++++++++++++++++++++++++++++++ >> include/linux/compat.h | 1 - >> 4 files changed, 278 insertions(+), 11 deletions(-) >> create mode 100644 include/asm-generic/atomic-long.h >> >> diff --git a/fs/ubifs/ubifs.c b/fs/ubifs/ubifs.c >> index 49e6f46..6dd6174 100644 >> --- a/fs/ubifs/ubifs.c >> +++ b/fs/ubifs/ubifs.c >> @@ -150,6 +150,12 @@ static inline int crypto_comp_decompress(struct >> crypto_comp *tfm, >> >> return 0; >> } >> + >> +/* from shrinker.c */ >> + >> +/* Global clean znode counter (for all mounted UBIFS instances) */ >> +atomic_long_t ubifs_clean_zn_cnt; >> + >> #endif >> >> /** >> diff --git a/fs/ubifs/ubifs.h b/fs/ubifs/ubifs.h >> index c120261..a51b237 100644 >> --- a/fs/ubifs/ubifs.h >> +++ b/fs/ubifs/ubifs.h >> @@ -31,6 +31,8 @@ >> #include <linux/backing-dev.h> >> #include "ubifs-media.h" >> #else >> +#include <asm/atomic.h> >> +#include <asm-generic/atomic-long.h> >> #include <ubi_uboot.h> >> >> #include <linux/ctype.h> >> @@ -63,16 +65,6 @@ struct page { >> >> void iput(struct inode *inode); >> >> -/* >> - * The atomic operations are used for budgeting etc which is not >> - * needed for the read-only U-Boot implementation: >> - */ >> -#define atomic_long_inc(a) >> -#define atomic_long_dec(a) >> -#define atomic_long_sub(a, b) >> - >> -typedef unsigned long atomic_long_t; >> - >> /* linux/include/time.h */ >> #define NSEC_PER_SEC 1000000000L >> #define get_seconds() 0 >> diff --git a/include/asm-generic/atomic-long.h >> b/include/asm-generic/atomic-long.h >> new file mode 100644 >> index 0000000..61011ed >> --- /dev/null >> +++ b/include/asm-generic/atomic-long.h >> @@ -0,0 +1,270 @@ >> +#ifndef _ASM_GENERIC_ATOMIC_LONG_H >> +#define _ASM_GENERIC_ATOMIC_LONG_H >> +/* >> + * Copyright (C) 2005 Silicon Graphics, Inc. >> + * Christoph Lameter >> + * >> + * Allows to provide arch independent atomic definitions without the need >> to >> + * edit all arch specific atomic.h files. >> + */ >> + >> +#include <asm/types.h> >> + >> +/* >> + * Suppport for atomic_long_t >> + * >> + * Casts for parameters are avoided for existing atomic functions in >> order to >> + * avoid issues with cast-as-lval under gcc 4.x and other limitations >> that the >> + * macros of a platform may have. >> + */ >> + >> +#if BITS_PER_LONG == 64 >> + >> +typedef atomic64_t atomic_long_t; >> + >> +#define ATOMIC_LONG_INIT(i) ATOMIC64_INIT(i) >> + >> +static inline long atomic_long_read(atomic_long_t *l) >> +{ >> + atomic64_t *v = (atomic64_t *)l; >> + >> + return (long)atomic64_read(v); >> +} >> + >> +#ifndef __UBOOT__ >> +static inline void atomic_long_set(atomic_long_t *l, long i) >> +{ >> + atomic64_t *v = (atomic64_t *)l; >> + >> + atomic64_set(v, i); >> +} >> +#endif > > > Do we really need to ifdef out the most functions? Could you > compile without this "#ifndef __UBOOT__" and copmpare the > resulting binarysize? I got implicit declarations: In file included from fs/ubifs/ubifs.h:35, from fs/ubifs/gc.c:60: include/asm-generic/atomic-long.h: In function 'atomic_long_inc_and_test': include/asm-generic/atomic-long.h:203: warning: implicit declaration of function 'atomic_inc_and_test' include/asm-generic/atomic-long.h: In function 'atomic_long_add_negative': include/asm-generic/atomic-long.h:210: warning: implicit declaration of function 'atomic_add_negative' include/asm-generic/atomic-long.h: In function 'atomic_long_add_unless': include/asm-generic/atomic-long.h:245: warning: implicit declaration of function 'atomic_add_unless' I would need to import include/asm-generic/atomic.h as well. If I do then a bunch of other definitions are missing. My feeling is, it getting much harder to adapt include/asm-generic/atomic.h instead of include/asm-generic/atomic-long.h Should I do it anyway? Thank you BR Anton > > Thanks! > > bye, > Heiko > > >> + >> +static inline void atomic_long_inc(atomic_long_t *l) >> +{ >> + atomic64_t *v = (atomic64_t *)l; >> + >> + atomic64_inc(v); >> +} >> + >> +static inline void atomic_long_dec(atomic_long_t *l) >> +{ >> + atomic64_t *v = (atomic64_t *)l; >> + >> + atomic64_dec(v); >> +} >> + >> +#ifndef __UBOOT__ >> +static inline void atomic_long_add(long i, atomic_long_t *l) >> +{ >> + atomic64_t *v = (atomic64_t *)l; >> + >> + atomic64_add(i, v); >> +} >> +#endif >> + >> +static inline void atomic_long_sub(long i, atomic_long_t *l) >> +{ >> + atomic64_t *v = (atomic64_t *)l; >> + >> + atomic64_sub(i, v); >> +} >> + >> +#ifndef __UBOOT__ >> +static inline int atomic_long_sub_and_test(long i, atomic_long_t *l) >> +{ >> + atomic64_t *v = (atomic64_t *)l; >> + >> + return atomic64_sub_and_test(i, v); >> +} >> + >> +static inline int atomic_long_dec_and_test(atomic_long_t *l) >> +{ >> + atomic64_t *v = (atomic64_t *)l; >> + >> + return atomic64_dec_and_test(v); >> +} >> + >> +static inline int atomic_long_inc_and_test(atomic_long_t *l) >> +{ >> + atomic64_t *v = (atomic64_t *)l; >> + >> + return atomic64_inc_and_test(v); >> +} >> + >> +static inline int atomic_long_add_negative(long i, atomic_long_t *l) >> +{ >> + atomic64_t *v = (atomic64_t *)l; >> + >> + return atomic64_add_negative(i, v); >> +} >> + >> +static inline long atomic_long_add_return(long i, atomic_long_t *l) >> +{ >> + atomic64_t *v = (atomic64_t *)l; >> + >> + return (long)atomic64_add_return(i, v); >> +} >> + >> +static inline long atomic_long_sub_return(long i, atomic_long_t *l) >> +{ >> + atomic64_t *v = (atomic64_t *)l; >> + >> + return (long)atomic64_sub_return(i, v); >> +} >> + >> +static inline long atomic_long_inc_return(atomic_long_t *l) >> +{ >> + atomic64_t *v = (atomic64_t *)l; >> + >> + return (long)atomic64_inc_return(v); >> +} >> + >> +static inline long atomic_long_dec_return(atomic_long_t *l) >> +{ >> + atomic64_t *v = (atomic64_t *)l; >> + >> + return (long)atomic64_dec_return(v); >> +} >> + >> +static inline long atomic_long_add_unless(atomic_long_t *l, long a, long >> u) >> +{ >> + atomic64_t *v = (atomic64_t *)l; >> + >> + return (long)atomic64_add_unless(v, a, u); >> +} >> + >> +#define atomic_long_inc_not_zero(l) atomic64_inc_not_zero((atomic64_t >> *)(l)) >> + >> +#define atomic_long_cmpxchg(l, old, new) \ >> + (atomic64_cmpxchg((atomic64_t *)(l), (old), (new))) >> +#define atomic_long_xchg(v, new) \ >> + (atomic64_xchg((atomic64_t *)(v), (new))) >> +#endif /* __UBOOT__ */ >> + >> +#else /* BITS_PER_LONG == 64 */ >> + >> +typedef atomic_t atomic_long_t; >> + >> +#define ATOMIC_LONG_INIT(i) ATOMIC_INIT(i) >> +static inline long atomic_long_read(atomic_long_t *l) >> +{ >> + atomic_t *v = (atomic_t *)l; >> + >> + return (long)atomic_read(v); >> +} >> + >> +#ifndef __UBOOT__ >> +static inline void atomic_long_set(atomic_long_t *l, long i) >> +{ >> + atomic_t *v = (atomic_t *)l; >> + >> + atomic_set(v, i); >> +} >> +#endif >> + >> +static inline void atomic_long_inc(atomic_long_t *l) >> +{ >> + atomic_t *v = (atomic_t *)l; >> + >> + atomic_inc(v); >> +} >> + >> +static inline void atomic_long_dec(atomic_long_t *l) >> +{ >> + atomic_t *v = (atomic_t *)l; >> + >> + atomic_dec(v); >> +} >> + >> +#ifndef __UBOOT__ >> +static inline void atomic_long_add(long i, atomic_long_t *l) >> +{ >> + atomic_t *v = (atomic_t *)l; >> + >> + atomic_add(i, v); >> +} >> +#endif >> + >> +static inline void atomic_long_sub(long i, atomic_long_t *l) >> +{ >> + atomic_t *v = (atomic_t *)l; >> + >> + atomic_sub(i, v); >> +} >> + >> +#ifndef __UBOOT__ >> +static inline int atomic_long_sub_and_test(long i, atomic_long_t *l) >> +{ >> + atomic_t *v = (atomic_t *)l; >> + >> + return atomic_sub_and_test(i, v); >> +} >> + >> +static inline int atomic_long_dec_and_test(atomic_long_t *l) >> +{ >> + atomic_t *v = (atomic_t *)l; >> + >> + return atomic_dec_and_test(v); >> +} >> + >> +static inline int atomic_long_inc_and_test(atomic_long_t *l) >> +{ >> + atomic_t *v = (atomic_t *)l; >> + >> + return atomic_inc_and_test(v); >> +} >> + >> +static inline int atomic_long_add_negative(long i, atomic_long_t *l) >> +{ >> + atomic_t *v = (atomic_t *)l; >> + >> + return atomic_add_negative(i, v); >> +} >> + >> +static inline long atomic_long_add_return(long i, atomic_long_t *l) >> +{ >> + atomic_t *v = (atomic_t *)l; >> + >> + return (long)atomic_add_return(i, v); >> +} >> + >> +static inline long atomic_long_sub_return(long i, atomic_long_t *l) >> +{ >> + atomic_t *v = (atomic_t *)l; >> + >> + return (long)atomic_sub_return(i, v); >> +} >> + >> +static inline long atomic_long_inc_return(atomic_long_t *l) >> +{ >> + atomic_t *v = (atomic_t *)l; >> + >> + return (long)atomic_inc_return(v); >> +} >> + >> +static inline long atomic_long_dec_return(atomic_long_t *l) >> +{ >> + atomic_t *v = (atomic_t *)l; >> + >> + return (long)atomic_dec_return(v); >> +} >> + >> +static inline long atomic_long_add_unless(atomic_long_t *l, long a, long >> u) >> +{ >> + atomic_t *v = (atomic_t *)l; >> + >> + return (long)atomic_add_unless(v, a, u); >> +} >> + >> +#define atomic_long_inc_not_zero(l) atomic_inc_not_zero((atomic_t *)(l)) >> + >> +#define atomic_long_cmpxchg(l, old, new) \ >> + (atomic_cmpxchg((atomic_t *)(l), (old), (new))) >> +#define atomic_long_xchg(v, new) \ >> + (atomic_xchg((atomic_t *)(v), (new))) >> +#endif /* __UBOOT__ */ >> + >> +#endif /* BITS_PER_LONG == 64 */ >> + >> +#endif /* _ASM_GENERIC_ATOMIC_LONG_H */ >> diff --git a/include/linux/compat.h b/include/linux/compat.h >> index b40133c..6eac17f 100644 >> --- a/include/linux/compat.h >> +++ b/include/linux/compat.h >> @@ -262,7 +262,6 @@ typedef struct { >> >> /* from include/linux/types.h */ >> >> -typedef int atomic_t; >> /** >> * struct callback_head - callback structure for use with RCU and >> task_work >> * @next: next update requests in a list >> > > -- > DENX Software Engineering GmbH, Managing Director: Wolfgang Denk > HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
diff --git a/fs/ubifs/ubifs.c b/fs/ubifs/ubifs.c index 49e6f46..6dd6174 100644 --- a/fs/ubifs/ubifs.c +++ b/fs/ubifs/ubifs.c @@ -150,6 +150,12 @@ static inline int crypto_comp_decompress(struct crypto_comp *tfm, return 0; } + +/* from shrinker.c */ + +/* Global clean znode counter (for all mounted UBIFS instances) */ +atomic_long_t ubifs_clean_zn_cnt; + #endif /** diff --git a/fs/ubifs/ubifs.h b/fs/ubifs/ubifs.h index c120261..a51b237 100644 --- a/fs/ubifs/ubifs.h +++ b/fs/ubifs/ubifs.h @@ -31,6 +31,8 @@ #include <linux/backing-dev.h> #include "ubifs-media.h" #else +#include <asm/atomic.h> +#include <asm-generic/atomic-long.h> #include <ubi_uboot.h> #include <linux/ctype.h> @@ -63,16 +65,6 @@ struct page { void iput(struct inode *inode); -/* - * The atomic operations are used for budgeting etc which is not - * needed for the read-only U-Boot implementation: - */ -#define atomic_long_inc(a) -#define atomic_long_dec(a) -#define atomic_long_sub(a, b) - -typedef unsigned long atomic_long_t; - /* linux/include/time.h */ #define NSEC_PER_SEC 1000000000L #define get_seconds() 0 diff --git a/include/asm-generic/atomic-long.h b/include/asm-generic/atomic-long.h new file mode 100644 index 0000000..61011ed --- /dev/null +++ b/include/asm-generic/atomic-long.h @@ -0,0 +1,270 @@ +#ifndef _ASM_GENERIC_ATOMIC_LONG_H +#define _ASM_GENERIC_ATOMIC_LONG_H +/* + * Copyright (C) 2005 Silicon Graphics, Inc. + * Christoph Lameter + * + * Allows to provide arch independent atomic definitions without the need to + * edit all arch specific atomic.h files. + */ + +#include <asm/types.h> + +/* + * Suppport for atomic_long_t + * + * Casts for parameters are avoided for existing atomic functions in order to + * avoid issues with cast-as-lval under gcc 4.x and other limitations that the + * macros of a platform may have. + */ + +#if BITS_PER_LONG == 64 + +typedef atomic64_t atomic_long_t; + +#define ATOMIC_LONG_INIT(i) ATOMIC64_INIT(i) + +static inline long atomic_long_read(atomic_long_t *l) +{ + atomic64_t *v = (atomic64_t *)l; + + return (long)atomic64_read(v); +} + +#ifndef __UBOOT__ +static inline void atomic_long_set(atomic_long_t *l, long i) +{ + atomic64_t *v = (atomic64_t *)l; + + atomic64_set(v, i); +} +#endif + +static inline void atomic_long_inc(atomic_long_t *l) +{ + atomic64_t *v = (atomic64_t *)l; + + atomic64_inc(v); +} + +static inline void atomic_long_dec(atomic_long_t *l) +{ + atomic64_t *v = (atomic64_t *)l; + + atomic64_dec(v); +} + +#ifndef __UBOOT__ +static inline void atomic_long_add(long i, atomic_long_t *l) +{ + atomic64_t *v = (atomic64_t *)l; + + atomic64_add(i, v); +} +#endif + +static inline void atomic_long_sub(long i, atomic_long_t *l) +{ + atomic64_t *v = (atomic64_t *)l; + + atomic64_sub(i, v); +} + +#ifndef __UBOOT__ +static inline int atomic_long_sub_and_test(long i, atomic_long_t *l) +{ + atomic64_t *v = (atomic64_t *)l; + + return atomic64_sub_and_test(i, v); +} + +static inline int atomic_long_dec_and_test(atomic_long_t *l) +{ + atomic64_t *v = (atomic64_t *)l; + + return atomic64_dec_and_test(v); +} + +static inline int atomic_long_inc_and_test(atomic_long_t *l) +{ + atomic64_t *v = (atomic64_t *)l; + + return atomic64_inc_and_test(v); +} + +static inline int atomic_long_add_negative(long i, atomic_long_t *l) +{ + atomic64_t *v = (atomic64_t *)l; + + return atomic64_add_negative(i, v); +} + +static inline long atomic_long_add_return(long i, atomic_long_t *l) +{ + atomic64_t *v = (atomic64_t *)l; + + return (long)atomic64_add_return(i, v); +} + +static inline long atomic_long_sub_return(long i, atomic_long_t *l) +{ + atomic64_t *v = (atomic64_t *)l; + + return (long)atomic64_sub_return(i, v); +} + +static inline long atomic_long_inc_return(atomic_long_t *l) +{ + atomic64_t *v = (atomic64_t *)l; + + return (long)atomic64_inc_return(v); +} + +static inline long atomic_long_dec_return(atomic_long_t *l) +{ + atomic64_t *v = (atomic64_t *)l; + + return (long)atomic64_dec_return(v); +} + +static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u) +{ + atomic64_t *v = (atomic64_t *)l; + + return (long)atomic64_add_unless(v, a, u); +} + +#define atomic_long_inc_not_zero(l) atomic64_inc_not_zero((atomic64_t *)(l)) + +#define atomic_long_cmpxchg(l, old, new) \ + (atomic64_cmpxchg((atomic64_t *)(l), (old), (new))) +#define atomic_long_xchg(v, new) \ + (atomic64_xchg((atomic64_t *)(v), (new))) +#endif /* __UBOOT__ */ + +#else /* BITS_PER_LONG == 64 */ + +typedef atomic_t atomic_long_t; + +#define ATOMIC_LONG_INIT(i) ATOMIC_INIT(i) +static inline long atomic_long_read(atomic_long_t *l) +{ + atomic_t *v = (atomic_t *)l; + + return (long)atomic_read(v); +} + +#ifndef __UBOOT__ +static inline void atomic_long_set(atomic_long_t *l, long i) +{ + atomic_t *v = (atomic_t *)l; + + atomic_set(v, i); +} +#endif + +static inline void atomic_long_inc(atomic_long_t *l) +{ + atomic_t *v = (atomic_t *)l; + + atomic_inc(v); +} + +static inline void atomic_long_dec(atomic_long_t *l) +{ + atomic_t *v = (atomic_t *)l; + + atomic_dec(v); +} + +#ifndef __UBOOT__ +static inline void atomic_long_add(long i, atomic_long_t *l) +{ + atomic_t *v = (atomic_t *)l; + + atomic_add(i, v); +} +#endif + +static inline void atomic_long_sub(long i, atomic_long_t *l) +{ + atomic_t *v = (atomic_t *)l; + + atomic_sub(i, v); +} + +#ifndef __UBOOT__ +static inline int atomic_long_sub_and_test(long i, atomic_long_t *l) +{ + atomic_t *v = (atomic_t *)l; + + return atomic_sub_and_test(i, v); +} + +static inline int atomic_long_dec_and_test(atomic_long_t *l) +{ + atomic_t *v = (atomic_t *)l; + + return atomic_dec_and_test(v); +} + +static inline int atomic_long_inc_and_test(atomic_long_t *l) +{ + atomic_t *v = (atomic_t *)l; + + return atomic_inc_and_test(v); +} + +static inline int atomic_long_add_negative(long i, atomic_long_t *l) +{ + atomic_t *v = (atomic_t *)l; + + return atomic_add_negative(i, v); +} + +static inline long atomic_long_add_return(long i, atomic_long_t *l) +{ + atomic_t *v = (atomic_t *)l; + + return (long)atomic_add_return(i, v); +} + +static inline long atomic_long_sub_return(long i, atomic_long_t *l) +{ + atomic_t *v = (atomic_t *)l; + + return (long)atomic_sub_return(i, v); +} + +static inline long atomic_long_inc_return(atomic_long_t *l) +{ + atomic_t *v = (atomic_t *)l; + + return (long)atomic_inc_return(v); +} + +static inline long atomic_long_dec_return(atomic_long_t *l) +{ + atomic_t *v = (atomic_t *)l; + + return (long)atomic_dec_return(v); +} + +static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u) +{ + atomic_t *v = (atomic_t *)l; + + return (long)atomic_add_unless(v, a, u); +} + +#define atomic_long_inc_not_zero(l) atomic_inc_not_zero((atomic_t *)(l)) + +#define atomic_long_cmpxchg(l, old, new) \ + (atomic_cmpxchg((atomic_t *)(l), (old), (new))) +#define atomic_long_xchg(v, new) \ + (atomic_xchg((atomic_t *)(v), (new))) +#endif /* __UBOOT__ */ + +#endif /* BITS_PER_LONG == 64 */ + +#endif /* _ASM_GENERIC_ATOMIC_LONG_H */ diff --git a/include/linux/compat.h b/include/linux/compat.h index b40133c..6eac17f 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -262,7 +262,6 @@ typedef struct { /* from include/linux/types.h */ -typedef int atomic_t; /** * struct callback_head - callback structure for use with RCU and task_work * @next: next update requests in a list