Merge ../openSUSE-11.3
authorJeff Mahoney <jeffm@suse.de>
Tue, 6 Jul 2010 18:28:07 +0000 (14:28 -0400)
committerJeff Mahoney <jeffm@suse.de>
Tue, 6 Jul 2010 18:28:07 +0000 (14:28 -0400)
Conflicts:
patches.suse/dm-raid45-26-Nov-2009.patch
patches.suse/nfs4acl-ext3.diff
patches.xen/tmem
series.conf

suse-commit: 627d715a52677a35fe83145a3e356fbdf112a156

29 files changed:
1  2 
arch/x86/Kconfig
arch/x86/include/asm/mce.h
arch/x86/kernel/cpu/mcheck/Makefile
arch/x86/kernel/cpu/mcheck/mce-internal.h
arch/x86/kernel/cpu/mcheck/mce.c
drivers/net/e1000e/netdev.c
drivers/net/ixgbe/ixgbe_main.c
drivers/net/wireless/iwlwifi/iwl-core.c
fs/Makefile
fs/ext3/ialloc.c
fs/ext3/inode.c
fs/ext3/super.c
fs/ext3/xattr.c
fs/ext3/xattr.h
fs/ext4/acl.c
fs/ext4/ext4.h
fs/ext4/file.c
fs/ext4/ialloc.c
fs/ext4/inode.c
fs/ext4/namei.c
fs/ext4/richacl.c
fs/ext4/super.c
fs/ext4/xattr.c
fs/ext4/xattr.h
fs/gfs2/ops_fstype.c
fs/namei.c
fs/nfs/nfs4proc.c
include/linux/ext3_fs.h
include/linux/fs.h

Simple merge
Simple merge
Simple merge
@@@ -28,26 -28,4 +28,28 @@@ extern int mce_ser
  
  extern struct mce_bank *mce_banks;
  
+ extern void (*mce_cpu_specific_poll)(struct mce *);
++
 +#ifdef CONFIG_ACPI_APEI
 +int apei_write_mce(struct mce *m);
 +ssize_t apei_read_mce(struct mce *m, u64 *record_id);
 +int apei_check_mce(void);
 +int apei_clear_mce(u64 record_id);
 +#else
 +static inline int apei_write_mce(struct mce *m)
 +{
 +      return -EINVAL;
 +}
 +static inline ssize_t apei_read_mce(struct mce *m, u64 *record_id)
 +{
 +      return 0;
 +}
 +static inline int apei_check_mce(void)
 +{
 +      return 0;
 +}
 +static inline int apei_clear_mce(u64 record_id)
 +{
 +      return -EINVAL;
 +}
 +#endif
Simple merge
Simple merge
@@@ -3730,13 -3295,6 +3726,17 @@@ void ixgbe_down(struct ixgbe_adapter *a
        del_timer_sync(&adapter->watchdog_timer);
        cancel_work_sync(&adapter->watchdog_task);
  
 +      netif_carrier_off(netdev);
++      /* power down the optics */
++      if (hw->phy.multispeed_fiber)
++              hw->mac.ops.disable_tx_laser(hw);
++
 +      netif_tx_disable(netdev);
 +
 +      ixgbe_irq_disable(adapter);
 +
 +      ixgbe_napi_disable_all(adapter);
 +
        if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE ||
            adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE)
                cancel_work_sync(&adapter->fdir_reinit_task);
@@@ -2240,22 -2826,6 +2240,15 @@@ int iwl_mac_config(struct ieee80211_hw 
                        IWL_DEBUG_MAC80211(priv, "Error setting sleep level\n");
        }
  
