[PATCH] Simplify some code to use the container_of() macro.
- From: "Robert P. J. Day" <rpjday@xxxxxxxxxxxxxx>
- Date: Sun, 31 Dec 2006 15:55:22 -0500 (EST)
Simplify a number of code snippets in source and header files to use
the kernel.h "container_of()" macro.
Signed-off-by: Robert P. J. Day <rpjday@xxxxxxxxxxxxxx>
---
and while we're at it, everybody can stop re-inventing the
container_of() macro. :-)
drivers/net/ppp_generic.c | 2 +-
drivers/s390/net/lcs.c | 6 ++----
drivers/video/sa1100fb.h | 4 +---
include/linux/security.h | 2 +-
net/ipv4/netfilter/nf_nat_core.c | 2 +-
security/selinux/hooks.c | 2 +-
6 files changed, 7 insertions(+), 11 deletions(-)
diff --git a/drivers/net/ppp_generic.c b/drivers/net/ppp_generic.c
index c6de566..0986f6c 100644
--- a/drivers/net/ppp_generic.c
+++ b/drivers/net/ppp_generic.c
@@ -83,7 +83,7 @@ struct ppp_file {
int dead; /* unit/channel has been shut down */
};
-#define PF_TO_X(pf, X) ((X *)((char *)(pf) - offsetof(X, file)))
+#define PF_TO_X(pf, X) container_of(pf, X, file)
#define PF_TO_PPP(pf) PF_TO_X(pf, struct ppp)
#define PF_TO_CHANNEL(pf) PF_TO_X(pf, struct channel)
diff --git a/drivers/s390/net/lcs.c b/drivers/s390/net/lcs.c
index e5665b6..732cd9f 100644
--- a/drivers/s390/net/lcs.c
+++ b/drivers/s390/net/lcs.c
@@ -1511,8 +1511,7 @@ lcs_txbuffer_cb(struct lcs_channel *channel, struct lcs_buffer *buffer)
LCS_DBF_TEXT(5, trace, "txbuffcb");
/* Put buffer back to pool. */
lcs_release_buffer(channel, buffer);
- card = (struct lcs_card *)
- ((char *) channel - offsetof(struct lcs_card, write));
+ card = container_of(channel, struct lcs_card, write);
if (netif_queue_stopped(card->dev) && netif_carrier_ok(card->dev))
netif_wake_queue(card->dev);
spin_lock(&card->lock);
@@ -1810,8 +1809,7 @@ lcs_get_frames_cb(struct lcs_channel *channel, struct lcs_buffer *buffer)
LCS_DBF_TEXT(4, trace, "-eiogpkt");
return;
}
- card = (struct lcs_card *)
- ((char *) channel - offsetof(struct lcs_card, read));
+ card = container_of(channel, struct lcs_card, write);
offset = 0;
while (lcs_hdr->offset != 0) {
if (lcs_hdr->offset <= 0 ||
diff --git a/drivers/video/sa1100fb.h b/drivers/video/sa1100fb.h
index 0b07f6a..48066ef 100644
--- a/drivers/video/sa1100fb.h
+++ b/drivers/video/sa1100fb.h
@@ -110,9 +110,7 @@ struct sa1100fb_info {
#endif
};
-#define __type_entry(ptr,type,member) ((type *)((char *)(ptr)-offsetof(type,member)))
-
-#define TO_INF(ptr,member) __type_entry(ptr,struct sa1100fb_info,member)
+#define TO_INF(ptr,member) container_of(ptr,struct sa1100fb_info,member)
#define SA1100_PALETTE_MODE_VAL(bpp) (((bpp) & 0x018) << 9)
diff --git a/include/linux/security.h b/include/linux/security.h
index 83cdefa..c554f60 100644
--- a/include/linux/security.h
+++ b/include/linux/security.h
@@ -492,7 +492,7 @@ struct request_sock;
* Note that the fown_struct, @fown, is never outside the context of a
* struct file, so the file structure (and associated security information)
* can always be obtained:
- * (struct file *)((long)fown - offsetof(struct file,f_owner));
+ * container_of(fown, struct file, f_owner)
* @tsk contains the structure of task receiving signal.
* @fown contains the file owner information.
* @sig is the signal that will be sent. When 0, kernel sends SIGIO.
diff --git a/net/ipv4/netfilter/nf_nat_core.c b/net/ipv4/netfilter/nf_nat_core.c
index 86a9227..26c8f69 100644
--- a/net/ipv4/netfilter/nf_nat_core.c
+++ b/net/ipv4/netfilter/nf_nat_core.c
@@ -168,7 +168,7 @@ find_appropriate_src(const struct nf_conntrack_tuple *tuple,
read_lock_bh(&nf_nat_lock);
list_for_each_entry(nat, &bysource[h], info.bysource) {
- ct = (struct nf_conn *)((char *)nat - offsetof(struct nf_conn, data));
+ ct = container_of(nat, struct nf_conn, data);
if (same_src(ct, tuple)) {
/* Copy source part from reply tuple. */
nf_ct_invert_tuplepr(result,
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
index 65fb5e8..778ceb9 100644
--- a/security/selinux/hooks.c
+++ b/security/selinux/hooks.c
@@ -2655,7 +2655,7 @@ static int selinux_file_send_sigiotask(struct task_struct *tsk,
struct file_security_struct *fsec;
/* struct fown_struct is never outside the context of a struct file */
- file = (struct file *)((long)fown - offsetof(struct file,f_owner));
+ file = container_of(fown, struct file, f_owner);
tsec = tsk->security;
fsec = file->f_security;
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
- Prev by Date: Re: [BUG 2.6.20-rc2-mm1] init segfaults when CONFIG_PROFILE_LIKELY=y
- Next by Date: Re: fuse, get_user_pages, flush_anon_page, aliasing caches and all that again
- Previous by thread: [PATCH] Documentation: Explain a second alternative for multi-line macros.
- Next by thread: [PATCH 2.6.20-rc2] drivers/char/agp/sgi-agp.c: check kmalloc() return value.
- Index(es):
Relevant Pages
- Re: I was given this macro from this group
... get your macro to function. ... >think about these code snippets.
... >> Sub Testing() ... >> Dim pWordsAs String ... (microsoft.public.word.vba.general) - Re: [Clax86list] using common macros in NASM and C
... Not seeing any value in discussing the definition of a macro, ... generates
a sequence of more detailed language statements." ... :with most of the Windows header
files and try to create a NASM ... However, I have converted portions ... (comp.lang.asm.x86) - Re: [Clax86list] using common macros in NASM and C
... Not seeing any value in discussing the definition of a macro, ... generates
a sequence of more detailed language statements." ... :with most of the Windows header
files and try to create a NASM ... However, I have converted portions ... (comp.lang.asm.x86) - Re: what will be the value of #define
... convention for ensuring that multiple inclusions of header files ... #ifndef
FRED_H ... then the first inclusion will have the macro "FRED_H" undefined, ...
(comp.lang.c) - Re: what will be the value of #define
... #ifndef SYSTEM_H ... defined as an object-like macro whose replacement
list is empty. ... convention for ensuring that multiple inclusions of header files ...
But there's no reason to care what it expands to, ... (comp.lang.c)