Skip to contentSkip to conversation

Enable journal replay for UBIFS

PATCH Superseded Anton Habegger 2 participants 3 messages Jan 21, 2015 – Jan 22, 2015

lore
Share & tools
lore
#0 lore raw

PATCH v3 1/2 Enable journal replay for UBIFS

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.

#1 lore raw

PATCH v3 1/2 Enable journal replay for UBIFS

Hello Anton,

Am 21.01.2015 16:47, schrieb Anton Habegger:

Quoted 5 lines

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 ...

Quoted 7 lines
Quoted 3 lines

From fd0a1377825638d15bc66b5f07a05beb14fe747c Mon Sep 17 00:00:00 2001

From: Anton Habegger <[email protected]>
Date: Wed, 21 Jan 2015 16:20:36 +0100
Subject: [PATCH] ubifs: Import atomic_long operations from Linux

Quoted 8 lines

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.

Quoted 96 lines

This commit is a preperation for a subsequent UBIFS commit which needs such atomic_long operations

---
  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

fs/ubifs/ubifs.c +6 -0
index 49e6f46..6dd6174 100644
@@ -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
 
  /**
fs/ubifs/ubifs.h +2 -10
index c120261..a51b237 100644
@@ -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
include/asm-generic/atomic-long.h new file +31 -0
new file mode 100644
index 0000000..61011ed
@@ -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);

include/asm-generic/atomic-long.h line 41

Quoted 10 lines
include/asm-generic/atomic-long.h new file +10 -0
+}
+
+#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

Quoted 242 lines
include/asm-generic/atomic-long.h new file +229 -0
+
+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  */
include/linux/compat.h +0 -1
index b40133c..6eac17f 100644
@@ -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
Signature · 2 lines
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
#2 lore raw

PATCH v3 1/2 Enable journal replay for UBIFS

Hello Heiko

Quoted 28 lines · Heiko Schocher

Hello Anton,

Am 21.01.2015 16:47, schrieb Anton Habegger:

Quoted 6 lines

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 ...

Quoted 15 lines
Quoted 4 lines

From fd0a1377825638d15bc66b5f07a05beb14fe747c Mon Sep 17 00:00:00 2001

From: Anton Habegger <[email protected]>
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

Quoted 5 lines
Quoted 2 lines

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.

Quoted 111 lines
Quoted 111 lines

This commit is a preperation for a subsequent UBIFS commit which needs such atomic_long operations

---
  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

fs/ubifs/ubifs.c +6 -0
index 49e6f46..6dd6174 100644
@@ -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
 

/**

fs/ubifs/ubifs.h +2 -10
index c120261..a51b237 100644
@@ -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
include/asm-generic/atomic-long.h new file +7 -0
new file mode 100644
index 0000000..61011ed
@@ -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-generic/atomic-long.h new file +7 -0
+
+#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.
+ */

include/asm-generic/atomic-long.h new file +19 -0
+
+#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;
+
Quoted 8 lines

include/asm-generic/atomic-long.h

Quoted 3 lines
include/asm-generic/atomic-long.h new file +3 -0
+       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

Quoted 257 lines

Thanks!

bye,
Heiko

Quoted 243 lines
include/asm-generic/atomic-long.h new file +89 -0
+
+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)

include/asm-generic/atomic-long.h new file +7 -0
+{
+       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))

include/asm-generic/atomic-long.h new file +116 -0
+
+#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)

include/asm-generic/atomic-long.h new file +17 -0
+{
+       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  */
include/linux/compat.h +0 -1
index b40133c..6eac17f 100644
@@ -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
Quoted 3 lines

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