Linux 3.4.50
Greg KH
maintainerI'm announcing the release of the 3.4.50 kernel.
All users of the 3.4 kernel series must upgrade.
The updated 3.4.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-3.4.y
and can be browsed at the normal kernel.org git web browser:
http://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 arch/powerpc/include/asm/exception-64s.h | 2 arch/powerpc/kernel/irq.c | 2 arch/powerpc/kernel/process.c | 4 arch/x86/kernel/relocate_kernel_64.S | 2 drivers/block/cciss.c | 32 +++---- drivers/gpu/drm/gma500/cdv_intel_display.c | 14 +++ drivers/gpu/drm/gma500/psb_intel_display.c | 14 +++ drivers/gpu/drm/i915/intel_sdvo.c | 10 +- drivers/md/raid1.c | 12 ++ drivers/md/raid10.c | 12 ++ drivers/net/wireless/ath/ath9k/Kconfig | 10 +- drivers/net/wireless/ath/ath9k/Makefile | 2 drivers/net/wireless/ath/ath9k/init.c | 7 - drivers/net/wireless/ath/ath9k/rc.h | 2 drivers/net/wireless/b43/main.c | 2 drivers/rtc/rtc-twl.c | 1 fs/ceph/locks.c | 73 +++++++++++------- fs/ceph/mds_client.c | 90 ++++++++++++---------- fs/ceph/super.c | 7 + fs/ceph/super.h | 11 +- include/linux/ceph/auth.h | 18 ++++ include/linux/cpu.h | 4 include/linux/swapops.h | 3 include/net/bluetooth/hci_core.h | 1 include/net/bluetooth/mgmt.h | 1 kernel/cpu.c | 55 +++++-------- kernel/sys.c | 29 ++++++- mm/hugetlb.c | 2 mm/migrate.c | 23 ++++- mm/swap_state.c | 18 ++++ net/bluetooth/hci_core.c | 6 + net/bluetooth/mgmt.c | 21 +++++ net/ceph/auth.c | 117 ++++++++++++++++++++++++----- net/ceph/auth_x.c | 24 +++++ net/ceph/auth_x.h | 1 net/ceph/messenger.c | 3 net/ceph/mon_client.c | 7 - net/ceph/osd_client.c | 29 +++---- 39 files changed, 478 insertions(+), 195 deletions(-)
Alex Elder (1):
libceph: must hold mutex for reset_changed_osds()
Alex Lyakas (1):
md/raid1: consider WRITE as successful only if at least one non-Faulty and non-rebuilding drive completed it.
Benjamin Herrenschmidt (1):
powerpc: Fix missing/delayed calls to irq_work
Daniel Vetter (1):
drm/i915: prefer VBT modes for SVDO-LVDS over EDID
Greg Kroah-Hartman (1):
Linux 3.4.50
Jim Schutt (2):
ceph: add cpu_to_le32() calls when encoding a reconnect capability
ceph: ceph_pagelist_append might sleep while atomic
Johan Hedberg (1):
Bluetooth: Fix mgmt handling of power on failures
Kees Cook (2):
b43: stop format string leaking into error msgs
x86: Fix typo in kexec register clearing
Michael Ellerman (1):
powerpc: Fix stack overflow crash in resume_kernel when ftracing
Naoya Horiguchi (1):
mm: migration: add migrate_entry_wait_huge()
Patrik Jakobsson (2):
drm/gma500/psb: Unpin framebuffer on crtc disable drm/gma500/cdv: Unpin framebuffer on crtc disable
Rafael Aquini (1):
swap: avoid read_swap_cache_async() race to deadlock while waiting on discard I/O completion
Robin Holt (1):
reboot: rigrate shutdown/reboot to boot cpu
Sage Weil (6):
libceph: clear messenger auth_retry flag when we authenticate
libceph: fix authorizer invalidation
libceph: add update_authorizer auth method
libceph: wrap auth ops in wrapper functions
libceph: wrap auth methods in a mutex
ceph: fix statvfs fr_size
Srivatsa S. Bhat (1):
CPU hotplug: provide a generic helper to disable/enable CPU hotplug
Stephen M. Cameron (1):
cciss: fix broken mutex usage in ioctl
Sujith Manoharan (2):
ath9k: Disable PowerSave by default
ath9k: Use minstrel rate control by default
Tony Lindgren (1):
drivers/rtc/rtc-twl.c: fix missing device_init_wakeup() when booted with device tree
Greg KH
maintainerMakefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 3 PATCHLEVEL = 4 -SUBLEVEL = 49 +SUBLEVEL = 50 EXTRAVERSION = NAME = Saber-toothed Squirrel
arch/powerpc/include/asm/exception-64s.h +1 -1
@@ -320,7 +320,7 @@ label##_common: \*/ #define STD_EXCEPTION_COMMON_ASYNC (trap, label, hdlr) \ EXCEPTION_COMMON(trap, label, hdlr, ret_from_except_lite, \ - FINISH_NAP;RUNLATCH_ON;DISABLE_INTS) + FINISH_NAP;DISABLE_INTS;RUNLATCH_ON)/* * When the idle code in power4_idle puts the CPU into NAP mode,
arch/powerpc/kernel/irq.c +1 -1
@@ -162,7 +162,7 @@ notrace unsigned int __check_irq_replay(void)* in case we also had a rollover while hard disabled */ local_paca->irq_happened &= ~PACA_IRQ_DEC ; -if (decrementer_check_overflow ()) +if ((happened &PACA_IRQ_DEC ) ||decrementer_check_overflow ())return 0x900 ;/* Finally check if an external interrupt happened */
arch/powerpc/kernel/process.c +2 -2
@@ -1218,7 +1218,7 @@ EXPORT_SYMBOL(dump_stack);#ifdef CONFIG_PPC64 /* Called with hard IRQs off */ -void __ppc64_runlatch_on (void ) +void notrace __ppc64_runlatch_on(void) {struct thread_info *ti =current_thread_info ();unsigned long ctrl;
@@ -1231,7 +1231,7 @@ void __ppc64_runlatch_on(void) }/* Called with hard IRQs off */ -void __ppc64_runlatch_off (void ) +void notrace __ppc64_runlatch_off(void) {struct thread_info *ti =current_thread_info ();unsigned long ctrl;
arch/x86/kernel/relocate_kernel_64.S +1 -1
@@ -160,7 +160,7 @@ identity_mapped: xorq %rbp, %rbp xorq %r8, %r8 xorq %r9, %r9 - xorq %r10, %r9 + xorq %r10, %r10 xorq %r11, %r11 xorq %r12, %r12 xorq %r13, %r13
drivers/block/cciss.c +16 -16
@@ -161,8 +161,6 @@ static irqreturn_t do_cciss_msix_intr(int irq, void *dev_id);static int cciss_open (struct block_device *bdev,fmode_t mode);static int cciss_unlocked_open (struct block_device *bdev,fmode_t mode);static int cciss_release (struct gendisk *disk,fmode_t mode); -static int do_ioctl (struct block_device *bdev,fmode_t mode, -unsigned int cmd,unsigned long arg);static int cciss_ioctl (struct block_device *bdev,fmode_t mode,unsigned int cmd,unsigned long arg);static int cciss_getgeo (struct block_device *bdev,struct hd_geometry *geo);
@@ -229,7 +227,7 @@ static const struct block_device_operations cciss_fops = { .owner = THIS_MODULE, .open = cciss_unlocked_open, .release = cciss_release, - .ioctl = do_ioctl, + .ioctl = cciss_ioctl, .getgeo = cciss_getgeo, #ifdef CONFIG_COMPAT .compat_ioctl = cciss_compat_ioctl,
@@ -1140,16 +1138,6 @@ static int cciss_release(struct gendisk *disk, fmode_t mode)return 0 ; } -static int do_ioctl (struct block_device *bdev,fmode_t mode, -unsigned cmd,unsigned long arg) -{ -int ret; -mutex_lock (&cciss_mutex); - ret =cciss_ioctl (bdev, mode, cmd, arg); -mutex_unlock (&cciss_mutex); -return ret; -} -#ifdef CONFIG_COMPAT static int cciss_ioctl32_passthru(struct block_device *bdev, fmode_t mode,
@@ -1176,7 +1164,7 @@ static int cciss_compat_ioctl(struct block_device *bdev, fmode_t mode,case CCISS_REGNEWD :case CCISS_RESCANDISK :case CCISS_GETLUNINFO : -return do_ioctl (bdev, mode, cmd, arg); +return cciss_ioctl (bdev, mode, cmd, arg);case CCISS_PASSTHRU32 :return cciss_ioctl32_passthru (bdev, mode, cmd, arg);
@@ -1216,7 +1204,7 @@ static int cciss_ioctl32_passthru(struct block_device *bdev, fmode_t mode,if (err)return -EFAULT ; - err =do_ioctl (bdev, mode,CCISS_PASSTHRU , (unsigned long )p); + err =cciss_ioctl (bdev, mode,CCISS_PASSTHRU , (unsigned long )p);if (err)return err; err |=
@@ -1258,7 +1246,7 @@ static int cciss_ioctl32_big_passthru(struct block_device *bdev, fmode_t mode,if (err)return -EFAULT ; - err =do_ioctl (bdev, mode,CCISS_BIG_PASSTHRU , (unsigned long )p); + err =cciss_ioctl (bdev, mode,CCISS_BIG_PASSTHRU , (unsigned long )p);if (err)return err; err |=
@@ -1308,11 +1296,14 @@ static int cciss_getpciinfo(ctlr_info_t *h, void __user *argp)static int cciss_getintinfo (ctlr_info_t *h,void __user *argp) {cciss_coalint_struct intinfo; +unsigned long flags;if (!argp)return -EINVAL ; +spin_lock_irqsave (&h->lock, flags); intinfo.delay =readl (&h->cfgtable->HostWrite.CoalIntDelay); intinfo.count =readl (&h->cfgtable->HostWrite.CoalIntCount); +spin_unlock_irqrestore (&h->lock, flags);if (copy_to_user (argp, &intinfo,sizeof (cciss_coalint_struct)))return -EFAULT ;
@@ -1353,12 +1344,15 @@ static int cciss_setintinfo(ctlr_info_t *h, void __user *argp)static int cciss_getnodename (ctlr_info_t *h,void __user *argp) {NodeName_type NodeName; +unsigned long flags;int i;if (!argp)return -EINVAL ; +spin_lock_irqsave (&h->lock, flags);for (i =0 ; i <16 ; i++) NodeName[i] =readb (&h->cfgtable->ServerName[i]); +spin_unlock_irqrestore (&h->lock, flags);if (copy_to_user (argp, NodeName,sizeof (NodeName_type)))return -EFAULT ;return 0 ;
@@ -1395,10 +1389,13 @@ static int cciss_setnodename(ctlr_info_t *h, void __user *argp)static int cciss_getheartbeat (ctlr_info_t *h,void __user *argp) {Heartbeat_type heartbeat; +unsigned long flags;if (!argp)return -EINVAL ; +spin_lock_irqsave (&h->lock, flags); heartbeat =readl (&h->cfgtable->HeartBeat); +spin_unlock_irqrestore (&h->lock, flags);if (copy_to_user (argp, &heartbeat,sizeof (Heartbeat_type)))return -EFAULT ;return 0 ;
@@ -1407,10 +1404,13 @@ static int cciss_getheartbeat(ctlr_info_t *h, void __user *argp)static int cciss_getbustypes (ctlr_info_t *h,void __user *argp) {BusTypes_type BusTypes; +unsigned long flags;if (!argp)return -EINVAL ; +spin_lock_irqsave (&h->lock, flags); BusTypes =readl (&h->cfgtable->BusTypes); +spin_unlock_irqrestore (&h->lock, flags);if (copy_to_user (argp, &BusTypes,sizeof (BusTypes_type)))return -EFAULT ;return 0 ;
drivers/gpu/drm/gma500/cdv_intel_display.c +14 -0
@@ -1439,6 +1439,19 @@ static void cdv_intel_crtc_destroy(struct drm_crtc *crtc)kfree (psb_intel_crtc); } +static void cdv_intel_crtc_disable (struct drm_crtc *crtc) +{ +struct gtt_range *gt; +struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; + + crtc_funcs->dpms (crtc,DRM_MODE_DPMS_OFF ); + +if (crtc->fb) { + gt =to_psb_fb (crtc->fb)->gtt; +psb_gtt_unpin (gt); + } +} +const struct drm_crtc_helper_funcs cdv_intel_helper_funcs = { .dpms = cdv_intel_crtc_dpms, .mode_fixup = cdv_intel_crtc_mode_fixup,
@@ -1446,6 +1459,7 @@ const struct drm_crtc_helper_funcs cdv_intel_helper_funcs = { .mode_set_base = cdv_intel_pipe_set_base, .prepare = cdv_intel_crtc_prepare, .commit = cdv_intel_crtc_commit, + .disable = cdv_intel_crtc_disable, };const struct drm_crtc_funcs cdv_intel_crtc_funcs = {
drivers/gpu/drm/gma500/psb_intel_display.c +14 -0
@@ -1262,6 +1262,19 @@ void psb_intel_crtc_destroy(struct drm_crtc *crtc)kfree (psb_intel_crtc); } +static void psb_intel_crtc_disable (struct drm_crtc *crtc) +{ +struct gtt_range *gt; +struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; + + crtc_funcs->dpms (crtc,DRM_MODE_DPMS_OFF ); + +if (crtc->fb) { + gt =to_psb_fb (crtc->fb)->gtt; +psb_gtt_unpin (gt); + } +} +const struct drm_crtc_helper_funcs psb_intel_helper_funcs = { .dpms = psb_intel_crtc_dpms, .mode_fixup = psb_intel_crtc_mode_fixup,
@@ -1269,6 +1282,7 @@ const struct drm_crtc_helper_funcs psb_intel_helper_funcs = { .mode_set_base = psb_intel_pipe_set_base, .prepare = psb_intel_crtc_prepare, .commit = psb_intel_crtc_commit, + .disable = psb_intel_crtc_disable, };const struct drm_crtc_funcs psb_intel_crtc_funcs = {
drivers/gpu/drm/i915/intel_sdvo.c +6 -4
@@ -1582,10 +1582,13 @@ static void intel_sdvo_get_lvds_modes(struct drm_connector *connector)* arranged in priority order. */ intel_ddc_get_modes (connector, &intel_sdvo->ddc); -if (list_empty (&connector->probed_modes) == false) - goto end; -/* Fetch modes from VBT */ +/* +* Fetch modes from VBT. For SDVO prefer the VBT mode since some +* SDVO->LVDS transcoders can't cope with the EDID mode. Since +* drm_mode_probed_add adds the mode at the head of the list we add it +* last. +*/ if (dev_priv->sdvo_lvds_vbt_mode !=NULL ) { newmode =drm_mode_duplicate (connector->dev, dev_priv->sdvo_lvds_vbt_mode);
@@ -1597,7 +1600,6 @@ static void intel_sdvo_get_lvds_modes(struct drm_connector *connector) } } -end:list_for_each_entry (newmode, &connector->probed_modes, head) {if (newmode->type &DRM_MODE_TYPE_PREFERRED ) { intel_sdvo->sdvo_lvds_fixed_mode =
drivers/md/raid1.c +11 -1
@@ -413,7 +413,17 @@ static void raid1_end_write_request(struct bio *bio, int error) r1_bio->bios[mirror] =NULL ; to_put = bio; -set_bit (R1BIO_Uptodate, &r1_bio->state); +/* +* Do not set R1BIO_Uptodate if the current device is +* rebuilding or Faulty. This is because we cannot use +* such device for properly reading the data back (we could +* potentially use it, if the current write would have felt +* before rdev->recovery_offset, but for simplicity we don't +* check this here. +*/ +if (test_bit (In_sync, &conf->mirrors[mirror].rdev->flags) && + !test_bit (Faulty, &conf->mirrors[mirror].rdev->flags)) +set_bit (R1BIO_Uptodate, &r1_bio->state);/* Maybe we can clear some bad blocks. */ if (is_badblock(conf->mirrors[mirror].rdev,
drivers/md/raid10.c +11 -1
@@ -452,7 +452,17 @@ static void raid10_end_write_request(struct bio *bio, int error)sector_t first_bad;int bad_sectors; -set_bit (R10BIO_Uptodate, &r10_bio->state); +/* +* Do not set R10BIO_Uptodate if the current device is +* rebuilding or Faulty. This is because we cannot use +* such device for properly reading the data back (we could +* potentially use it, if the current write would have felt +* before rdev->recovery_offset, but for simplicity we don't +* check this here. +*/ +if (test_bit (In_sync, &rdev->flags) && + !test_bit (Faulty, &rdev->flags)) +set_bit (R10BIO_Uptodate, &r10_bio->state);/* Maybe we can clear some bad blocks. */ if (is_badblock(rdev,
drivers/net/wireless/ath/ath9k/Kconfig +7 -3
@@ -89,13 +89,17 @@ config ATH9K_MAC_DEBUG This option enables collection of statistics for Rx/Tx status data and some other MAC related statistics -config ATH9K_RATE_CONTROL +config ATH9K_LEGACY_RATE_CONTROL bool "Atheros ath9k rate control" depends on ATH9K - default y + default n ---help--- Say Y, if you want to use the ath9k specific rate control - module instead of minstrel_ht. + module instead of minstrel_ht. Be warned that there are various + issues with the ath9k RC and minstrel is a more robust algorithm. + Note that even if this option is selected, "ath9k_rate_control" + has to be passed to mac80211 using the module parameter, + ieee80211_default_rc_algo. config ATH9K_HTC tristate "Atheros HTC based wireless cards support"
drivers/net/wireless/ath/ath9k/Makefile +1 -1
@@ -6,7 +6,7 @@ ath9k-y += beacon.o \ xmit.o ath9k-$(CONFIG_ATH9K_BTCOEX_SUPPORT) += mci.o -ath9k-$(CONFIG_ATH9K_RATE_CONTROL) += rc.o +ath9k-$(CONFIG_ATH9K_LEGACY_RATE_CONTROL) += rc.o ath9k-$(CONFIG_ATH9K_PCI) += pci.o ath9k-$(CONFIG_ATH9K_AHB) += ahb.o ath9k-$(CONFIG_ATH9K_DEBUGFS) += debug.o
drivers/net/wireless/ath/ath9k/init.c +1 -6
@@ -671,8 +671,7 @@ void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)BIT (NL80211_IFTYPE_ADHOC ) |BIT (NL80211_IFTYPE_MESH_POINT ); -if (AR_SREV_5416 (sc->sc_ah)) - hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT ; + hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT ; hw->wiphy->flags |=WIPHY_FLAG_IBSS_RSN ; hw->wiphy->flags |=WIPHY_FLAG_SUPPORTS_TDLS ;
@@ -695,10 +694,6 @@ void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) sc->ant_rx = hw->wiphy->available_antennas_rx; sc->ant_tx = hw->wiphy->available_antennas_tx; -#ifdef CONFIG_ATH9K_RATE_CONTROL - hw->rate_control_algorithm ="ath9k_rate_control" ; -#endif -if (sc->sc_ah->caps.hw_caps &ATH9K_HW_CAP_2GHZ ) hw->wiphy->bands[IEEE80211_BAND_2GHZ ] = &sc->sbands[IEEE80211_BAND_2GHZ ];
drivers/net/wireless/ath/ath9k/rc.h +1 -1
@@ -219,7 +219,7 @@ struct ath_rate_priv {struct ath_rc_stats rcstats[RATE_TABLE_SIZE ]; }; -#ifdef CONFIG_ATH9K_RATE_CONTROL +#ifdef CONFIG_ATH9K_LEGACY_RATE_CONTROL int ath_rate_control_register (void );void ath_rate_control_unregister (void );#else
drivers/net/wireless/b43/main.c +1 -1
@@ -2449,7 +2449,7 @@ static void b43_request_firmware(struct work_struct *work)for (i =0 ; i <B43_NR_FWTYPES ; i++) { errmsg = ctx->errors[i];if (strlen (errmsg)) -b43err (dev->wl, errmsg); +b43err (dev->wl,"%s" , errmsg); }b43_print_fw_helptext (dev->wl,1 ); goto out;
drivers/rtc/rtc-twl.c +1 -0
@@ -523,6 +523,7 @@ static int __devinit twl_rtc_probe(struct platform_device *pdev) }platform_set_drvdata (pdev, rtc); +device_init_wakeup (&pdev->dev,1 );return 0 ; out2:
fs/ceph/locks.c +47 -26
112 lines not on this page · raw message
fs/ceph/mds_client.c +49 -41
125 lines not on this page · raw message
fs/ceph/super.c +6 -1
@@ -70,8 +70,14 @@ static int ceph_statfs(struct dentry *dentry, struct kstatfs *buf)/* * express utilization in terms of large blocks to avoid * overflow on 32-bit machines. +* +* NOTE: for the time being, we make bsize == frsize to humor +* not-yet-ancient versions of glibc that are broken. +* Someday, we will probably want to report a real block +* size... whatever that may mean for a network file system! */ buf->f_bsize =1 <<CEPH_BLOCK_SHIFT ; + buf->f_frsize =1 <<CEPH_BLOCK_SHIFT ; buf->f_blocks =le64_to_cpu (st.kb) >> (CEPH_BLOCK_SHIFT -10 ); buf->f_bfree =le64_to_cpu (st.kb_avail) >> (CEPH_BLOCK_SHIFT -10 ); buf->f_bavail =le64_to_cpu (st.kb_avail) >> (CEPH_BLOCK_SHIFT -10 );
@@ -79,7 +85,6 @@ static int ceph_statfs(struct dentry *dentry, struct kstatfs *buf) buf->f_files =le64_to_cpu (st.num_objects); buf->f_ffree =-1 ; buf->f_namelen =NAME_MAX ; - buf->f_frsize =PAGE_CACHE_SIZE ;/* leave fsid little-endian, regardless of host endianness */ fsid = *(u64 *)(&monmap->fsid) ^ *((u64 *)&monmap->fsid +1 );
fs/ceph/super.h +8 -3
@@ -21,7 +21,7 @@/* large granularity for statfs utilization stats to facilitate * large volume sizes on 32-bit machines. */ -#define CEPH_BLOCK_SHIFT 20/* 1 MB */ +#define CEPH_BLOCK_SHIFT 22/* 4 MB */ #define CEPH_BLOCK (1 << CEPH_BLOCK_SHIFT)#define CEPH_MOUNT_OPT_DIRSTAT (1<<4)/* `cat dirname` for stats */
@@ -847,8 +847,13 @@ extern const struct export_operations ceph_export_ops;extern int ceph_lock (struct file *file,int cmd,struct file_lock *fl);extern int ceph_flock (struct file *file,int cmd,struct file_lock *fl);extern void ceph_count_locks (struct inode *inode,int *p_num,int *f_num); -extern int ceph_encode_locks (struct inode *i,struct ceph_pagelist *p, -int p_locks,int f_locks); +extern int ceph_encode_locks_to_buffer (struct inode *inode, +struct ceph_filelock *flocks, +int num_fcntl_locks, +int num_flock_locks); +extern int ceph_locks_to_pagelist (struct ceph_filelock *flocks, +struct ceph_pagelist *pagelist, +int num_fcntl_locks,int num_flock_locks);extern int lock_to_ceph_filelock (struct file_lock *fl,struct ceph_filelock *c);/* debugfs.c */
include/linux/ceph/auth.h +18 -0
@@ -52,6 +52,9 @@ struct ceph_auth_client_ops {*/ int (*create_authorizer)(struct ceph_auth_client *ac,int peer_type,struct ceph_auth_handshake *auth); +/* ensure that an existing authorizer is up to date */ +int (*update_authorizer)(struct ceph_auth_client *ac,int peer_type, +struct ceph_auth_handshake *auth);int (*verify_authorizer_reply)(struct ceph_auth_client *ac,struct ceph_authorizer *a,size_t len); void (*destroy_authorizer)(struct ceph_auth_client *ac,
@@ -75,6 +78,8 @@ struct ceph_auth_client {u64 global_id;/* our unique id in system */ const struct ceph_crypto_key *key;/* our secret key */ unsigned want_keys;/* which services we want */ + +struct mutex mutex; }; extern struct ceph_auth_client *ceph_auth_init(const char *name,
@@ -94,5 +99,18 @@ extern int ceph_build_auth(struct ceph_auth_client *ac, void *msg_buf, size_t msg_len);extern int ceph_auth_is_authenticated (struct ceph_auth_client *ac); +extern int ceph_auth_create_authorizer (struct ceph_auth_client *ac, +int peer_type, +struct ceph_auth_handshake *auth); +extern void ceph_auth_destroy_authorizer (struct ceph_auth_client *ac, +struct ceph_authorizer *a); +extern int ceph_auth_update_authorizer (struct ceph_auth_client *ac, +int peer_type, +struct ceph_auth_handshake *a); +extern int ceph_auth_verify_authorizer_reply (struct ceph_auth_client *ac, +struct ceph_authorizer *a, +size_t len); +extern void ceph_auth_invalidate_authorizer (struct ceph_auth_client *ac, +int peer_type);#endif
include/linux/cpu.h +4 -0
@@ -177,6 +177,8 @@ extern struct bus_type cpu_subsys;extern void get_online_cpus (void );extern void put_online_cpus (void ); +extern void cpu_hotplug_disable (void ); +extern void cpu_hotplug_enable (void );#define hotcpu_notifier (fn, pri) cpu_notifier(fn, pri)#define register_hotcpu_notifier (nb) register_cpu_notifier(nb)#define unregister_hotcpu_notifier (nb) unregister_cpu_notifier(nb)
@@ -199,6 +201,8 @@ static inline void cpu_hotplug_driver_unlock(void)#define get_online_cpus () do { } while (0)#define put_online_cpus () do { } while (0) +#define cpu_hotplug_disable () do { } while (0) +#define cpu_hotplug_enable () do { } while (0)#define hotcpu_notifier (fn, pri) do { (void)(fn); } while (0)/* These aren't inline functions due to a GCC bug. */ #define register_hotcpu_notifier (nb) ({ (void)(nb); 0; })
include/linux/swapops.h +3 -0
@@ -137,6 +137,7 @@ static inline void make_migration_entry_read(swp_entry_t *entry)extern void migration_entry_wait (struct mm_struct *mm,pmd_t *pmd,unsigned long address); +extern void migration_entry_wait_huge (struct mm_struct *mm,pte_t *pte);#else #define make_migration_entry (page, write) swp_entry(0, 0)
@@ -148,6 +149,8 @@ static inline int is_migration_entry(swp_entry_t swp)static inline void make_migration_entry_read (swp_entry_t *entryp) { }static inline void migration_entry_wait (struct mm_struct *mm,pmd_t *pmd,unsigned long address) { } +static inline void migration_entry_wait_huge (struct mm_struct *mm, +pte_t *pte) { }static inline int is_write_migration_entry (swp_entry_t entry) {return 0 ;
include/net/bluetooth/hci_core.h +1 -0
@@ -976,6 +976,7 @@ void hci_sock_dev_event(struct hci_dev *hdev, int event);int mgmt_control (struct sock *sk,struct msghdr *msg,size_t len);int mgmt_index_added (struct hci_dev *hdev);int mgmt_index_removed (struct hci_dev *hdev); +int mgmt_set_powered_failed (struct hci_dev *hdev,int err);int mgmt_powered (struct hci_dev *hdev,u8 powered);int mgmt_discoverable (struct hci_dev *hdev,u8 discoverable);int mgmt_connectable (struct hci_dev *hdev,u8 connectable);
include/net/bluetooth/mgmt.h +1 -0
@@ -42,6 +42,7 @@#define MGMT_STATUS_NOT_POWERED 0x0f#define MGMT_STATUS_CANCELLED 0x10#define MGMT_STATUS_INVALID_INDEX 0x11 +#define MGMT_STATUS_RFKILLED 0x12struct mgmt_hdr {__le16 opcode;
kernel/cpu.c +23 -32
77 lines not on this page · raw message
kernel/sys.c +26 -3
@@ -353,6 +353,29 @@ int unregister_reboot_notifier(struct notifier_block *nb) }EXPORT_SYMBOL (unregister_reboot_notifier); +/* Add backwards compatibility for stable trees. */ +#ifndef PF_NO_SETAFFINITY +#define PF_NO_SETAFFINITY PF_THREAD_BOUND +#endif + +static void migrate_to_reboot_cpu (void ) +{ +/* The boot cpu is always logical cpu 0 */ +int cpu =0 ; + +cpu_hotplug_disable (); + +/* Make certain the cpu I'm about to reboot on is online */ +if (!cpu_online (cpu)) + cpu =cpumask_first (cpu_online_mask); + +/* Prevent races with other tasks migrating this task */ + current->flags |=PF_NO_SETAFFINITY ; + +/* Make certain I only run on the appropriate processor */ +set_cpus_allowed_ptr (current,cpumask_of (cpu)); +} +/** * kernel_restart - reboot the system * @cmd: pointer to buffer containing command to execute for restart
@@ -364,7 +387,7 @@ EXPORT_SYMBOL(unregister_reboot_notifier);void kernel_restart (char *cmd) {kernel_restart_prepare (cmd); -disable_nonboot_cpus (); +migrate_to_reboot_cpu ();syscore_shutdown ();if (!cmd)printk (KERN_EMERG "Restarting system.\n" );
@@ -391,7 +414,7 @@ static void kernel_shutdown_prepare(enum system_states state)void kernel_halt (void ) {kernel_shutdown_prepare (SYSTEM_HALT ); -disable_nonboot_cpus (); +migrate_to_reboot_cpu ();syscore_shutdown ();printk (KERN_EMERG "System halted.\n" );kmsg_dump (KMSG_DUMP_HALT );
@@ -410,7 +433,7 @@ void kernel_power_off(void)kernel_shutdown_prepare (SYSTEM_POWER_OFF );if (pm_power_off_prepare)pm_power_off_prepare (); -disable_nonboot_cpus (); +migrate_to_reboot_cpu ();syscore_shutdown ();printk (KERN_EMERG "Power down.\n" );kmsg_dump (KMSG_DUMP_POWEROFF );
mm/hugetlb.c +1 -1
@@ -2768,7 +2768,7 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,if (ptep) { entry =huge_ptep_get (ptep);if (unlikely (is_hugetlb_entry_migration (entry))) { -migration_entry_wait (mm, (pmd_t *)ptep, address); +migration_entry_wait_huge (mm, ptep);return 0 ; }else if (unlikely (is_hugetlb_entry_hwpoisoned (entry))) return VM_FAULT_HWPOISON_LARGE |
mm/migrate.c +18 -5
@@ -180,15 +180,14 @@ static void remove_migration_ptes(struct page *old, struct page *new)* get to the page and wait until migration is finished. * When we return from this function the fault will be retried. */ -void migration_entry_wait (struct mm_struct *mm,pmd_t *pmd, -unsigned long address) +static void __migration_entry_wait (struct mm_struct *mm,pte_t *ptep, +spinlock_t *ptl) { -pte_t *ptep, pte; -spinlock_t *ptl; +pte_t pte;swp_entry_t entry;struct page *page; - ptep =pte_offset_map_lock (mm, pmd, address, &ptl); +spin_lock (ptl); pte = *ptep;if (!is_swap_pte (pte)) goto out;
@@ -216,6 +215,20 @@ out:pte_unmap_unlock (ptep, ptl); } +void migration_entry_wait (struct mm_struct *mm,pmd_t *pmd, +unsigned long address) +{ +spinlock_t *ptl =pte_lockptr (mm, pmd); +pte_t *ptep =pte_offset_map (pmd, address); +__migration_entry_wait (mm, ptep, ptl); +} + +void migration_entry_wait_huge (struct mm_struct *mm,pte_t *pte) +{ +spinlock_t *ptl = &(mm)->page_table_lock; +__migration_entry_wait (mm, pte, ptl); +} +#ifdef CONFIG_BLOCK /* Returns true if all buffers are successfully locked */ static bool buffer_migrate_lock_buffers(struct buffer_head *head,
mm/swap_state.c +17 -1
@@ -313,8 +313,24 @@ struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask,* Swap entry may have been freed since our caller observed it. */ err =swapcache_prepare (entry); -if (err == -EEXIST ) {/* seems racy */ +if (err == -EEXIST ) {radix_tree_preload_end (); +/* +* We might race against get_swap_page() and stumble +* across a SWAP_HAS_CACHE swap_map entry whose page +* has not been brought into the swapcache yet, while +* the other end is scheduled away waiting on discard +* I/O completion at scan_swap_map(). +* +* In order to avoid turning this transitory state +* into a permanent loop around this -EEXIST case +* if !CONFIG_PREEMPT and the I/O completion happens +* to be waiting on the CPU waitqueue where we are now +* busy looping, we just conditionally invoke the +* scheduler here, if there are some more important +* tasks to run. +*/ +cond_resched ();continue ; }if (err) {/* swp entry is obsolete ? */
net/bluetooth/hci_core.c +5 -1
@@ -1120,11 +1120,15 @@ EXPORT_SYMBOL(hci_free_dev);static void hci_power_on (struct work_struct *work) { struct hci_dev *hdev = container_of(work, struct hci_dev, power_on); +int err;BT_DBG ("%s" , hdev->name); -if (hci_dev_open (hdev->id) <0 ) + err =hci_dev_open (hdev->id); +if (err <0 ) { +mgmt_set_powered_failed (hdev, err);return ; + }if (test_bit (HCI_AUTO_OFF , &hdev->dev_flags)) schedule_delayed_work(&hdev->power_off,
net/bluetooth/mgmt.c +21 -0
@@ -2833,6 +2833,27 @@ int mgmt_powered(struct hci_dev *hdev, u8 powered)return err; } +int mgmt_set_powered_failed (struct hci_dev *hdev,int err) +{ +struct pending_cmd *cmd; +u8 status; + + cmd =mgmt_pending_find (MGMT_OP_SET_POWERED , hdev); +if (!cmd) +return -ENOENT ; + +if (err == -ERFKILL ) + status =MGMT_STATUS_RFKILLED ; +else + status =MGMT_STATUS_FAILED ; + + err =cmd_status (cmd->sk, hdev->id,MGMT_OP_SET_POWERED , status); + +mgmt_pending_remove (cmd); + +return err; +} +int mgmt_discoverable (struct hci_dev *hdev,u8 discoverable) {struct cmd_lookup match = {NULL , hdev };
net/ceph/auth.c +99 -18
186 lines not on this page · raw message
net/ceph/auth_x.c +23 -1
@@ -298,6 +298,7 @@ static int ceph_x_build_authorizer(struct ceph_auth_client *ac,return -ENOMEM ; } au->service = th->service; + au->secret_id = th->secret_id; msg_a = au->buf->vec.iov_base; msg_a->struct_v =1 ;
@@ -555,6 +556,26 @@ static int ceph_x_create_authorizer(return 0 ; } +static int ceph_x_update_authorizer ( +struct ceph_auth_client *ac,int peer_type, +struct ceph_auth_handshake *auth) +{ +struct ceph_x_authorizer *au; +struct ceph_x_ticket_handler *th; + + th =get_ticket_handler (ac, peer_type); +if (IS_ERR (th)) +return PTR_ERR (th); + + au = (struct ceph_x_authorizer *)auth->authorizer; +if (au->secret_id < th->secret_id) { +dout ("ceph_x_update_authorizer service %u secret %llu < %llu\n" , + au->service, au->secret_id, th->secret_id); +return ceph_x_build_authorizer (ac, th, au); + } +return 0 ; +} +static int ceph_x_verify_authorizer_reply (struct ceph_auth_client *ac,struct ceph_authorizer *a,size_t len) {
@@ -630,7 +651,7 @@ static void ceph_x_invalidate_authorizer(struct ceph_auth_client *ac, th =get_ticket_handler (ac, peer_type);if (!IS_ERR (th)) -remove_ticket_handler (ac, th); +memset (&th->validity,0 ,sizeof (th->validity)); }
@@ -641,6 +662,7 @@ static const struct ceph_auth_client_ops ceph_x_ops = { .build_request = ceph_x_build_request, .handle_reply = ceph_x_handle_reply, .create_authorizer = ceph_x_create_authorizer, + .update_authorizer = ceph_x_update_authorizer, .verify_authorizer_reply = ceph_x_verify_authorizer_reply, .destroy_authorizer = ceph_x_destroy_authorizer, .invalidate_authorizer = ceph_x_invalidate_authorizer,
net/ceph/auth_x.h +1 -0
@@ -29,6 +29,7 @@ struct ceph_x_authorizer {struct ceph_buffer *buf;unsigned service;u64 nonce; +u64 secret_id;char reply_buf[128 ];/* big enough for encrypted blob */ };
net/ceph/messenger.c +1 -2
@@ -1542,7 +1542,6 @@ static int process_connect(struct ceph_connection *con) con->error_msg ="connect authorization failure" ;return -1 ; } - con->auth_retry =1 ;con_out_kvec_reset (con); ret =prepare_write_connect (con);if (ret <0 )
@@ -1627,7 +1626,7 @@ static int process_connect(struct ceph_connection *con)WARN_ON (con->state !=CON_STATE_NEGOTIATING ); con->state =CON_STATE_OPEN ; - + con->auth_retry =0 ;/* we authenticated; clear flag */ con->peer_global_seq =le32_to_cpu (con->in_reply.global_seq); con->connect_seq++; con->peer_features = server_feat;
net/ceph/mon_client.c +3 -4
@@ -737,7 +737,7 @@ static void delayed_work(struct work_struct *work)__validate_auth (monc); -if (monc->auth->ops->is_authenticated (monc->auth)) +if (ceph_auth_is_authenticated (monc->auth))__send_subscribe (monc); }__schedule_delayed (monc);
@@ -893,8 +893,7 @@ static void handle_auth_reply(struct ceph_mon_client *monc,mutex_lock (&monc->mutex); had_debugfs_info =have_debugfs_info (monc); -if (monc->auth->ops) - was_auth = monc->auth->ops->is_authenticated (monc->auth); + was_auth =ceph_auth_is_authenticated (monc->auth); monc->pending_auth =0 ; ret = ceph_handle_auth_reply(monc->auth, msg->front.iov_base, msg->front.iov_len,
@@ -905,7 +904,7 @@ static void handle_auth_reply(struct ceph_mon_client *monc,wake_up_all (&monc->client->auth_wq); }else if (ret >0 ) {__send_prepared_auth_request (monc, ret); - }else if (!was_auth && monc->auth->ops->is_authenticated (monc->auth)) { + }else if (!was_auth &&ceph_auth_is_authenticated (monc->auth)) {dout ("authenticated, starting session\n" ); monc->client->msgr.inst.name.type =CEPH_ENTITY_TYPE_CLIENT ;
net/ceph/osd_client.c +13 -16
@@ -671,8 +671,7 @@ static void put_osd(struct ceph_osd *osd)if (atomic_dec_and_test (&osd->o_ref) && osd->o_auth.authorizer) {struct ceph_auth_client *ac = osd->o_osdc->client->monc.auth; -if (ac->ops && ac->ops->destroy_authorizer) - ac->ops->destroy_authorizer (ac, osd->o_auth.authorizer); +ceph_auth_destroy_authorizer (ac, osd->o_auth.authorizer);kfree (osd); } }
@@ -1337,13 +1336,13 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend)__register_request (osdc, req);__unregister_linger_request (osdc, req); } +reset_changed_osds (osdc);mutex_unlock (&osdc->request_mutex);if (needmap) {dout ("%d requests for down osds, need new map\n" , needmap);ceph_monc_request_next_osdmap (&osdc->client->monc); } -reset_changed_osds (osdc); }
@@ -2127,13 +2126,17 @@ static struct ceph_auth_handshake *get_authorizer(struct ceph_connection *con,struct ceph_auth_handshake *auth = &o->o_auth;if (force_new && auth->authorizer) { -if (ac->ops && ac->ops->destroy_authorizer) - ac->ops->destroy_authorizer (ac, auth->authorizer); +ceph_auth_destroy_authorizer (ac, auth->authorizer); auth->authorizer =NULL ; } -if (!auth->authorizer && ac->ops && ac->ops->create_authorizer) { -int ret = ac->ops->create_authorizer (ac,CEPH_ENTITY_TYPE_OSD , - auth); +if (!auth->authorizer) { +int ret =ceph_auth_create_authorizer (ac,CEPH_ENTITY_TYPE_OSD , + auth); +if (ret) +return ERR_PTR (ret); + }else { +int ret =ceph_auth_update_authorizer (ac,CEPH_ENTITY_TYPE_OSD , + auth);if (ret)return ERR_PTR (ret); }
@@ -2149,11 +2152,7 @@ static int verify_authorizer_reply(struct ceph_connection *con, int len)struct ceph_osd_client *osdc = o->o_osdc;struct ceph_auth_client *ac = osdc->client->monc.auth; -/* -* XXX If ac->ops or ac->ops->verify_authorizer_reply is null, -* XXX which do we do: succeed or fail? -*/ -return ac->ops->verify_authorizer_reply (ac, o->o_auth.authorizer, len); +return ceph_auth_verify_authorizer_reply (ac, o->o_auth.authorizer, len); }static int invalidate_authorizer (struct ceph_connection *con)
@@ -2162,9 +2161,7 @@ static int invalidate_authorizer(struct ceph_connection *con)struct ceph_osd_client *osdc = o->o_osdc;struct ceph_auth_client *ac = osdc->client->monc.auth; -if (ac->ops && ac->ops->invalidate_authorizer) - ac->ops->invalidate_authorizer (ac,CEPH_ENTITY_TYPE_OSD ); - +ceph_auth_invalidate_authorizer (ac,CEPH_ENTITY_TYPE_OSD );return ceph_monc_validate_auth (&osdc->client->monc); }