Linux 3.0.8
I'm announcing the release of the 3.0.8 kernel.
All users of the 3.0 kernel series must upgrade.
The updated 3.0.y git tree can be found at (NOTE THE ADDRESS CHANGE):
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-3.0.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/arm/kernel/perf_event_v7.c | 4 arch/arm/mm/init.c | 7 + arch/x86/mm/init.c | 3 crypto/ghash-generic.c | 6 + drivers/firewire/sbp2.c | 4 drivers/gpu/drm/radeon/atom.c | 15 ++ drivers/gpu/drm/radeon/atom.h | 1 drivers/gpu/drm/ttm/ttm_bo.c | 10 + drivers/gpu/drm/ttm/ttm_bo_util.c | 2 drivers/hid/hid-ids.h | 3 drivers/hid/hid-magicmouse.c | 10 + drivers/hid/usbhid/hid-quirks.c | 1 drivers/hwmon/w83627ehf.c | 20 ++- drivers/media/video/uvc/uvc_entity.c | 2 drivers/platform/x86/samsung-laptop.c | 10 + fs/cifs/cifsfs.c | 10 + fs/fuse/dev.c | 12 +- fs/hfsplus/hfsplus_fs.h | 16 ++ fs/hfsplus/part_tbl.c | 32 +++-- fs/hfsplus/super.c | 16 +- fs/hfsplus/wrapper.c | 87 +++++++++++---- fs/xfs/linux-2.6/xfs_linux.h | 2 fs/xfs/linux-2.6/xfs_super.c | 48 ++------ fs/xfs/quota/xfs_dquot_item.c | 10 + fs/xfs/xfs_buf_item.c | 3 fs/xfs/xfs_inode_item.c | 10 + fs/xfs/xfs_trans.c | 27 ++++ fs/xfs/xfs_trans.h | 2 fs/xfs/xfs_trans_ail.c | 192 ++++++++++++++++++++++++---------- fs/xfs/xfs_trans_priv.h | 18 +-- kernel/posix-cpu-timers.c | 7 - kernel/sys.c | 2 mm/migrate.c | 8 - net/x25/af_x25.c | 3 sound/pci/hda/hda_intel.c | 1 sound/pci/hda/patch_conexant.c | 1 37 files changed, 413 insertions(+), 194 deletions(-)
Makefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 3 PATCHLEVEL = 0 -SUBLEVEL = 7 +SUBLEVEL = 8 EXTRAVERSION = NAME = Sneaky Weasel
arch/arm/kernel/perf_event_v7.c +2 -2
@@ -264,8 +264,8 @@ static const unsigned armv7_a9_perf_map[PERF_COUNT_HW_MAX] = { [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, [PERF_COUNT_HW_INSTRUCTIONS ] = ARMV7_PERFCTR_INST_OUT_OF_RENAME_STAGE, - [PERF_COUNT_HW_CACHE_REFERENCES] = ARMV7_PERFCTR_COHERENT_LINE_HIT, - [PERF_COUNT_HW_CACHE_MISSES] = ARMV7_PERFCTR_COHERENT_LINE_MISS, + [PERF_COUNT_HW_CACHE_REFERENCES] = ARMV7_PERFCTR_DCACHE_ACCESS, + [PERF_COUNT_HW_CACHE_MISSES] = ARMV7_PERFCTR_DCACHE_REFILL, [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_WRITE, [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, [PERF_COUNT_HW_BUS_CYCLES] = ARMV7_PERFCTR_CLOCK_CYCLES,
arch/arm/mm/init.c +7 -0
@@ -473,6 +473,13 @@ static void __init free_unused_memmap(struct meminfo *mi)*/ bank_start =min (bank_start,ALIGN (prev_bank_end,PAGES_PER_SECTION )); +#else +/* +* Align down here since the VM subsystem insists that the +* memmap entries are valid from the bank start aligned to +* MAX_ORDER_NR_PAGES. +*/ + bank_start =round_down (bank_start,MAX_ORDER_NR_PAGES );#endif /* * If we had a previous bank, and there is a space
arch/x86/mm/init.c +1 -2
@@ -63,9 +63,8 @@ static void __init find_early_table_space(unsigned long end, int use_pse,#ifdef CONFIG_X86_32 /* for fixmap */ tables +=roundup (__end_of_fixed_addresses *sizeof (pte_t),PAGE_SIZE ); - - good_end = max_pfn_mapped <<PAGE_SHIFT ;#endif + good_end = max_pfn_mapped <<PAGE_SHIFT ; base =memblock_find_in_range (start, good_end, tables,PAGE_SIZE );if (base ==MEMBLOCK_ERROR )
crypto/ghash-generic.c +6 -0
@@ -67,6 +67,9 @@ static int ghash_update(struct shash_desc *desc,struct ghash_ctx *ctx =crypto_shash_ctx (desc->tfm);u8 *dst = dctx->buffer; +if (!ctx->gf128) +return -ENOKEY ; +if (dctx->bytes) {int n =min (srclen, dctx->bytes);u8 *pos = dst + (GHASH_BLOCK_SIZE - dctx->bytes);
@@ -119,6 +122,9 @@ static int ghash_final(struct shash_desc *desc, u8 *dst)struct ghash_ctx *ctx =crypto_shash_ctx (desc->tfm);u8 *buf = dctx->buffer; +if (!ctx->gf128) +return -ENOKEY ; +ghash_flush (ctx, dctx);memcpy (dst, buf,GHASH_BLOCK_SIZE );
drivers/firewire/sbp2.c +4 -0
@@ -1198,6 +1198,10 @@ static int sbp2_remove(struct device *dev) {struct fw_unit *unit =fw_unit (dev);struct sbp2_target *tgt =dev_get_drvdata (&unit->device); +struct sbp2_logical_unit *lu; + +list_for_each_entry (lu, &tgt->lu_list, link) +cancel_delayed_work_sync (&lu->work);sbp2_target_put (tgt);return 0 ;
drivers/gpu/drm/radeon/atom.c +13 -2
@@ -277,7 +277,12 @@ static uint32_t atom_get_src_int(atom_exec_context *ctx, uint8_t attr,case ATOM_ARG_FB : idx =U8 (*ptr); (*ptr)++; - val = gctx->scratch[((gctx->fb_base + idx) /4 )]; +if ((gctx->fb_base + (idx *4 )) > gctx->scratch_size_bytes) { +DRM_ERROR ("ATOM: fb read beyond scratch region: %d vs. %d\n" , + gctx->fb_base + (idx *4 ), gctx->scratch_size_bytes); + val =0 ; + }else + val = gctx->scratch[(gctx->fb_base /4 ) + idx];if (print)DEBUG ("FB[0x%02X]" , idx);break ;
@@ -531,7 +536,11 @@ static void atom_put_dst(atom_exec_context *ctx, int arg, uint8_t attr,case ATOM_ARG_FB : idx =U8 (*ptr); (*ptr)++; - gctx->scratch[((gctx->fb_base + idx) /4 )] = val; +if ((gctx->fb_base + (idx *4 )) > gctx->scratch_size_bytes) { +DRM_ERROR ("ATOM: fb write beyond scratch region: %d vs. %d\n" , + gctx->fb_base + (idx *4 ), gctx->scratch_size_bytes); + }else + gctx->scratch[(gctx->fb_base /4 ) + idx] = val;DEBUG ("FB[0x%02X]" , idx);break ;case ATOM_ARG_PLL :
@@ -1367,11 +1376,13 @@ int atom_allocate_fb_scratch(struct atom_context *ctx) usage_bytes = firmware_usage->asFirmwareVramReserveInfo[0 ].usFirmwareUseInKb *1024 ; } + ctx->scratch_size_bytes =0 ;if (usage_bytes ==0 ) usage_bytes =20 *1024 ;/* allocate some scratch memory */ ctx->scratch =kzalloc (usage_bytes,GFP_KERNEL );if (!ctx->scratch)return -ENOMEM ; + ctx->scratch_size_bytes = usage_bytes;return 0 ; }
drivers/gpu/drm/radeon/atom.h +1 -0
@@ -137,6 +137,7 @@ struct atom_context {int cs_equal, cs_above;int io_mode;uint32_t *scratch; +int scratch_size_bytes; };extern int atom_debug;
drivers/gpu/drm/ttm/ttm_bo.c +6 -4
@@ -392,10 +392,12 @@ static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo,* Create and bind a ttm if required. */ -if (!(new_man->flags &TTM_MEMTYPE_FLAG_FIXED ) && (bo->ttm ==NULL )) { - ret =ttm_bo_add_ttm (bo, false); -if (ret) - goto out_err; +if (!(new_man->flags &TTM_MEMTYPE_FLAG_FIXED )) { +if (bo->ttm ==NULL ) { + ret =ttm_bo_add_ttm (bo, false); +if (ret) + goto out_err; + } ret =ttm_tt_set_placement_caching (bo->ttm, mem->placement);if (ret)
drivers/gpu/drm/ttm/ttm_bo_util.c +1 -1
@@ -635,13 +635,13 @@ int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo,if (ret)return ret; -ttm_bo_free_old_node (bo);if ((man->flags &TTM_MEMTYPE_FLAG_FIXED ) && (bo->ttm !=NULL )) {ttm_tt_unbind (bo->ttm);ttm_tt_destroy (bo->ttm); bo->ttm =NULL ; } +ttm_bo_free_old_node (bo); }else {/** * This should help pipeline ordinary buffer moves.
drivers/hid/hid-ids.h +3 -0
@@ -568,6 +568,9 @@#define USB_DEVICE_ID_SAMSUNG_IR_REMOTE 0x0001#define USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE 0x0600 +#define USB_VENDOR_ID_SIGMA_MICRO 0x1c4f +#define USB_DEVICE_ID_SIGMA_MICRO_KEYBOARD 0x0002 +#define USB_VENDOR_ID_SKYCABLE 0x1223#define USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER 0x3F07
drivers/hid/hid-magicmouse.c +9 -1
@@ -501,9 +501,17 @@ static int magicmouse_probe(struct hid_device *hdev, } report->size =6 ; +/* +* Some devices repond with 'invalid report id' when feature +* report switching it into multitouch mode is sent to it. +* +* This results in -EIO from the _raw low-level transport callback, +* but there seems to be no other way of switching the mode. +* Thus the super-ugly hacky success check below. +*/ ret = hdev->hid_output_raw_report (hdev, feature,sizeof (feature),HID_FEATURE_REPORT ); -if (ret !=sizeof (feature)) { +if (ret != -EIO && ret !=sizeof (feature)) {hid_err (hdev,"unable to request touch data (%d)\n" , ret); goto err_stop_hw; }
drivers/hid/usbhid/hid-quirks.c +1 -0
@@ -89,6 +89,7 @@ static const struct hid_blacklist { { USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_MULTI_TOUCH, HID_QUIRK_MULTI_INPUT }, { USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS, HID_QUIRK_MULTI_INPUT }, + { USB_VENDOR_ID_SIGMA_MICRO, USB_DEVICE_ID_SIGMA_MICRO_KEYBOARD, HID_QUIRK_NO_INIT_REPORTS }, { 0, 0 } };
drivers/hwmon/w83627ehf.c +14 -6
@@ -390,7 +390,7 @@ temp_from_reg(u16 reg, s16 regval) {if (is_word_sized (reg))return LM75_TEMP_FROM_REG (regval); -return regval *1000 ; +return ((s8 )regval) *1000 ; } static inline u16
@@ -398,7 +398,8 @@ temp_to_reg(u16 reg, long temp) {if (is_word_sized (reg))return LM75_TEMP_TO_REG (temp); -return DIV_ROUND_CLOSEST (SENSORS_LIMIT (temp,-127000 ,128000 ),1000 ); +return (s8 )DIV_ROUND_CLOSEST (SENSORS_LIMIT (temp,-127000 ,128000 ), +1000 ); }/* Some of analog inputs have internal scaling (2x), 8mV is ADC LSB */
@@ -1715,7 +1716,8 @@ static void w83627ehf_device_remove_files(struct device *dev) }/* Get the monitoring functions started */ -static inline void __devinit w83627ehf_init_device (struct w83627ehf_data *data) +static inline void __devinit w83627ehf_init_device (struct w83627ehf_data *data, +enum kinds kind) {int i;u8 tmp, diode;
@@ -1746,10 +1748,16 @@ static inline void __devinit w83627ehf_init_device(struct w83627ehf_data *data)w83627ehf_write_value (data,W83627EHF_REG_VBAT , tmp |0x01 );/* Get thermal sensor types */ - diode =w83627ehf_read_value (data,W83627EHF_REG_DIODE ); +switch (kind) { +case w83627ehf: + diode =w83627ehf_read_value (data,W83627EHF_REG_DIODE ); +break ; +default : + diode =0x70 ; + }for (i =0 ; i <3 ; i++) {if ((tmp & (0x02 << i))) - data->temp_type[i] = (diode & (0x10 << i)) ?1 :2 ; + data->temp_type[i] = (diode & (0x10 << i)) ?1 :3 ;else data->temp_type[i] =4 ;/* thermistor */ }
@@ -2016,7 +2024,7 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev) }/* Initialize the chip */ -w83627ehf_init_device (data); +w83627ehf_init_device (data, sio_data->kind); data->vrm =vid_which_vrm ();superio_enter (sio_data->sioreg);
drivers/media/video/uvc/uvc_entity.c +1 -1
@@ -49,7 +49,7 @@ static int uvc_mc_register_entity(struct uvc_video_chain *chain,if (remote ==NULL )return -EINVAL ; - source = (UVC_ENTITY_TYPE (remote) !=UVC_TT_STREAMING ) + source = (UVC_ENTITY_TYPE (remote) ==UVC_TT_STREAMING ) ? (remote->vdev ? &remote->vdev->entity :NULL ) : &remote->subdev.entity;if (source ==NULL )
drivers/platform/x86/samsung-laptop.c +10 -0
@@ -601,6 +601,16 @@ static struct dmi_system_id __initdata samsung_dmi_table[] = { .callback = dmi_check_cb, }, { + .ident = "N150/N210/N220", + .matches = { +DMI_MATCH (DMI_SYS_VENDOR , +"SAMSUNG ELECTRONICS CO., LTD." ), +DMI_MATCH (DMI_PRODUCT_NAME ,"N150/N210/N220" ), + DMI_MATCH(DMI_BOARD_NAME, "N150/N210/N220"), + }, + .callback = dmi_check_cb, + }, + { .ident ="N150/N210/N220/N230" , .matches = { DMI_MATCH(DMI_SYS_VENDOR,
fs/cifs/cifsfs.c +6 -4
@@ -566,6 +566,12 @@ cifs_get_root(struct smb_vol *vol, struct super_block *sb)struct inode *dir = dentry->d_inode;struct dentry *child; +if (!dir) { +dput (dentry); + dentry =ERR_PTR (-ENOENT ); +break ; + } +/* skip separators */ while (*s == sep) s++;
@@ -581,10 +587,6 @@ cifs_get_root(struct smb_vol *vol, struct super_block *sb)mutex_unlock (&dir->i_mutex);dput (dentry); dentry = child; -if (!dentry->d_inode) { -dput (dentry); - dentry =ERR_PTR (-ENOENT ); - } }while (!IS_ERR (dentry));_FreeXid (xid);kfree (full_path);
fs/fuse/dev.c +8 -4
@@ -258,10 +258,14 @@ void fuse_queue_forget(struct fuse_conn *fc, struct fuse_forget_link *forget, forget->forget_one.nlookup = nlookup;spin_lock (&fc->lock); - fc->forget_list_tail->next = forget; - fc->forget_list_tail = forget; -wake_up (&fc->waitq); -kill_fasync (&fc->fasync,SIGIO ,POLL_IN ); +if (fc->connected) { + fc->forget_list_tail->next = forget; + fc->forget_list_tail = forget; +wake_up (&fc->waitq); +kill_fasync (&fc->fasync,SIGIO ,POLL_IN ); + }else { +kfree (forget); + }spin_unlock (&fc->lock); }
fs/hfsplus/hfsplus_fs.h +14 -2
@@ -13,6 +13,7 @@#include <linux/fs.h> #include <linux/mutex.h> #include <linux/buffer_head.h> +#include <linux/blkdev.h> #include "hfsplus_raw.h" #define DBG_BNODE_REFS 0x00000001
@@ -110,7 +111,9 @@ struct hfsplus_vh;struct hfs_btree ;struct hfsplus_sb_info { +void *s_vhdr_buf;struct hfsplus_vh *s_vhdr; +void *s_backup_vhdr_buf;struct hfsplus_vh *s_backup_vhdr;struct hfs_btree *ext_tree;struct hfs_btree *cat_tree;
@@ -258,6 +261,15 @@ struct hfsplus_readdir_data {struct hfsplus_cat_key key; }; +/* +* Find minimum acceptible I/O size for an hfsplus sb. +*/ +static inline unsigned short hfsplus_min_io_size (struct super_block *sb) +{ + return max_t(unsigned short, bdev_logical_block_size(sb->s_bdev), +HFSPLUS_SECTOR_SIZE ); +} +#define hfs_btree_open hfsplus_btree_open#define hfs_btree_close hfsplus_btree_close#define hfs_btree_write hfsplus_btree_write
@@ -436,8 +448,8 @@ int hfsplus_compare_dentry(const struct dentry *parent,/* wrapper.c */ int hfsplus_read_wrapper (struct super_block *);int hfs_part_find (struct super_block *,sector_t *,sector_t *); -int hfsplus_submit_bio (struct block_device *bdev,sector_t sector, -void *data,int rw); +int hfsplus_submit_bio (struct super_block *sb,sector_t sector, +void *buf,void **data,int rw);/* time macros */ #define __hfsp_mt2ut (t) (be32_to_cpu(t) - 2082844800U)
fs/hfsplus/part_tbl.c +18 -14
@@ -88,11 +88,12 @@ static int hfs_parse_old_pmap(struct super_block *sb, struct old_pmap *pm,return -ENOENT ; } -static int hfs_parse_new_pmap (struct super_block *sb,struct new_pmap *pm, -sector_t *part_start,sector_t *part_size) +static int hfs_parse_new_pmap (struct super_block *sb,void *buf, +struct new_pmap *pm,sector_t *part_start,sector_t *part_size) {struct hfsplus_sb_info *sbi =HFSPLUS_SB (sb);int size =be32_to_cpu (pm->pmMapBlkCnt); +int buf_size =hfsplus_min_io_size (sb);int res;int i =0 ;
@@ -107,11 +108,14 @@ static int hfs_parse_new_pmap(struct super_block *sb, struct new_pmap *pm,if (++i >= size)return -ENOENT ; - res =hfsplus_submit_bio (sb->s_bdev, - *part_start +HFS_PMAP_BLK + i, - pm,READ ); -if (res) -return res; + pm = (struct new_pmap *)((u8 *)pm +HFSPLUS_SECTOR_SIZE ); +if ((u8 *)pm - (u8 *)buf >= buf_size) { + res =hfsplus_submit_bio (sb, + *part_start +HFS_PMAP_BLK + i, + buf, (void **)&pm,READ ); +if (res) +return res; + } }while (pm->pmSig ==cpu_to_be16 (HFS_NEW_PMAP_MAGIC ));return -ENOENT ;
@@ -124,15 +128,15 @@ static int hfs_parse_new_pmap(struct super_block *sb, struct new_pmap *pm,int hfs_part_find (struct super_block *sb,sector_t *part_start,sector_t *part_size) { -void *data; +void *buf, *data;int res; - data =kmalloc (HFSPLUS_SECTOR_SIZE ,GFP_KERNEL ); -if (!data) + buf =kmalloc (hfsplus_min_io_size (sb),GFP_KERNEL ); +if (!buf)return -ENOMEM ; - res =hfsplus_submit_bio (sb->s_bdev, *part_start +HFS_PMAP_BLK , - data,READ ); + res =hfsplus_submit_bio (sb, *part_start +HFS_PMAP_BLK , + buf, &data,READ );if (res) goto out;
@@ -141,13 +145,13 @@ int hfs_part_find(struct super_block *sb, res =hfs_parse_old_pmap (sb, data, part_start, part_size);break ;case HFS_NEW_PMAP_MAGIC : - res =hfs_parse_new_pmap (sb, data, part_start, part_size); + res =hfs_parse_new_pmap (sb, buf, data, part_start, part_size);break ;default : res = -ENOENT ;break ; } out: -kfree (data); +kfree (buf);return res; }
fs/hfsplus/super.c +8 -8
@@ -197,17 +197,17 @@ int hfsplus_sync_fs(struct super_block *sb, int wait) write_backup =1 ; } - error2 =hfsplus_submit_bio (sb->s_bdev, + error2 =hfsplus_submit_bio (sb, sbi->part_start +HFSPLUS_VOLHEAD_SECTOR , - sbi->s_vhdr,WRITE_SYNC ); + sbi->s_vhdr_buf,NULL ,WRITE_SYNC );if (!error) error = error2;if (!write_backup) goto out; - error2 =hfsplus_submit_bio (sb->s_bdev, + error2 =hfsplus_submit_bio (sb, sbi->part_start + sbi->sect_count -2 , - sbi->s_backup_vhdr,WRITE_SYNC ); + sbi->s_backup_vhdr_buf,NULL ,WRITE_SYNC );if (!error) error2 = error; out:
@@ -251,8 +251,8 @@ static void hfsplus_put_super(struct super_block *sb)hfs_btree_close (sbi->ext_tree);iput (sbi->alloc_file);iput (sbi->hidden_dir); -kfree (sbi->s_vhdr); -kfree (sbi->s_backup_vhdr); +kfree (sbi->s_vhdr_buf); +kfree (sbi->s_backup_vhdr_buf);unload_nls (sbi->nls);kfree (sb->s_fs_info); sb->s_fs_info =NULL ;
@@ -508,8 +508,8 @@ out_close_cat_tree: out_close_ext_tree:hfs_btree_close (sbi->ext_tree); out_free_vhdr: -kfree (sbi->s_vhdr); -kfree (sbi->s_backup_vhdr); +kfree (sbi->s_vhdr_buf); +kfree (sbi->s_backup_vhdr_buf); out_unload_nls:unload_nls (sbi->nls);unload_nls (nls);
fs/hfsplus/wrapper.c +65 -22
133 lines not on this page · raw message
fs/xfs/linux-2.6/xfs_linux.h +2 -0
@@ -70,6 +70,8 @@#include <linux/ctype.h> #include <linux/writeback.h> #include <linux/capability.h> +#include <linux/kthread.h> +#include <linux/freezer.h> #include <linux/list_sort.h> #include <asm/page.h>
fs/xfs/linux-2.6/xfs_super.c +15 -33
93 lines not on this page · raw message
fs/xfs/quota/xfs_dquot_item.c +7 -3
@@ -183,13 +183,14 @@ xfs_qm_dqunpin_wait(* search the buffer cache can be a time consuming thing, and AIL lock is a * spinlock. */ -STATIC void +STATIC boolxfs_qm_dquot_logitem_pushbuf (struct xfs_log_item *lip) {struct xfs_dq_logitem *qlip =DQUOT_ITEM (lip);struct xfs_dquot *dqp = qlip->qli_dquot;struct xfs_buf *bp; +bool ret = true;ASSERT (XFS_DQ_IS_LOCKED (dqp));
@@ -201,17 +202,20 @@ xfs_qm_dquot_logitem_pushbuf(if (completion_done (&dqp->q_flush) || !(lip->li_flags &XFS_LI_IN_AIL )) {xfs_dqunlock (dqp); -return ; +return true; } bp =xfs_incore (dqp->q_mount->m_ddev_targp, qlip->qli_format.qlf_blkno, dqp->q_mount->m_quotainfo->qi_dqchunklen,XBF_TRYLOCK );xfs_dqunlock (dqp);if (!bp) -return ; +return true;if (XFS_BUF_ISDELAYWRITE (bp))xfs_buf_delwri_promote (bp); +if (XFS_BUF_ISPINNED (bp)) + ret = false;xfs_buf_relse (bp); +return ret; }/*
fs/xfs/xfs_buf_item.c +2 -1
@@ -632,7 +632,7 @@ xfs_buf_item_push(* the xfsbufd to get this buffer written. We have to unlock the buffer * to allow the xfsbufd to write it, too. */ -STATIC void +STATIC boolxfs_buf_item_pushbuf (struct xfs_log_item *lip) {
@@ -646,6 +646,7 @@ xfs_buf_item_pushbuf(xfs_buf_delwri_promote (bp);xfs_buf_relse (bp); +return true; }STATIC void
fs/xfs/xfs_inode_item.c +7 -3
@@ -713,13 +713,14 @@ xfs_inode_item_committed(* marked delayed write. If that's the case, we'll promote it and that will * allow the caller to write the buffer by triggering the xfsbufd to run. */ -STATIC void +STATIC boolxfs_inode_item_pushbuf (struct xfs_log_item *lip) {struct xfs_inode_log_item *iip =INODE_ITEM (lip);struct xfs_inode *ip = iip->ili_inode;struct xfs_buf *bp; +bool ret = true;ASSERT (xfs_isilocked (ip,XFS_ILOCK_SHARED ));
@@ -730,7 +731,7 @@ xfs_inode_item_pushbuf(if (completion_done (&ip->i_flush) || !(lip->li_flags &XFS_LI_IN_AIL )) {xfs_iunlock (ip,XFS_ILOCK_SHARED ); -return ; +return true; } bp = xfs_incore(ip->i_mount->m_ddev_targp, iip->ili_format.ilf_blkno,
@@ -738,10 +739,13 @@ xfs_inode_item_pushbuf(xfs_iunlock (ip,XFS_ILOCK_SHARED );if (!bp) -return ; +return true;if (XFS_BUF_ISDELAYWRITE (bp))xfs_buf_delwri_promote (bp); +if (XFS_BUF_ISPINNED (bp)) + ret = false;xfs_buf_relse (bp); +return ret; }/*
fs/xfs/xfs_trans.c +23 -4
@@ -1426,6 +1426,7 @@ xfs_trans_committed(static inline void xfs_log_item_batch_insert (struct xfs_ail *ailp, +struct xfs_ail_cursor *cur,struct xfs_log_item **log_items,int nr_items,xfs_lsn_t commit_lsn)
@@ -1434,7 +1435,7 @@ xfs_log_item_batch_insert(spin_lock (&ailp->xa_lock);/* xfs_trans_ail_update_bulk drops ailp->xa_lock */ -xfs_trans_ail_update_bulk (ailp, log_items, nr_items, commit_lsn); +xfs_trans_ail_update_bulk (ailp, cur, log_items, nr_items, commit_lsn);for (i =0 ; i < nr_items; i++)IOP_UNPIN (log_items[i],0 );
@@ -1452,6 +1453,13 @@ xfs_log_item_batch_insert(* as an iclog write error even though we haven't started any IO yet. Hence in * this case all we need to do is IOP_COMMITTED processing, followed by an * IOP_UNPIN(aborted) call. +* +* The AIL cursor is used to optimise the insert process. If commit_lsn is not +* at the end of the AIL, the insert cursor avoids the need to walk +* the AIL to find the insertion point on every xfs_log_item_batch_insert() +* call. This saves a lot of needless list walking and is a net win, even +* though it slightly increases that amount of AIL lock traffic to set it up +* and tear it down. */ void xfs_trans_committed_bulk(
@@ -1463,8 +1471,13 @@ xfs_trans_committed_bulk(#define LOG_ITEM_BATCH_SIZE 32struct xfs_log_item *log_items[LOG_ITEM_BATCH_SIZE ];struct xfs_log_vec *lv; +struct xfs_ail_cursor cur;int i =0 ; +spin_lock (&ailp->xa_lock); +xfs_trans_ail_cursor_last (ailp, &cur, commit_lsn); +spin_unlock (&ailp->xa_lock); +/* unpin all the log items */ for (lv = log_vector; lv; lv = lv->lv_next ) {struct xfs_log_item *lip = lv->lv_item;
@@ -1493,7 +1506,9 @@ xfs_trans_committed_bulk(/* * Not a bulk update option due to unusual item_lsn. * Push into AIL immediately, rechecking the lsn once -* we have the ail lock. Then unpin the item. +* we have the ail lock. Then unpin the item. This does +* not affect the AIL cursor the bulk insert path is +* using. */ spin_lock (&ailp->xa_lock);if (XFS_LSN_CMP (item_lsn, lip->li_lsn) >0 )
@@ -1507,7 +1522,7 @@ xfs_trans_committed_bulk(/* Item is a candidate for bulk AIL insert. */ log_items[i++] = lv->lv_item;if (i >=LOG_ITEM_BATCH_SIZE ) { -xfs_log_item_batch_insert (ailp, log_items, +xfs_log_item_batch_insert (ailp, &cur, log_items,LOG_ITEM_BATCH_SIZE , commit_lsn); i =0 ; }
@@ -1515,7 +1530,11 @@ xfs_trans_committed_bulk(/* make sure we insert the remainder! */ if (i) -xfs_log_item_batch_insert (ailp, log_items, i, commit_lsn); +xfs_log_item_batch_insert (ailp, &cur, log_items, i, commit_lsn); + +spin_lock (&ailp->xa_lock); +xfs_trans_ail_cursor_done (ailp, &cur); +spin_unlock (&ailp->xa_lock); }/*
fs/xfs/xfs_trans.h +1 -1
@@ -350,7 +350,7 @@ typedef struct xfs_item_ops {void (*iop_unlock)(xfs_log_item_t *);xfs_lsn_t (*iop_committed)(xfs_log_item_t *,xfs_lsn_t );void (*iop_push)(xfs_log_item_t *); -void (*iop_pushbuf)(xfs_log_item_t *); +bool (*iop_pushbuf)(xfs_log_item_t *);void (*iop_committing)(xfs_log_item_t *,xfs_lsn_t ); } xfs_item_ops_t;
fs/xfs/xfs_trans_ail.c +136 -56
280 lines not on this page · raw message
fs/xfs/xfs_trans_priv.h +8 -10
@@ -64,24 +64,19 @@ struct xfs_ail_cursor {*/ struct xfs_ail {struct xfs_mount *xa_mount; +struct task_struct *xa_task;struct list_head xa_ail;xfs_lsn_t xa_target;struct xfs_ail_cursor xa_cursors;spinlock_t xa_lock; -struct delayed_work xa_work;xfs_lsn_t xa_last_pushed_lsn; -unsigned long xa_flags; }; -#define XFS_AIL_PUSHING_BIT 0 -/* * From xfs_trans_ail.c */ - -extern struct workqueue_struct *xfs_ail_wq;/* AIL workqueue */ - void xfs_trans_ail_update_bulk(struct xfs_ail *ailp, + struct xfs_ail_cursor *cur, struct xfs_log_item **log_items, int nr_items, xfs_lsn_t lsn) __releases(ailp->xa_lock); static inline void
@@ -90,7 +85,7 @@ xfs_trans_ail_update(struct xfs_log_item *lip, xfs_lsn_t lsn) __releases(ailp->xa_lock) { - xfs_trans_ail_update_bulk(ailp, &lip, 1, lsn); + xfs_trans_ail_update_bulk(ailp, NULL, &lip, 1, lsn); } void xfs_trans_ail_delete_bulk(struct xfs_ail *ailp,
@@ -111,10 +106,13 @@ xfs_lsn_t xfs_ail_min_lsn(struct xfs_ail *ailp);void xfs_trans_unlocked_item (struct xfs_ail *,xfs_log_item_t *); -struct xfs_log_item *xfs_trans_ail_cursor_first (struct xfs_ail *ailp, +struct xfs_log_item *xfs_trans_ail_cursor_first (struct xfs_ail *ailp, +struct xfs_ail_cursor *cur, +xfs_lsn_t lsn); +struct xfs_log_item *xfs_trans_ail_cursor_last (struct xfs_ail *ailp,struct xfs_ail_cursor *cur,xfs_lsn_t lsn); -struct xfs_log_item *xfs_trans_ail_cursor_next (struct xfs_ail *ailp, +struct xfs_log_item *xfs_trans_ail_cursor_next (struct xfs_ail *ailp,struct xfs_ail_cursor *cur);void xfs_trans_ail_cursor_done (struct xfs_ail *ailp,struct xfs_ail_cursor *cur);
kernel/posix-cpu-timers.c +4 -3
@@ -274,9 +274,7 @@ void thread_group_cputimer(struct task_struct *tsk, struct task_cputime *times)struct task_cputime sum;unsigned long flags; -spin_lock_irqsave (&cputimer->lock, flags);if (!cputimer->running) { - cputimer->running =1 ;/* * The POSIX timer interface allows for absolute time expiry * values through the TIMER_ABSTIME flag, therefore we have
@@ -284,8 +282,11 @@ void thread_group_cputimer(struct task_struct *tsk, struct task_cputime *times)* it. */ thread_group_cputime (tsk, &sum); +spin_lock_irqsave (&cputimer->lock, flags); + cputimer->running =1 ;update_gt_cputime (&cputimer->cputime, &sum); - } + }else +spin_lock_irqsave (&cputimer->lock, flags); *times = cputimer->cputime;spin_unlock_irqrestore (&cputimer->lock, flags); }
kernel/sys.c +1 -1
@@ -1135,7 +1135,7 @@ DECLARE_RWSEM(uts_sem);static int override_release (char __user *release,int len) {int ret =0 ; -char buf[len]; +char buf[65 ];if (current->personality &UNAME26 ) {char *rest =UTS_RELEASE ;
mm/migrate.c +4 -4
@@ -120,10 +120,10 @@ static int remove_migration_pte(struct page *new, struct vm_area_struct *vma, ptep =pte_offset_map (pmd, addr); -if (!is_swap_pte (*ptep)) { -pte_unmap (ptep); - goto out; - } +/* +* Peek to check is_swap_pte() before taking ptlock? No, we +* can race mremap's move_ptes(), which skips anon_vma lock. +*/ ptl =pte_lockptr (mm, pmd); }
net/x25/af_x25.c +2 -1
@@ -295,7 +295,8 @@ static struct sock *x25_find_listener(struct x25_address *addr,* Found a listening socket, now check the incoming * call user data vs this sockets call user data */ -if (skb->len >0 &&x25_sk (s)->cudmatchlength >0 ) { +if (x25_sk (s)->cudmatchlength >0 && + skb->len >=x25_sk (s)->cudmatchlength) {if ((memcmp (x25_sk (s)->calluserdata.cuddata, skb->data,x25_sk (s)->cudmatchlength)) ==0 ) {
sound/pci/hda/hda_intel.c +1 -0
@@ -2352,6 +2352,7 @@ static struct snd_pci_quirk position_fix_list[] __devinitdata = {SND_PCI_QUIRK (0x1028 ,0x01cc ,"Dell D820" ,POS_FIX_LPIB ),SND_PCI_QUIRK (0x1028 ,0x01de ,"Dell Precision 390" ,POS_FIX_LPIB ),SND_PCI_QUIRK (0x1028 ,0x01f6 ,"Dell Latitude 131L" ,POS_FIX_LPIB ), +SND_PCI_QUIRK (0x1028 ,0x02c6 ,"Dell Inspiron 1010" ,POS_FIX_LPIB ),SND_PCI_QUIRK (0x1028 ,0x0470 ,"Dell Inspiron 1120" ,POS_FIX_LPIB ),SND_PCI_QUIRK (0x103c ,0x306d ,"HP dv3" ,POS_FIX_LPIB ), SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB),
sound/pci/hda/patch_conexant.c +1 -0
@@ -3097,6 +3097,7 @@ static const struct snd_pci_quirk cxt5066_cfg_tbl[] = {SND_PCI_QUIRK (0x17aa ,0x21c5 ,"Thinkpad Edge 13" ,CXT5066_THINKPAD ),SND_PCI_QUIRK (0x17aa ,0x21c6 ,"Thinkpad Edge 13" ,CXT5066_ASUS ),SND_PCI_QUIRK (0x17aa ,0x215e ,"Lenovo Thinkpad" ,CXT5066_THINKPAD ), +SND_PCI_QUIRK (0x17aa ,0x21cf ,"Lenovo T520 & W520" ,CXT5066_AUTO ),SND_PCI_QUIRK (0x17aa ,0x21da ,"Lenovo X220" ,CXT5066_THINKPAD ),SND_PCI_QUIRK (0x17aa ,0x21db ,"Lenovo X220-tablet" ,CXT5066_THINKPAD ), SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo U350", CXT5066_ASUS),
Quoted 3 lines · Greg KH
I'm announcing the release of the 3.0.8 kernel.
All users of the 3.0 kernel series must upgrade.
I noticed that "must" word in 3.0.7 also. Please explain.
Quoted 4 lines
The updated 3.0.y git tree can be found at (NOTE THE ADDRESS CHANGE):
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.gitlinux-3.0.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
Signature · 2 lines
~Randy *** Remember to use Documentation/SubmitChecklist when testing your code ***
Quoted 6 lines · Randy Dunlap
Quoted 3 lines · Greg KH
I'm announcing the release of the 3.0.8 kernel.
All users of the 3.0 kernel series must upgrade.
I noticed that "must" word in 3.0.7 also. Please explain.
Nothing new, I've been saying that for years.
greg k-h
Quoted 5 lines · Greg KH
Quoted 3 lines · Randy Dunlap
Quoted 1 line · Greg KH
All users of the 3.0 kernel series must upgrade.
I noticed that "must" word in 3.0.7 also. Please explain.
Nothing new, I've been saying that for years.
I think Randy means that out of the 29 commits for .7->.8, there's only one (Hugh Dicken's mremap fix) and *maybe* Peter Zijlstra's cputimer fix, which even *possibly* rise to the "all users" level, as everything else is against XFS or CIFS or ARM or something else that's not an across-the-board issue.
And the changelog for the mremap commit says that "but this lucky report hints", which sort of implies it's a very hard-to-hit bug that nobody even knew was there.
So it's not obvious from just the shortlog that it's a "MUST upgrade" category.
Quoted 12 lines · On Tue, 2011-10-25 at 04:41 -0400, [email protected] wrote:
Quoted 5 lines · Greg KH
Quoted 3 lines · Randy Dunlap
Quoted 1 line · Greg KH
All users of the 3.0 kernel series must upgrade.
I noticed that "must" word in 3.0.7 also. Please explain.
Nothing new, I've been saying that for years.
I think Randy means that out of the 29 commits for .7->.8, there's only one (Hugh Dicken's mremap fix) and *maybe* Peter Zijlstra's cputimer fix, which even *possibly* rise to the "all users" level, as everything else is against XFS or CIFS or ARM or something else that's not an across-the-board issue.
Quoted 5 lines
And the changelog for the mremap commit says that "but this lucky report hints", which sort of implies it's a very hard-to-hit bug that nobody even knew was there.
So it's not obvious from just the shortlog that it's a "MUST upgrade" category.
Seems like perfectly fine boilerplate to me. If I want the warmest fuzzy I can get, I must upgrade. Peter's patch fixed a box killer that I don't care to hit (dead bugs being kinda boring), so I must upgrade.
-Mike
Quoted 17 lines · Mike Galbraith
Quoted 16 lines · On Tue, 2011-10-25 at 04:41 -0400, [email protected] wrote:
Quoted 5 lines · Greg KH
Quoted 3 lines · Randy Dunlap
Quoted 1 line · Greg KH
All users of the 3.0 kernel series must upgrade.
I noticed that "must" word in 3.0.7 also. Please explain.
Nothing new, I've been saying that for years.
I think Randy means that out of the 29 commits for .7->.8, there's only one (Hugh Dicken's mremap fix) and *maybe* Peter Zijlstra's cputimer fix, which even *possibly* rise to the "all users" level, as everything else is against XFS or CIFS or ARM or something else that's not an across-the-board issue.
And the changelog for the mremap commit says that "but this lucky report hints", which sort of implies it's a very hard-to-hit bug that nobody even knew was there.
Quoted 5 lines
Quoted 1 line
So it's not obvious from just the shortlog that it's a "MUST upgrade" category.
Seems like perfectly fine boilerplate to me. If I want the warmest fuzzy I can get, I must upgrade. Peter's patch fixed a box killer that I don't care to hit (dead bugs being kinda boring), so I must upgrade.
Sure, if it's just boilerplate, that's fine.
My mistake was thinking that it was something new & different.
Signature · 2 lines
~Randy *** Remember to use Documentation/SubmitChecklist when testing your code ***
Quoted 4 lines · Greg KH
The updated 3.0.y git tree can be found at (NOTE THE ADDRESS CHANGE):
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.gitlinux-3.0.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
Somehow I seem to be able to generate perfect copies of patch-3.0.4.bz2 (and earlier), by simply doing a command like:
git diff v3.0 v3.04 | bzip2 -9 > patch-3.0.4-git.bz2
But for patch-3.0.5 (and above) trivial commands like
git diff v3.0 v3.0.8 > patch-3.0.8-git
do not generate perfect copies anymore. Have you perhaps changed the way you generate the patches since v3.0.5? Not that this matters much, since tags v3.0.5 (and up) are signed by your "Linux kernel stable release signing key", but I still wonder what could cause this difference. Maybe it's just a git upgrade on your side.
Paul Bolle
Quoted 10 lines · Paul Bolle
Quoted 4 lines · Greg KH
The updated 3.0.y git tree can be found at (NOTE THE ADDRESS CHANGE):
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.gitlinux-3.0.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=summarySomehow I seem to be able to generate perfect copies of patch-3.0.4.bz2 (and earlier), by simply doing a command like:
git diff v3.0 v3.04 | bzip2 -9 > patch-3.0.4-git.bz2
Quoted 8 lines
But for patch-3.0.5 (and above) trivial commands like
git diff v3.0 v3.0.8 > patch-3.0.8-gitdo not generate perfect copies anymore. Have you perhaps changed the way you generate the patches since v3.0.5? Not that this matters much, since tags v3.0.5 (and up) are signed by your "Linux kernel stable release signing key", but I still wonder what could cause this difference. Maybe it's just a git upgrade on your side.
We have found out that different versions of git will generate different patches. The end result of the patch when you apply it will always be the same, but this is a non-trivial problem to solve.
That's why we generate the patches on our local machine and upload them, instead of just generating the signature and having the server create it.
Can you verify that the end result from your patch, and my patch, produces the same tree? If not, we need to resolve that.
thanks,
greg k-h
Quoted 2 lines · Greg KH
Can you verify that the end result from your patch, and my patch, produces the same tree? If not, we need to resolve that.
Yes, they do produce the same tree.
Ie, if I commit the changes introduced by your patch-3.0.8 onto v3.0 I get a HEAD that is identical to v3.0.8 (as a git diff between these two shows nothing). And the (git diff) patches I can generate locally between v3.0 and either that HEAD or v3.0.8 are identical (but not identical to your patch-3.0.8, obviously).
So, it's just that git generated a different patch on your system than it does on mine.
Thanks,
Paul Bolle