-       if (changed & IEEE80211_CONF_CHANGE_POWER) {
-               IWL_DEBUG_MAC80211(priv, "TX Power old=%d new=%d\n",
-                       priv->tx_power_user_lmt, conf->power_level);
-               iwl_set_tx_power(priv, conf->power_level, false);
-       }
 +      if (changed & IEEE80211_CONF_CHANGE_QOS) {
 +              bool qos_active = !!(conf->flags & IEEE80211_CONF_QOS);
 +
 +              spin_lock_irqsave(&priv->lock, flags);
 +              priv->qos_data.qos_active = qos_active;
 +              iwl_update_qos(priv);
 +              spin_unlock_irqrestore(&priv->lock, flags);
 +      }
 +
        if (!iwl_is_ready(priv)) {
                IWL_DEBUG_MAC80211(priv, "leave - not ready\n");
                goto out;
diff --cc fs/Makefile
Simple merge
Simple merge
diff --cc fs/ext3/inode.c
Simple merge
diff --cc fs/ext3/super.c
Simple merge
diff --cc fs/ext3/xattr.c
@@@ -114,12 -114,9 +114,9 @@@ static const struct xattr_handler *ext3
  #ifdef CONFIG_EXT3_FS_SECURITY
        [EXT3_XATTR_INDEX_SECURITY]          = &ext3_xattr_security_handler,
  #endif
- #ifdef CONFIG_EXT3_FS_NFS4ACL
-       [EXT3_XATTR_INDEX_NFS4ACL]           = &ext3_nfs4acl_xattr_handler,
- #endif
  };
  
 -struct xattr_handler *ext3_xattr_handlers[] = {
 +const struct xattr_handler *ext3_xattr_handlers[] = {
        &ext3_xattr_user_handler,
        &ext3_xattr_trusted_handler,
  #ifdef CONFIG_EXT3_FS_POSIX_ACL
diff --cc fs/ext3/xattr.h
@@@ -59,15 -58,11 +58,11 @@@ struct ext3_xattr_entry 
  
  # ifdef CONFIG_EXT3_FS_XATTR
  
 -extern struct xattr_handler ext3_xattr_user_handler;
 -extern struct xattr_handler ext3_xattr_trusted_handler;
 -extern struct xattr_handler ext3_xattr_acl_access_handler;
 -extern struct xattr_handler ext3_xattr_acl_default_handler;
 -extern struct xattr_handler ext3_xattr_security_handler;
 +extern const struct xattr_handler ext3_xattr_user_handler;
 +extern const struct xattr_handler ext3_xattr_trusted_handler;
 +extern const struct xattr_handler ext3_xattr_acl_access_handler;
 +extern const struct xattr_handler ext3_xattr_acl_default_handler;
 +extern const struct xattr_handler ext3_xattr_security_handler;
- extern const struct xattr_handler ext3_nfs4acl_xattr_handler;
- #ifdef NFS4ACL_DEBUG
- extern const struct xattr_handler ext3_masked_nfs4acl_xattr_handler;
- #endif
  
  extern ssize_t ext3_listxattr(struct dentry *, char *, size_t);
  
diff --cc fs/ext4/acl.c
Simple merge
diff --cc fs/ext4/ext4.h
Simple merge
diff --cc fs/ext4/file.c
Simple merge
Simple merge
diff --cc fs/ext4/inode.c
Simple merge
diff --cc fs/ext4/namei.c
Simple merge
index 0000000,c4a208f..54e9239
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,293 +1,293 @@@
+ /*
+  * Copyright IBM Corporation, 2010
+  * Author Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
+  *
+  * This program is free software; you can redistribute it and/or modify it
+  * under the terms of version 2.1 of the GNU Lesser General Public License
+  * as published by the Free Software Foundation.
+  *
+  * This program is distributed in the hope that it would be useful, but
+  * WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+  *
+  */
+ #include <linux/kernel.h>
+ #include <linux/fs.h>
+ #include <linux/richacl_xattr.h>
+ #include "ext4.h"
+ #include "ext4_jbd2.h"
+ #include "xattr.h"
+ #include "acl.h"
+ #include "richacl.h"
+ static inline struct richacl *
+ ext4_iget_richacl(struct inode *inode)
+ {
+       struct richacl *acl = EXT4_RICHACL_NOT_CACHED;
+       struct ext4_inode_info *ei = EXT4_I(inode);
+       spin_lock(&inode->i_lock);
+       if (ei->i_richacl != EXT4_RICHACL_NOT_CACHED)
+               acl = richacl_get(ei->i_richacl);
+       spin_unlock(&inode->i_lock);
+       return acl;
+ }
+ static inline void
+ ext4_iset_richacl(struct inode *inode, struct richacl *acl)
+ {
+       struct ext4_inode_info *ei = EXT4_I(inode);
+       spin_lock(&inode->i_lock);
+       if (ei->i_richacl != EXT4_RICHACL_NOT_CACHED)
+               richacl_put(ei->i_richacl);
+       ei->i_richacl = richacl_get(acl);
+       spin_unlock(&inode->i_lock);
+ }
+ static struct richacl *
+ ext4_get_richacl(struct inode *inode)
+ {
+       const int name_index = EXT4_XATTR_INDEX_RICHACL;
+       void *value = NULL;
+       struct richacl *acl;
+       int retval;
+       if (!IS_RICHACL(inode))
+               return ERR_PTR(-EOPNOTSUPP);
+       acl = ext4_iget_richacl(inode);
+       if (acl != EXT4_RICHACL_NOT_CACHED)
+               return acl;
+       retval = ext4_xattr_get(inode, name_index, "", NULL, 0);
+       if (retval > 0) {
+               value = kmalloc(retval, GFP_KERNEL);
+               if (!value)
+                       return ERR_PTR(-ENOMEM);
+               retval = ext4_xattr_get(inode, name_index, "", value, retval);
+       }
+       if (retval > 0) {
+               acl = richacl_from_xattr(value, retval);
+               if (acl == ERR_PTR(-EINVAL))
+                       acl = ERR_PTR(-EIO);
+       } else if (retval == -ENODATA || retval == -ENOSYS)
+               acl = NULL;
+       else
+               acl = ERR_PTR(retval);
+       kfree(value);
+       if (!IS_ERR_OR_NULL(acl))
+               ext4_iset_richacl(inode, acl);
+       return acl;
+ }
+ static int
+ ext4_set_richacl(handle_t *handle, struct inode *inode, struct richacl *acl)
+ {
+       const int name_index = EXT4_XATTR_INDEX_RICHACL;
+       size_t size = 0;
+       void *value = NULL;
+       int retval;
+       if (acl) {
+               mode_t mode = inode->i_mode;
+               if (richacl_equiv_mode(acl, &mode) == 0) {
+                       inode->i_mode = mode;
+                       ext4_mark_inode_dirty(handle, inode);
+                       acl = NULL;
+               }
+       }
+       if (acl) {
+               size = richacl_xattr_size(acl);
+               value = kmalloc(size, GFP_KERNEL);
+               if (!value)
+                       return -ENOMEM;
+               richacl_to_xattr(acl, value);
+       }
+       if (handle)
+               retval = ext4_xattr_set_handle(handle, inode, name_index, "",
+                                              value, size, 0);
+       else
+               retval = ext4_xattr_set(inode, name_index, "", value, size, 0);
+       kfree(value);
+       if (!retval)
+               ext4_iset_richacl(inode, acl);
+       return retval;
+ }
+ int
+ ext4_richacl_permission(struct inode *inode, unsigned int mask)
+ {
+       struct richacl *acl;
+       int retval;
+       if (!IS_RICHACL(inode))
+               BUG();
+       acl = ext4_get_richacl(inode);
+       if (acl && IS_ERR(acl))
+               retval = PTR_ERR(acl);
+       else {
+               retval = richacl_inode_permission(inode, acl, mask);
+               richacl_put(acl);
+       }
+       return retval;
+ }
+ int ext4_permission(struct inode *inode, int mask)
+ {
+       if (IS_RICHACL(inode))
+               return ext4_richacl_permission(inode,
+                                       richacl_want_to_mask(mask));
+       else
+               return generic_permission(inode, mask, ext4_check_acl);
+ }
+ int ext4_may_create(struct inode *dir, int isdir)
+ {
+       return richacl_may_create(dir, isdir, ext4_richacl_permission);
+ }
+ int ext4_may_delete(struct inode *dir, struct inode *inode, int replace)
+ {
+       return richacl_may_delete(dir, inode, replace, ext4_richacl_permission);
+ }
+ int
+ ext4_init_richacl(handle_t *handle, struct inode *inode, struct inode *dir)
+ {
+       struct richacl *dir_acl = NULL;
+       if (!S_ISLNK(inode->i_mode)) {
+               dir_acl = ext4_get_richacl(dir);
+               if (IS_ERR(dir_acl))
+                       return PTR_ERR(dir_acl);
+       }
+       if (dir_acl) {
+               struct richacl *acl;
+               int retval;
+               acl = richacl_inherit(dir_acl, inode);
+               richacl_put(dir_acl);
+               retval = PTR_ERR(acl);
+               if (acl && !IS_ERR(acl)) {
+                       retval = ext4_set_richacl(handle, inode, acl);
+                       richacl_put(acl);
+               }
+               return retval;
+       } else {
+               inode->i_mode &= ~current_umask();
+               return 0;
+       }
+ }
+ int
+ ext4_richacl_chmod(struct inode *inode)
+ {
+       struct richacl *acl;
+       int retval;
+       if (S_ISLNK(inode->i_mode))
+               return -EOPNOTSUPP;
+       acl = ext4_get_richacl(inode);
+       if (IS_ERR_OR_NULL(acl))
+               return PTR_ERR(acl);
+       acl = richacl_chmod(acl, inode->i_mode);
+       if (IS_ERR(acl))
+               return PTR_ERR(acl);
+       retval = ext4_set_richacl(NULL, inode, acl);
+       richacl_put(acl);
+       return retval;
+ }
+ static size_t
+ ext4_xattr_list_richacl(struct dentry *dentry, char *list, size_t list_len,
+                       const char *name, size_t name_len, int type)
+ {
+       const size_t size = sizeof(RICHACL_XATTR);
+       if (!IS_RICHACL(dentry->d_inode))
+               return 0;
+       if (list && size <= list_len)
+               memcpy(list, RICHACL_XATTR, size);
+       return size;
+ }
+ static int
+ ext4_xattr_get_richacl(struct dentry *dentry, const char *name, void *buffer,
+               size_t buffer_size, int type)
+ {
+       struct richacl *acl;
+       size_t size;
+       if (strcmp(name, "") != 0)
+               return -EINVAL;
+       acl = ext4_get_richacl(dentry->d_inode);
+       if (IS_ERR(acl))
+               return PTR_ERR(acl);
+       if (acl == NULL)
+               return -ENODATA;
+       size = richacl_xattr_size(acl);
+       if (buffer) {
+               if (size > buffer_size)
+                       return -ERANGE;
+               richacl_to_xattr(acl, buffer);
+       }
+       richacl_put(acl);
+       return size;
+ }
+ static int
+ ext4_xattr_set_richacl(struct dentry *dentry, const char *name,
+               const void *value, size_t size, int flags, int type)
+ {
+       handle_t *handle;
+       struct richacl *acl = NULL;
+       int retval, retries = 0;
+       struct inode *inode = dentry->d_inode;
+       if (!IS_RICHACL(dentry->d_inode))
+               return -EOPNOTSUPP;
+       if (S_ISLNK(inode->i_mode))
+               return -EOPNOTSUPP;
+       if (strcmp(name, "") != 0)
+               return -EINVAL;
+       if (current_fsuid() != inode->i_uid &&
+           ext4_richacl_permission(inode, ACE4_WRITE_ACL) &&
+           !capable(CAP_FOWNER))
+               return -EPERM;
+       if (value) {
+               acl = richacl_from_xattr(value, size);
+               if (IS_ERR(acl))
+                       return PTR_ERR(acl);
+               inode->i_mode &= ~S_IRWXUGO;
+               inode->i_mode |= richacl_masks_to_mode(acl);
+       }
+ retry:
+       handle = ext4_journal_start(inode, EXT4_DATA_TRANS_BLOCKS(inode->i_sb));
+       if (IS_ERR(handle))
+               return PTR_ERR(handle);
+       ext4_mark_inode_dirty(handle, inode);
+       retval = ext4_set_richacl(handle, inode, acl);
+       ext4_journal_stop(handle);
+       if (retval == ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries))
+               goto retry;
+       richacl_put(acl);
+       return retval;
+ }
 -struct xattr_handler ext4_richacl_xattr_handler = {
++const struct xattr_handler ext4_richacl_xattr_handler = {
+       .prefix = RICHACL_XATTR,
+       .list   = ext4_xattr_list_richacl,
+       .get    = ext4_xattr_get_richacl,
+       .set    = ext4_xattr_set_richacl,
+ };
diff --cc fs/ext4/super.c
Simple merge
diff --cc fs/ext4/xattr.c
@@@ -107,9 -107,12 +107,12 @@@ static const struct xattr_handler *ext4
  #ifdef CONFIG_EXT4_FS_SECURITY
        [EXT4_XATTR_INDEX_SECURITY]          = &ext4_xattr_security_handler,
  #endif
+ #ifdef CONFIG_EXT4_FS_RICHACL
+       [EXT4_XATTR_INDEX_RICHACL]           = &ext4_richacl_xattr_handler,
+ #endif
  };
  
 -struct xattr_handler *ext4_xattr_handlers[] = {
 +const struct xattr_handler *ext4_xattr_handlers[] = {
        &ext4_xattr_user_handler,
        &ext4_xattr_trusted_handler,
  #ifdef CONFIG_EXT4_FS_POSIX_ACL
diff --cc fs/ext4/xattr.h
@@@ -65,11 -66,15 +66,15 @@@ struct ext4_xattr_entry 
  
  # ifdef CONFIG_EXT4_FS_XATTR
  
 -extern struct xattr_handler ext4_xattr_user_handler;
 -extern struct xattr_handler ext4_xattr_trusted_handler;
 -extern struct xattr_handler ext4_xattr_acl_access_handler;
 -extern struct xattr_handler ext4_xattr_acl_default_handler;
 -extern struct xattr_handler ext4_xattr_security_handler;
 -extern struct xattr_handler ext4_xattr_acl_access_handler;
 -extern struct xattr_handler ext4_xattr_acl_default_handler;
 -extern struct xattr_handler ext4_xattr_security_handler;
 -extern struct xattr_handler ext4_richacl_xattr_handler;
 +extern const struct xattr_handler ext4_xattr_user_handler;
 +extern const struct xattr_handler ext4_xattr_trusted_handler;
 +extern const struct xattr_handler ext4_xattr_acl_access_handler;
 +extern const struct xattr_handler ext4_xattr_acl_default_handler;
 +extern const struct xattr_handler ext4_xattr_security_handler;
++extern const struct xattr_handler ext4_xattr_acl_access_handler;
++extern const struct xattr_handler ext4_xattr_acl_default_handler;
++extern const struct xattr_handler ext4_xattr_security_handler;
++extern const struct xattr_handler ext4_richacl_xattr_handler;
  
  extern ssize_t ext4_listxattr(struct dentry *, char *, size_t);
  
Simple merge
diff --cc fs/namei.c
Simple merge
Simple merge
Simple merge
Simple merge