diff mbox

[U-Boot,v3,1/2] Enable journal replay for UBIFS

Message ID 20150121154744.GA30163@chhabea-vm-machine
State Superseded
Delegated to: Heiko Schocher
Headers show

Commit Message

Anton Habegger Jan. 21, 2015, 3:47 p.m. UTC
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.


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

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

Comments

Heiko Schocher Jan. 22, 2015, 6:30 a.m. UTC | #1
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
>
Anton Habegger Jan. 22, 2015, 7:30 a.m. UTC | #2
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 mbox

Patch

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