diff mbox

posix_acl: resolve compile dependency in posix_acl.h

Message ID 20131009154109.13c7248c53b97d96194ca8f9@linux-foundation.org (mailing list archive)
State New, archived
Headers show

Commit Message

Andrew Morton Oct. 9, 2013, 10:41 p.m. UTC
On Wed, 02 Oct 2013 17:36:29 +0300 Benny Halevy <bhalevy@primarydata.com> wrote:

> From: Benny Halevy <bhalevy@panasas.com>
> 
> get_cached_acl is defined as inline in posix_acl.h
> requiring the full definition of struct inode as it
> dereferences its struct inode * parameter.

That's very old code so you must have a peculiar config.  Please
describe the circumstances under which this occurs, because I'd like to
avoid merging this patch.

> --- a/include/linux/posix_acl.h
> +++ b/include/linux/posix_acl.h
> @@ -9,6 +9,7 @@
>  #define __LINUX_POSIX_ACL_H
> 
>  #include <linux/bug.h>
> +#include <linux/fs.h>
>  #include <linux/slab.h>
>  #include <linux/rcupdate.h>

A better fix is to undo all that crazy inlining in posix_acl.h.


From: Andrew Morton <akpm@linux-foundation.org>
Subject: posix_acl: uninlining

Uninline vast tracts of nested inline functions in
include/linux/posix_acl.h.

This reduces the text+data+bss size of x86_64 allyesconfig vmlinux by 8026
bytes.

Also fixes an obscure build error reported by Benny: get_cached_acl()
needs fs.h for struct inode internals.

The patch also regularises the positioning of the EXPORT_SYMBOLs in
posix_acl.c.

Reported-by:: Benny Halevy <bhalevy@panasas.com>
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Cc: J. Bruce Fields <bfields@fieldses.org>
Cc: Trond Myklebust <Trond.Myklebust@netapp.com>
Cc: Benny Halevy <bhalevy@primarydata.com>
Cc: Andreas Gruenbacher <agruen@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---

 fs/posix_acl.c            |   84 +++++++++++++++++++++++++++++++++---
 include/linux/posix_acl.h |   78 ++-------------------------------
 2 files changed, 85 insertions(+), 77 deletions(-)

Comments

Benny Halevy Oct. 10, 2013, 8:49 a.m. UTC | #1
On 2013-10-10 01:41, Andrew Morton wrote:
> On Wed, 02 Oct 2013 17:36:29 +0300 Benny Halevy <bhalevy@primarydata.com> wrote:
> 
>> From: Benny Halevy <bhalevy@panasas.com>
>>
>> get_cached_acl is defined as inline in posix_acl.h
>> requiring the full definition of struct inode as it
>> dereferences its struct inode * parameter.
> 
> That's very old code so you must have a peculiar config.  Please
> describe the circumstances under which this occurs, because I'd like to
> avoid merging this patch.
> 

Wow, sorry, you're right.  It originated in 2.6.33 as far as I can see
and it is no longer needed.

>> --- a/include/linux/posix_acl.h
>> +++ b/include/linux/posix_acl.h
>> @@ -9,6 +9,7 @@
>>  #define __LINUX_POSIX_ACL_H
>>
>>  #include <linux/bug.h>
>> +#include <linux/fs.h>
>>  #include <linux/slab.h>
>>  #include <linux/rcupdate.h>
> 
> A better fix is to undo all that crazy inlining in posix_acl.h.
> 
> 
> From: Andrew Morton <akpm@linux-foundation.org>
> Subject: posix_acl: uninlining
> 
> Uninline vast tracts of nested inline functions in
> include/linux/posix_acl.h.
> 
> This reduces the text+data+bss size of x86_64 allyesconfig vmlinux by 8026
> bytes.
> 
> Also fixes an obscure build error reported by Benny: get_cached_acl()
> needs fs.h for struct inode internals.

Sorry for the stale report, I have no problem with 3.12-rc3.

> 
> The patch also regularises the positioning of the EXPORT_SYMBOLs in
> posix_acl.c.
> 
> Reported-by:: Benny Halevy <bhalevy@panasas.com>

ditto.

> Cc: Alexander Viro <viro@zeniv.linux.org.uk>
> Cc: J. Bruce Fields <bfields@fieldses.org>
> Cc: Trond Myklebust <Trond.Myklebust@netapp.com>
> Cc: Benny Halevy <bhalevy@primarydata.com>
> Cc: Andreas Gruenbacher <agruen@suse.de>
> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

FWIW, I tested my linux-pnfs 3.12-rc3 tree with this patch
and it builds and causes no regression with the connectathon test suite over pnfs.

Benny

> ---
> 
>  fs/posix_acl.c            |   84 +++++++++++++++++++++++++++++++++---
>  include/linux/posix_acl.h |   78 ++-------------------------------
>  2 files changed, 85 insertions(+), 77 deletions(-)
> 
> diff -puN fs/posix_acl.c~posix_acl-uninlining fs/posix_acl.c
> --- a/fs/posix_acl.c~posix_acl-uninlining
> +++ a/fs/posix_acl.c
> @@ -22,11 +22,80 @@
>  
>  #include <linux/errno.h>
>  
> -EXPORT_SYMBOL(posix_acl_init);
> -EXPORT_SYMBOL(posix_acl_alloc);
> -EXPORT_SYMBOL(posix_acl_valid);
> -EXPORT_SYMBOL(posix_acl_equiv_mode);
> -EXPORT_SYMBOL(posix_acl_from_mode);
> +struct posix_acl **acl_by_type(struct inode *inode, int type)
> +{
> +	switch (type) {
> +	case ACL_TYPE_ACCESS:
> +		return &inode->i_acl;
> +	case ACL_TYPE_DEFAULT:
> +		return &inode->i_default_acl;
> +	default:
> +		BUG();
> +	}
> +}
> +EXPORT_SYMBOL(acl_by_type);
> +
> +struct posix_acl *get_cached_acl(struct inode *inode, int type)
> +{
> +	struct posix_acl **p = acl_by_type(inode, type);
> +	struct posix_acl *acl = ACCESS_ONCE(*p);
> +	if (acl) {
> +		spin_lock(&inode->i_lock);
> +		acl = *p;
> +		if (acl != ACL_NOT_CACHED)
> +			acl = posix_acl_dup(acl);
> +		spin_unlock(&inode->i_lock);
> +	}
> +	return acl;
> +}
> +EXPORT_SYMBOL(get_cached_acl);
> +
> +struct posix_acl *get_cached_acl_rcu(struct inode *inode, int type)
> +{
> +	return rcu_dereference(*acl_by_type(inode, type));
> +}
> +EXPORT_SYMBOL(get_cached_acl_rcu);
> +
> +void set_cached_acl(struct inode *inode, int type, struct posix_acl *acl)
> +{
> +	struct posix_acl **p = acl_by_type(inode, type);
> +	struct posix_acl *old;
> +	spin_lock(&inode->i_lock);
> +	old = *p;
> +	rcu_assign_pointer(*p, posix_acl_dup(acl));
> +	spin_unlock(&inode->i_lock);
> +	if (old != ACL_NOT_CACHED)
> +		posix_acl_release(old);
> +}
> +EXPORT_SYMBOL(set_cached_acl);
> +
> +void forget_cached_acl(struct inode *inode, int type)
> +{
> +	struct posix_acl **p = acl_by_type(inode, type);
> +	struct posix_acl *old;
> +	spin_lock(&inode->i_lock);
> +	old = *p;
> +	*p = ACL_NOT_CACHED;
> +	spin_unlock(&inode->i_lock);
> +	if (old != ACL_NOT_CACHED)
> +		posix_acl_release(old);
> +}
> +EXPORT_SYMBOL(forget_cached_acl);
> +
> +void forget_all_cached_acls(struct inode *inode)
> +{
> +	struct posix_acl *old_access, *old_default;
> +	spin_lock(&inode->i_lock);
> +	old_access = inode->i_acl;
> +	old_default = inode->i_default_acl;
> +	inode->i_acl = inode->i_default_acl = ACL_NOT_CACHED;
> +	spin_unlock(&inode->i_lock);
> +	if (old_access != ACL_NOT_CACHED)
> +		posix_acl_release(old_access);
> +	if (old_default != ACL_NOT_CACHED)
> +		posix_acl_release(old_default);
> +}
> +EXPORT_SYMBOL(forget_all_cached_acls);
>  
>  /*
>   * Init a fresh posix_acl
> @@ -37,6 +106,7 @@ posix_acl_init(struct posix_acl *acl, in
>  	atomic_set(&acl->a_refcount, 1);
>  	acl->a_count = count;
>  }
> +EXPORT_SYMBOL(posix_acl_init);
>  
>  /*
>   * Allocate a new ACL with the specified number of entries.
> @@ -51,6 +121,7 @@ posix_acl_alloc(int count, gfp_t flags)
>  		posix_acl_init(acl, count);
>  	return acl;
>  }
> +EXPORT_SYMBOL(posix_acl_alloc);
>  
>  /*
>   * Clone an ACL.
> @@ -146,6 +217,7 @@ posix_acl_valid(const struct posix_acl *
>  		return 0;
>  	return -EINVAL;
>  }
> +EXPORT_SYMBOL(posix_acl_valid);
>  
>  /*
>   * Returns 0 if the acl can be exactly represented in the traditional
> @@ -186,6 +258,7 @@ posix_acl_equiv_mode(const struct posix_
>                  *mode_p = (*mode_p & ~S_IRWXUGO) | mode;
>          return not_equiv;
>  }
> +EXPORT_SYMBOL(posix_acl_equiv_mode);
>  
>  /*
>   * Create an ACL representing the file mode permission bits of an inode.
> @@ -207,6 +280,7 @@ posix_acl_from_mode(umode_t mode, gfp_t
>  	acl->a_entries[2].e_perm = (mode & S_IRWXO);
>  	return acl;
>  }
> +EXPORT_SYMBOL(posix_acl_from_mode);
>  
>  /*
>   * Return 0 if current is granted want access to the inode
> diff -puN include/linux/posix_acl.h~posix_acl-uninlining include/linux/posix_acl.h
> --- a/include/linux/posix_acl.h~posix_acl-uninlining
> +++ a/include/linux/posix_acl.h
> @@ -94,78 +94,12 @@ extern int posix_acl_chmod(struct posix_
>  extern struct posix_acl *get_posix_acl(struct inode *, int);
>  extern int set_posix_acl(struct inode *, int, struct posix_acl *);
>  
> -#ifdef CONFIG_FS_POSIX_ACL
> -static inline struct posix_acl **acl_by_type(struct inode *inode, int type)
> -{
> -	switch (type) {
> -	case ACL_TYPE_ACCESS:
> -		return &inode->i_acl;
> -	case ACL_TYPE_DEFAULT:
> -		return &inode->i_default_acl;
> -	default:
> -		BUG();
> -	}
> -}
> -
> -static inline struct posix_acl *get_cached_acl(struct inode *inode, int type)
> -{
> -	struct posix_acl **p = acl_by_type(inode, type);
> -	struct posix_acl *acl = ACCESS_ONCE(*p);
> -	if (acl) {
> -		spin_lock(&inode->i_lock);
> -		acl = *p;
> -		if (acl != ACL_NOT_CACHED)
> -			acl = posix_acl_dup(acl);
> -		spin_unlock(&inode->i_lock);
> -	}
> -	return acl;
> -}
> -
> -static inline struct posix_acl *get_cached_acl_rcu(struct inode *inode, int type)
> -{
> -	return rcu_dereference(*acl_by_type(inode, type));
> -}
> -
> -static inline void set_cached_acl(struct inode *inode,
> -				  int type,
> -				  struct posix_acl *acl)
> -{
> -	struct posix_acl **p = acl_by_type(inode, type);
> -	struct posix_acl *old;
> -	spin_lock(&inode->i_lock);
> -	old = *p;
> -	rcu_assign_pointer(*p, posix_acl_dup(acl));
> -	spin_unlock(&inode->i_lock);
> -	if (old != ACL_NOT_CACHED)
> -		posix_acl_release(old);
> -}
> -
> -static inline void forget_cached_acl(struct inode *inode, int type)
> -{
> -	struct posix_acl **p = acl_by_type(inode, type);
> -	struct posix_acl *old;
> -	spin_lock(&inode->i_lock);
> -	old = *p;
> -	*p = ACL_NOT_CACHED;
> -	spin_unlock(&inode->i_lock);
> -	if (old != ACL_NOT_CACHED)
> -		posix_acl_release(old);
> -}
> -
> -static inline void forget_all_cached_acls(struct inode *inode)
> -{
> -	struct posix_acl *old_access, *old_default;
> -	spin_lock(&inode->i_lock);
> -	old_access = inode->i_acl;
> -	old_default = inode->i_default_acl;
> -	inode->i_acl = inode->i_default_acl = ACL_NOT_CACHED;
> -	spin_unlock(&inode->i_lock);
> -	if (old_access != ACL_NOT_CACHED)
> -		posix_acl_release(old_access);
> -	if (old_default != ACL_NOT_CACHED)
> -		posix_acl_release(old_default);
> -}
> -#endif
> +struct posix_acl **acl_by_type(struct inode *inode, int type);
> +struct posix_acl *get_cached_acl(struct inode *inode, int type);
> +struct posix_acl *get_cached_acl_rcu(struct inode *inode, int type);
> +void set_cached_acl(struct inode *inode, int type, struct posix_acl *acl);
> +void forget_cached_acl(struct inode *inode, int type);
> +void forget_all_cached_acls(struct inode *inode);
>  
>  static inline void cache_no_acl(struct inode *inode)
>  {
> _
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff -puN fs/posix_acl.c~posix_acl-uninlining fs/posix_acl.c
--- a/fs/posix_acl.c~posix_acl-uninlining
+++ a/fs/posix_acl.c
@@ -22,11 +22,80 @@ 
 
 #include <linux/errno.h>
 
-EXPORT_SYMBOL(posix_acl_init);
-EXPORT_SYMBOL(posix_acl_alloc);
-EXPORT_SYMBOL(posix_acl_valid);
-EXPORT_SYMBOL(posix_acl_equiv_mode);
-EXPORT_SYMBOL(posix_acl_from_mode);
+struct posix_acl **acl_by_type(struct inode *inode, int type)
+{
+	switch (type) {
+	case ACL_TYPE_ACCESS:
+		return &inode->i_acl;
+	case ACL_TYPE_DEFAULT:
+		return &inode->i_default_acl;
+	default:
+		BUG();
+	}
+}
+EXPORT_SYMBOL(acl_by_type);
+
+struct posix_acl *get_cached_acl(struct inode *inode, int type)
+{
+	struct posix_acl **p = acl_by_type(inode, type);
+	struct posix_acl *acl = ACCESS_ONCE(*p);
+	if (acl) {
+		spin_lock(&inode->i_lock);
+		acl = *p;
+		if (acl != ACL_NOT_CACHED)
+			acl = posix_acl_dup(acl);
+		spin_unlock(&inode->i_lock);
+	}
+	return acl;
+}
+EXPORT_SYMBOL(get_cached_acl);
+
+struct posix_acl *get_cached_acl_rcu(struct inode *inode, int type)
+{
+	return rcu_dereference(*acl_by_type(inode, type));
+}
+EXPORT_SYMBOL(get_cached_acl_rcu);
+
+void set_cached_acl(struct inode *inode, int type, struct posix_acl *acl)
+{
+	struct posix_acl **p = acl_by_type(inode, type);
+	struct posix_acl *old;
+	spin_lock(&inode->i_lock);
+	old = *p;
+	rcu_assign_pointer(*p, posix_acl_dup(acl));
+	spin_unlock(&inode->i_lock);
+	if (old != ACL_NOT_CACHED)
+		posix_acl_release(old);
+}
+EXPORT_SYMBOL(set_cached_acl);
+
+void forget_cached_acl(struct inode *inode, int type)
+{
+	struct posix_acl **p = acl_by_type(inode, type);
+	struct posix_acl *old;
+	spin_lock(&inode->i_lock);
+	old = *p;
+	*p = ACL_NOT_CACHED;
+	spin_unlock(&inode->i_lock);
+	if (old != ACL_NOT_CACHED)
+		posix_acl_release(old);
+}
+EXPORT_SYMBOL(forget_cached_acl);
+
+void forget_all_cached_acls(struct inode *inode)
+{
+	struct posix_acl *old_access, *old_default;
+	spin_lock(&inode->i_lock);
+	old_access = inode->i_acl;
+	old_default = inode->i_default_acl;
+	inode->i_acl = inode->i_default_acl = ACL_NOT_CACHED;
+	spin_unlock(&inode->i_lock);
+	if (old_access != ACL_NOT_CACHED)
+		posix_acl_release(old_access);
+	if (old_default != ACL_NOT_CACHED)
+		posix_acl_release(old_default);
+}
+EXPORT_SYMBOL(forget_all_cached_acls);
 
 /*
  * Init a fresh posix_acl
@@ -37,6 +106,7 @@  posix_acl_init(struct posix_acl *acl, in
 	atomic_set(&acl->a_refcount, 1);
 	acl->a_count = count;
 }
+EXPORT_SYMBOL(posix_acl_init);
 
 /*
  * Allocate a new ACL with the specified number of entries.
@@ -51,6 +121,7 @@  posix_acl_alloc(int count, gfp_t flags)
 		posix_acl_init(acl, count);
 	return acl;
 }
+EXPORT_SYMBOL(posix_acl_alloc);
 
 /*
  * Clone an ACL.
@@ -146,6 +217,7 @@  posix_acl_valid(const struct posix_acl *
 		return 0;
 	return -EINVAL;
 }
+EXPORT_SYMBOL(posix_acl_valid);
 
 /*
  * Returns 0 if the acl can be exactly represented in the traditional
@@ -186,6 +258,7 @@  posix_acl_equiv_mode(const struct posix_
                 *mode_p = (*mode_p & ~S_IRWXUGO) | mode;
         return not_equiv;
 }
+EXPORT_SYMBOL(posix_acl_equiv_mode);
 
 /*
  * Create an ACL representing the file mode permission bits of an inode.
@@ -207,6 +280,7 @@  posix_acl_from_mode(umode_t mode, gfp_t
 	acl->a_entries[2].e_perm = (mode & S_IRWXO);
 	return acl;
 }
+EXPORT_SYMBOL(posix_acl_from_mode);
 
 /*
  * Return 0 if current is granted want access to the inode
diff -puN include/linux/posix_acl.h~posix_acl-uninlining include/linux/posix_acl.h
--- a/include/linux/posix_acl.h~posix_acl-uninlining
+++ a/include/linux/posix_acl.h
@@ -94,78 +94,12 @@  extern int posix_acl_chmod(struct posix_
 extern struct posix_acl *get_posix_acl(struct inode *, int);
 extern int set_posix_acl(struct inode *, int, struct posix_acl *);
 
-#ifdef CONFIG_FS_POSIX_ACL
-static inline struct posix_acl **acl_by_type(struct inode *inode, int type)
-{
-	switch (type) {
-	case ACL_TYPE_ACCESS:
-		return &inode->i_acl;
-	case ACL_TYPE_DEFAULT:
-		return &inode->i_default_acl;
-	default:
-		BUG();
-	}
-}
-
-static inline struct posix_acl *get_cached_acl(struct inode *inode, int type)
-{
-	struct posix_acl **p = acl_by_type(inode, type);
-	struct posix_acl *acl = ACCESS_ONCE(*p);
-	if (acl) {
-		spin_lock(&inode->i_lock);
-		acl = *p;
-		if (acl != ACL_NOT_CACHED)
-			acl = posix_acl_dup(acl);
-		spin_unlock(&inode->i_lock);
-	}
-	return acl;
-}
-
-static inline struct posix_acl *get_cached_acl_rcu(struct inode *inode, int type)
-{
-	return rcu_dereference(*acl_by_type(inode, type));
-}
-
-static inline void set_cached_acl(struct inode *inode,
-				  int type,
-				  struct posix_acl *acl)
-{
-	struct posix_acl **p = acl_by_type(inode, type);
-	struct posix_acl *old;
-	spin_lock(&inode->i_lock);
-	old = *p;
-	rcu_assign_pointer(*p, posix_acl_dup(acl));
-	spin_unlock(&inode->i_lock);
-	if (old != ACL_NOT_CACHED)
-		posix_acl_release(old);
-}
-
-static inline void forget_cached_acl(struct inode *inode, int type)
-{
-	struct posix_acl **p = acl_by_type(inode, type);
-	struct posix_acl *old;
-	spin_lock(&inode->i_lock);
-	old = *p;
-	*p = ACL_NOT_CACHED;
-	spin_unlock(&inode->i_lock);
-	if (old != ACL_NOT_CACHED)
-		posix_acl_release(old);
-}
-
-static inline void forget_all_cached_acls(struct inode *inode)
-{
-	struct posix_acl *old_access, *old_default;
-	spin_lock(&inode->i_lock);
-	old_access = inode->i_acl;
-	old_default = inode->i_default_acl;
-	inode->i_acl = inode->i_default_acl = ACL_NOT_CACHED;
-	spin_unlock(&inode->i_lock);
-	if (old_access != ACL_NOT_CACHED)
-		posix_acl_release(old_access);
-	if (old_default != ACL_NOT_CACHED)
-		posix_acl_release(old_default);
-}
-#endif
+struct posix_acl **acl_by_type(struct inode *inode, int type);
+struct posix_acl *get_cached_acl(struct inode *inode, int type);
+struct posix_acl *get_cached_acl_rcu(struct inode *inode, int type);
+void set_cached_acl(struct inode *inode, int type, struct posix_acl *acl);
+void forget_cached_acl(struct inode *inode, int type);
+void forget_all_cached_acls(struct inode *inode);
 
 static inline void cache_no_acl(struct inode *inode)
 {