diff options
| -rw-r--r-- | arch/arm/include/asm/io.h | 4 | ||||
| -rw-r--r-- | arch/arm/include/asm/sched_clock.h | 2 | ||||
| -rw-r--r-- | arch/arm/include/asm/vfpmacros.h | 12 | ||||
| -rw-r--r-- | arch/arm/include/uapi/asm/hwcap.h | 3 | ||||
| -rw-r--r-- | arch/arm/kernel/sched_clock.c | 18 | ||||
| -rw-r--r-- | arch/arm/mm/alignment.c | 2 | ||||
| -rw-r--r-- | arch/arm/vfp/vfpmodule.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_fops.c | 44 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 2 | ||||
| -rw-r--r-- | drivers/hwmon/asb100.c | 2 | ||||
| -rw-r--r-- | drivers/hwmon/w83627ehf.c | 1 | ||||
| -rw-r--r-- | drivers/hwmon/w83627hf.c | 2 | ||||
| -rw-r--r-- | drivers/hwmon/w83781d.c | 2 | ||||
| -rw-r--r-- | drivers/hwmon/w83791d.c | 2 | ||||
| -rw-r--r-- | drivers/hwmon/w83792d.c | 2 | ||||
| -rw-r--r-- | drivers/hwmon/w83l786ng.c | 2 | ||||
| -rw-r--r-- | fs/gfs2/file.c | 14 | ||||
| -rw-r--r-- | fs/gfs2/lops.c | 16 | ||||
| -rw-r--r-- | fs/gfs2/quota.c | 7 | ||||
| -rw-r--r-- | fs/gfs2/rgrp.c | 33 | ||||
| -rw-r--r-- | fs/gfs2/super.c | 3 | ||||
| -rw-r--r-- | fs/gfs2/trans.c | 8 | ||||
| -rw-r--r-- | fs/nfs/nfs4_fs.h | 2 | ||||
| -rw-r--r-- | fs/nfs/nfs4proc.c | 7 | ||||
| -rw-r--r-- | fs/nfs/nfs4xdr.c | 8 | ||||
| -rw-r--r-- | fs/nfs/write.c | 4 | ||||
| -rw-r--r-- | net/sunrpc/rpc_pipe.c | 7 | 
27 files changed, 122 insertions, 96 deletions
diff --git a/arch/arm/include/asm/io.h b/arch/arm/include/asm/io.h index 35c1ed89b93..42f042ee4ad 100644 --- a/arch/arm/include/asm/io.h +++ b/arch/arm/include/asm/io.h @@ -64,7 +64,7 @@ extern void __raw_readsl(const void __iomem *addr, void *data, int longlen);  static inline void __raw_writew(u16 val, volatile void __iomem *addr)  {  	asm volatile("strh %1, %0" -		     : "+Qo" (*(volatile u16 __force *)addr) +		     : "+Q" (*(volatile u16 __force *)addr)  		     : "r" (val));  } @@ -72,7 +72,7 @@ static inline u16 __raw_readw(const volatile void __iomem *addr)  {  	u16 val;  	asm volatile("ldrh %1, %0" -		     : "+Qo" (*(volatile u16 __force *)addr), +		     : "+Q" (*(volatile u16 __force *)addr),  		       "=r" (val));  	return val;  } diff --git a/arch/arm/include/asm/sched_clock.h b/arch/arm/include/asm/sched_clock.h index 05b8e82ec9f..e3f75726343 100644 --- a/arch/arm/include/asm/sched_clock.h +++ b/arch/arm/include/asm/sched_clock.h @@ -10,7 +10,5 @@  extern void sched_clock_postinit(void);  extern void setup_sched_clock(u32 (*read)(void), int bits, unsigned long rate); -extern void setup_sched_clock_needs_suspend(u32 (*read)(void), int bits, -		unsigned long rate);  #endif diff --git a/arch/arm/include/asm/vfpmacros.h b/arch/arm/include/asm/vfpmacros.h index 6a6f1e485f4..301c1db3e99 100644 --- a/arch/arm/include/asm/vfpmacros.h +++ b/arch/arm/include/asm/vfpmacros.h @@ -27,9 +27,9 @@  #if __LINUX_ARM_ARCH__ <= 6  	ldr	\tmp, =elf_hwcap		    @ may not have MVFR regs  	ldr	\tmp, [\tmp, #0] -	tst	\tmp, #HWCAP_VFPv3D16 -	ldceql	p11, cr0, [\base],#32*4		    @ FLDMIAD \base!, {d16-d31} -	addne	\base, \base, #32*4		    @ step over unused register space +	tst	\tmp, #HWCAP_VFPD32 +	ldcnel	p11, cr0, [\base],#32*4		    @ FLDMIAD \base!, {d16-d31} +	addeq	\base, \base, #32*4		    @ step over unused register space  #else  	VFPFMRX	\tmp, MVFR0			    @ Media and VFP Feature Register 0  	and	\tmp, \tmp, #MVFR0_A_SIMD_MASK	    @ A_SIMD field @@ -51,9 +51,9 @@  #if __LINUX_ARM_ARCH__ <= 6  	ldr	\tmp, =elf_hwcap		    @ may not have MVFR regs  	ldr	\tmp, [\tmp, #0] -	tst	\tmp, #HWCAP_VFPv3D16 -	stceql	p11, cr0, [\base],#32*4		    @ FSTMIAD \base!, {d16-d31} -	addne	\base, \base, #32*4		    @ step over unused register space +	tst	\tmp, #HWCAP_VFPD32 +	stcnel	p11, cr0, [\base],#32*4		    @ FSTMIAD \base!, {d16-d31} +	addeq	\base, \base, #32*4		    @ step over unused register space  #else  	VFPFMRX	\tmp, MVFR0			    @ Media and VFP Feature Register 0  	and	\tmp, \tmp, #MVFR0_A_SIMD_MASK	    @ A_SIMD field diff --git a/arch/arm/include/uapi/asm/hwcap.h b/arch/arm/include/uapi/asm/hwcap.h index f254f6503cc..3688fd15a32 100644 --- a/arch/arm/include/uapi/asm/hwcap.h +++ b/arch/arm/include/uapi/asm/hwcap.h @@ -18,11 +18,12 @@  #define HWCAP_THUMBEE	(1 << 11)  #define HWCAP_NEON	(1 << 12)  #define HWCAP_VFPv3	(1 << 13) -#define HWCAP_VFPv3D16	(1 << 14) +#define HWCAP_VFPv3D16	(1 << 14)	/* also set for VFPv4-D16 */  #define HWCAP_TLS	(1 << 15)  #define HWCAP_VFPv4	(1 << 16)  #define HWCAP_IDIVA	(1 << 17)  #define HWCAP_IDIVT	(1 << 18) +#define HWCAP_VFPD32	(1 << 19)	/* set if VFP has 32 regs (not 16) */  #define HWCAP_IDIV	(HWCAP_IDIVA | HWCAP_IDIVT) diff --git a/arch/arm/kernel/sched_clock.c b/arch/arm/kernel/sched_clock.c index e21bac20d90..fc6692e2b60 100644 --- a/arch/arm/kernel/sched_clock.c +++ b/arch/arm/kernel/sched_clock.c @@ -107,13 +107,6 @@ static void sched_clock_poll(unsigned long wrap_ticks)  	update_sched_clock();  } -void __init setup_sched_clock_needs_suspend(u32 (*read)(void), int bits, -		unsigned long rate) -{ -	setup_sched_clock(read, bits, rate); -	cd.needs_suspend = true; -} -  void __init setup_sched_clock(u32 (*read)(void), int bits, unsigned long rate)  {  	unsigned long r, w; @@ -189,18 +182,15 @@ void __init sched_clock_postinit(void)  static int sched_clock_suspend(void)  {  	sched_clock_poll(sched_clock_timer.data); -	if (cd.needs_suspend) -		cd.suspended = true; +	cd.suspended = true;  	return 0;  }  static void sched_clock_resume(void)  { -	if (cd.needs_suspend) { -		cd.epoch_cyc = read_sched_clock(); -		cd.epoch_cyc_copy = cd.epoch_cyc; -		cd.suspended = false; -	} +	cd.epoch_cyc = read_sched_clock(); +	cd.epoch_cyc_copy = cd.epoch_cyc; +	cd.suspended = false;  }  static struct syscore_ops sched_clock_ops = { diff --git a/arch/arm/mm/alignment.c b/arch/arm/mm/alignment.c index 023f443784e..b820edaf318 100644 --- a/arch/arm/mm/alignment.c +++ b/arch/arm/mm/alignment.c @@ -745,7 +745,7 @@ do_alignment_t32_to_handler(unsigned long *pinstr, struct pt_regs *regs,  static int  do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)  { -	union offset_union offset; +	union offset_union uninitialized_var(offset);  	unsigned long instr = 0, instrptr;  	int (*handler)(unsigned long addr, unsigned long instr, struct pt_regs *regs);  	unsigned int type; diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c index c834b32af27..3b44e0dd0a9 100644 --- a/arch/arm/vfp/vfpmodule.c +++ b/arch/arm/vfp/vfpmodule.c @@ -701,11 +701,14 @@ static int __init vfp_init(void)  			elf_hwcap |= HWCAP_VFPv3;  			/* -			 * Check for VFPv3 D16. CPUs in this configuration -			 * only have 16 x 64bit registers. +			 * Check for VFPv3 D16 and VFPv4 D16.  CPUs in +			 * this configuration only have 16 x 64bit +			 * registers.  			 */  			if (((fmrx(MVFR0) & MVFR0_A_SIMD_MASK)) == 1) -				elf_hwcap |= HWCAP_VFPv3D16; +				elf_hwcap |= HWCAP_VFPv3D16; /* also v4-D16 */ +			else +				elf_hwcap |= HWCAP_VFPD32;  		}  #endif  		/* diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c index 7ef1b673e1b..133b4132983 100644 --- a/drivers/gpu/drm/drm_fops.c +++ b/drivers/gpu/drm/drm_fops.c @@ -121,6 +121,8 @@ int drm_open(struct inode *inode, struct file *filp)  	int minor_id = iminor(inode);  	struct drm_minor *minor;  	int retcode = 0; +	int need_setup = 0; +	struct address_space *old_mapping;  	minor = idr_find(&drm_minors_idr, minor_id);  	if (!minor) @@ -132,23 +134,37 @@ int drm_open(struct inode *inode, struct file *filp)  	if (drm_device_is_unplugged(dev))  		return -ENODEV; +	if (!dev->open_count++) +		need_setup = 1; +	mutex_lock(&dev->struct_mutex); +	old_mapping = dev->dev_mapping; +	if (old_mapping == NULL) +		dev->dev_mapping = &inode->i_data; +	/* ihold ensures nobody can remove inode with our i_data */ +	ihold(container_of(dev->dev_mapping, struct inode, i_data)); +	inode->i_mapping = dev->dev_mapping; +	filp->f_mapping = dev->dev_mapping; +	mutex_unlock(&dev->struct_mutex); +  	retcode = drm_open_helper(inode, filp, dev); -	if (!retcode) { -		atomic_inc(&dev->counts[_DRM_STAT_OPENS]); -		if (!dev->open_count++) -			retcode = drm_setup(dev); -	} -	if (!retcode) { -		mutex_lock(&dev->struct_mutex); -		if (dev->dev_mapping == NULL) -			dev->dev_mapping = &inode->i_data; -		/* ihold ensures nobody can remove inode with our i_data */ -		ihold(container_of(dev->dev_mapping, struct inode, i_data)); -		inode->i_mapping = dev->dev_mapping; -		filp->f_mapping = dev->dev_mapping; -		mutex_unlock(&dev->struct_mutex); +	if (retcode) +		goto err_undo; +	atomic_inc(&dev->counts[_DRM_STAT_OPENS]); +	if (need_setup) { +		retcode = drm_setup(dev); +		if (retcode) +			goto err_undo;  	} +	return 0; +err_undo: +	mutex_lock(&dev->struct_mutex); +	filp->f_mapping = old_mapping; +	inode->i_mapping = old_mapping; +	iput(container_of(dev->dev_mapping, struct inode, i_data)); +	dev->dev_mapping = old_mapping; +	mutex_unlock(&dev->struct_mutex); +	dev->open_count--;  	return retcode;  }  EXPORT_SYMBOL(drm_open); diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 14313ad43b7..af31f829f4a 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c @@ -1372,7 +1372,7 @@ void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *s  	WREG32(BIF_FB_EN, FB_READ_EN | FB_WRITE_EN);  	for (i = 0; i < rdev->num_crtc; i++) { -		if (save->crtc_enabled) { +		if (save->crtc_enabled[i]) {  			if (ASIC_IS_DCE6(rdev)) {  				tmp = RREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i]);  				tmp |= EVERGREEN_CRTC_BLANK_DATA_EN; diff --git a/drivers/hwmon/asb100.c b/drivers/hwmon/asb100.c index a227be47149..520e5bf4f76 100644 --- a/drivers/hwmon/asb100.c +++ b/drivers/hwmon/asb100.c @@ -32,7 +32,7 @@   * ASB100-A supports pwm1, while plain ASB100 does not.  There is no known   * way for the driver to tell which one is there.   * - * Chip	#vin	#fanin	#pwm	#temp	wchipid	vendid	i2c	ISA + * Chip		#vin	#fanin	#pwm	#temp	wchipid	vendid	i2c	ISA   * asb100	7	3	1	4	0x31	0x0694	yes	no   */ diff --git a/drivers/hwmon/w83627ehf.c b/drivers/hwmon/w83627ehf.c index 1821b7423d5..de3c7e04c3b 100644 --- a/drivers/hwmon/w83627ehf.c +++ b/drivers/hwmon/w83627ehf.c @@ -2083,6 +2083,7 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev)  	mutex_init(&data->lock);  	mutex_init(&data->update_lock);  	data->name = w83627ehf_device_names[sio_data->kind]; +	data->bank = 0xff;		/* Force initial bank selection */  	platform_set_drvdata(pdev, data);  	/* 627EHG and 627EHF have 10 voltage inputs; 627DHG and 667HG have 9 */ diff --git a/drivers/hwmon/w83627hf.c b/drivers/hwmon/w83627hf.c index 5b1a6a66644..af158990870 100644 --- a/drivers/hwmon/w83627hf.c +++ b/drivers/hwmon/w83627hf.c @@ -25,7 +25,7 @@  /*   * Supports following chips:   * - * Chip	#vin	#fanin	#pwm	#temp	wchipid	vendid	i2c	ISA + * Chip		#vin	#fanin	#pwm	#temp	wchipid	vendid	i2c	ISA   * w83627hf	9	3	2	3	0x20	0x5ca3	no	yes(LPC)   * w83627thf	7	3	3	3	0x90	0x5ca3	no	yes(LPC)   * w83637hf	7	3	3	3	0x80	0x5ca3	no	yes(LPC) diff --git a/drivers/hwmon/w83781d.c b/drivers/hwmon/w83781d.c index 5a5046d94c3..20f11d31da4 100644 --- a/drivers/hwmon/w83781d.c +++ b/drivers/hwmon/w83781d.c @@ -24,7 +24,7 @@  /*   * Supports following chips:   * - * Chip	#vin	#fanin	#pwm	#temp	wchipid	vendid	i2c	ISA + * Chip		#vin	#fanin	#pwm	#temp	wchipid	vendid	i2c	ISA   * as99127f	7	3	0	3	0x31	0x12c3	yes	no   * as99127f rev.2 (type_name = as99127f)	0x31	0x5ca3	yes	no   * w83781d	7	3	0	3	0x10-1	0x5ca3	yes	yes diff --git a/drivers/hwmon/w83791d.c b/drivers/hwmon/w83791d.c index 39ab7bcc616..ed397c64519 100644 --- a/drivers/hwmon/w83791d.c +++ b/drivers/hwmon/w83791d.c @@ -22,7 +22,7 @@  /*   * Supports following chips:   * - * Chip	#vin	#fanin	#pwm	#temp	wchipid	vendid	i2c	ISA + * Chip		#vin	#fanin	#pwm	#temp	wchipid	vendid	i2c	ISA   * w83791d	10	5	5	3	0x71	0x5ca3	yes	no   *   * The w83791d chip appears to be part way between the 83781d and the diff --git a/drivers/hwmon/w83792d.c b/drivers/hwmon/w83792d.c index 053645279f3..301942d0845 100644 --- a/drivers/hwmon/w83792d.c +++ b/drivers/hwmon/w83792d.c @@ -31,7 +31,7 @@  /*   * Supports following chips:   * - * Chip	#vin	#fanin	#pwm	#temp	wchipid	vendid	i2c	ISA + * Chip		#vin	#fanin	#pwm	#temp	wchipid	vendid	i2c	ISA   * w83792d	9	7	7	3	0x7a	0x5ca3	yes	no   */ diff --git a/drivers/hwmon/w83l786ng.c b/drivers/hwmon/w83l786ng.c index f0e8286c3c7..79710bcac2f 100644 --- a/drivers/hwmon/w83l786ng.c +++ b/drivers/hwmon/w83l786ng.c @@ -20,7 +20,7 @@  /*   * Supports following chips:   * - * Chip	#vin	#fanin	#pwm	#temp	wchipid	vendid	i2c	ISA + * Chip		#vin	#fanin	#pwm	#temp	wchipid	vendid	i2c	ISA   * w83l786ng	3	2	2	2	0x7b	0x5ca3	yes	no   */ diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c index 0def0504afc..e056b4ce487 100644 --- a/fs/gfs2/file.c +++ b/fs/gfs2/file.c @@ -516,15 +516,13 @@ static int gfs2_mmap(struct file *file, struct vm_area_struct *vma)  		struct gfs2_holder i_gh;  		int error; -		gfs2_holder_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &i_gh); -		error = gfs2_glock_nq(&i_gh); -		if (error == 0) { -			file_accessed(file); -			gfs2_glock_dq(&i_gh); -		} -		gfs2_holder_uninit(&i_gh); +		error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, +					   &i_gh);  		if (error)  			return error; +		/* grab lock to update inode */ +		gfs2_glock_dq_uninit(&i_gh); +		file_accessed(file);  	}  	vma->vm_ops = &gfs2_vm_ops; @@ -677,10 +675,8 @@ static ssize_t gfs2_file_aio_write(struct kiocb *iocb, const struct iovec *iov,  	size_t writesize = iov_length(iov, nr_segs);  	struct dentry *dentry = file->f_dentry;  	struct gfs2_inode *ip = GFS2_I(dentry->d_inode); -	struct gfs2_sbd *sdp;  	int ret; -	sdp = GFS2_SB(file->f_mapping->host);  	ret = gfs2_rs_alloc(ip);  	if (ret)  		return ret; diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c index 8ff95a2d54e..9ceccb1595a 100644 --- a/fs/gfs2/lops.c +++ b/fs/gfs2/lops.c @@ -393,12 +393,10 @@ static void buf_lo_add(struct gfs2_sbd *sdp, struct gfs2_bufdata *bd)  	struct gfs2_meta_header *mh;  	struct gfs2_trans *tr; -	lock_buffer(bd->bd_bh); -	gfs2_log_lock(sdp);  	tr = current->journal_info;  	tr->tr_touched = 1;  	if (!list_empty(&bd->bd_list)) -		goto out; +		return;  	set_bit(GLF_LFLUSH, &bd->bd_gl->gl_flags);  	set_bit(GLF_DIRTY, &bd->bd_gl->gl_flags);  	mh = (struct gfs2_meta_header *)bd->bd_bh->b_data; @@ -414,9 +412,6 @@ static void buf_lo_add(struct gfs2_sbd *sdp, struct gfs2_bufdata *bd)  	sdp->sd_log_num_buf++;  	list_add(&bd->bd_list, &sdp->sd_log_le_buf);  	tr->tr_num_buf_new++; -out: -	gfs2_log_unlock(sdp); -	unlock_buffer(bd->bd_bh);  }  static void gfs2_check_magic(struct buffer_head *bh) @@ -621,7 +616,6 @@ static void revoke_lo_add(struct gfs2_sbd *sdp, struct gfs2_bufdata *bd)  static void revoke_lo_before_commit(struct gfs2_sbd *sdp)  { -	struct gfs2_log_descriptor *ld;  	struct gfs2_meta_header *mh;  	unsigned int offset;  	struct list_head *head = &sdp->sd_log_le_revoke; @@ -634,7 +628,6 @@ static void revoke_lo_before_commit(struct gfs2_sbd *sdp)  	length = gfs2_struct2blk(sdp, sdp->sd_log_num_revoke, sizeof(u64));  	page = gfs2_get_log_desc(sdp, GFS2_LOG_DESC_REVOKE, length, sdp->sd_log_num_revoke); -	ld = page_address(page);  	offset = sizeof(struct gfs2_log_descriptor);  	list_for_each_entry(bd, head, bd_list) { @@ -777,12 +770,10 @@ static void databuf_lo_add(struct gfs2_sbd *sdp, struct gfs2_bufdata *bd)  	struct address_space *mapping = bd->bd_bh->b_page->mapping;  	struct gfs2_inode *ip = GFS2_I(mapping->host); -	lock_buffer(bd->bd_bh); -	gfs2_log_lock(sdp);  	if (tr)  		tr->tr_touched = 1;  	if (!list_empty(&bd->bd_list)) -		goto out; +		return;  	set_bit(GLF_LFLUSH, &bd->bd_gl->gl_flags);  	set_bit(GLF_DIRTY, &bd->bd_gl->gl_flags);  	if (gfs2_is_jdata(ip)) { @@ -793,9 +784,6 @@ static void databuf_lo_add(struct gfs2_sbd *sdp, struct gfs2_bufdata *bd)  	} else {  		list_add_tail(&bd->bd_list, &sdp->sd_log_le_ordered);  	} -out: -	gfs2_log_unlock(sdp); -	unlock_buffer(bd->bd_bh);  }  /** diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c index 40c4b0d42fa..c5af8e18f27 100644 --- a/fs/gfs2/quota.c +++ b/fs/gfs2/quota.c @@ -497,8 +497,11 @@ int gfs2_quota_hold(struct gfs2_inode *ip, u32 uid, u32 gid)  	struct gfs2_quota_data **qd;  	int error; -	if (ip->i_res == NULL) -		gfs2_rs_alloc(ip); +	if (ip->i_res == NULL) { +		error = gfs2_rs_alloc(ip); +		if (error) +			return error; +	}  	qd = ip->i_res->rs_qa_qd; diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c index 3cc402ce6fe..38fe18f2f05 100644 --- a/fs/gfs2/rgrp.c +++ b/fs/gfs2/rgrp.c @@ -553,7 +553,6 @@ void gfs2_free_clones(struct gfs2_rgrpd *rgd)   */  int gfs2_rs_alloc(struct gfs2_inode *ip)  { -	int error = 0;  	struct gfs2_blkreserv *res;  	if (ip->i_res) @@ -561,7 +560,7 @@ int gfs2_rs_alloc(struct gfs2_inode *ip)  	res = kmem_cache_zalloc(gfs2_rsrv_cachep, GFP_NOFS);  	if (!res) -		error = -ENOMEM; +		return -ENOMEM;  	RB_CLEAR_NODE(&res->rs_node); @@ -571,7 +570,7 @@ int gfs2_rs_alloc(struct gfs2_inode *ip)  	else  		ip->i_res = res;  	up_write(&ip->i_rw_mutex); -	return error; +	return 0;  }  static void dump_rs(struct seq_file *seq, const struct gfs2_blkreserv *rs) @@ -1263,7 +1262,9 @@ int gfs2_fitrim(struct file *filp, void __user *argp)  	int ret = 0;  	u64 amt;  	u64 trimmed = 0; +	u64 start, end, minlen;  	unsigned int x; +	unsigned bs_shift = sdp->sd_sb.sb_bsize_shift;  	if (!capable(CAP_SYS_ADMIN))  		return -EPERM; @@ -1271,19 +1272,25 @@ int gfs2_fitrim(struct file *filp, void __user *argp)  	if (!blk_queue_discard(q))  		return -EOPNOTSUPP; -	if (argp == NULL) { -		r.start = 0; -		r.len = ULLONG_MAX; -		r.minlen = 0; -	} else if (copy_from_user(&r, argp, sizeof(r))) +	if (copy_from_user(&r, argp, sizeof(r)))  		return -EFAULT;  	ret = gfs2_rindex_update(sdp);  	if (ret)  		return ret; -	rgd = gfs2_blk2rgrpd(sdp, r.start, 0); -	rgd_end = gfs2_blk2rgrpd(sdp, r.start + r.len, 0); +	start = r.start >> bs_shift; +	end = start + (r.len >> bs_shift); +	minlen = max_t(u64, r.minlen, +		       q->limits.discard_granularity) >> bs_shift; + +	rgd = gfs2_blk2rgrpd(sdp, start, 0); +	rgd_end = gfs2_blk2rgrpd(sdp, end - 1, 0); + +	if (end <= start || +	    minlen > sdp->sd_max_rg_data || +	    start > rgd_end->rd_data0 + rgd_end->rd_data) +		return -EINVAL;  	while (1) { @@ -1295,7 +1302,9 @@ int gfs2_fitrim(struct file *filp, void __user *argp)  			/* Trim each bitmap in the rgrp */  			for (x = 0; x < rgd->rd_length; x++) {  				struct gfs2_bitmap *bi = rgd->rd_bits + x; -				ret = gfs2_rgrp_send_discards(sdp, rgd->rd_data0, NULL, bi, r.minlen, &amt); +				ret = gfs2_rgrp_send_discards(sdp, +						rgd->rd_data0, NULL, bi, minlen, +						&amt);  				if (ret) {  					gfs2_glock_dq_uninit(&gh);  					goto out; @@ -1324,7 +1333,7 @@ int gfs2_fitrim(struct file *filp, void __user *argp)  out:  	r.len = trimmed << 9; -	if (argp && copy_to_user(argp, &r, sizeof(r))) +	if (copy_to_user(argp, &r, sizeof(r)))  		return -EFAULT;  	return ret; diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index bc737261f23..d6488674d91 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c @@ -810,7 +810,8 @@ static void gfs2_dirty_inode(struct inode *inode, int flags)  			return;  		}  		need_unlock = 1; -	} +	} else if (WARN_ON_ONCE(ip->i_gl->gl_state != LM_ST_EXCLUSIVE)) +		return;  	if (current->journal_info == NULL) {  		ret = gfs2_trans_begin(sdp, RES_DINODE, 0); diff --git a/fs/gfs2/trans.c b/fs/gfs2/trans.c index adbd27875ef..413627072f3 100644 --- a/fs/gfs2/trans.c +++ b/fs/gfs2/trans.c @@ -155,14 +155,22 @@ void gfs2_trans_add_bh(struct gfs2_glock *gl, struct buffer_head *bh, int meta)  	struct gfs2_sbd *sdp = gl->gl_sbd;  	struct gfs2_bufdata *bd; +	lock_buffer(bh); +	gfs2_log_lock(sdp);  	bd = bh->b_private;  	if (bd)  		gfs2_assert(sdp, bd->bd_gl == gl);  	else { +		gfs2_log_unlock(sdp); +		unlock_buffer(bh);  		gfs2_attach_bufdata(gl, bh, meta);  		bd = bh->b_private; +		lock_buffer(bh); +		gfs2_log_lock(sdp);  	}  	lops_add(sdp, bd); +	gfs2_log_unlock(sdp); +	unlock_buffer(bh);  }  void gfs2_trans_add_revoke(struct gfs2_sbd *sdp, struct gfs2_bufdata *bd) diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h index 4635bf51b3e..a3f488b074a 100644 --- a/fs/nfs/nfs4_fs.h +++ b/fs/nfs/nfs4_fs.h @@ -308,13 +308,13 @@ extern void nfs4_renew_state(struct work_struct *);  /* nfs4state.c */  struct rpc_cred *nfs4_get_setclientid_cred(struct nfs_client *clp); +struct rpc_cred *nfs4_get_machine_cred_locked(struct nfs_client *clp);  struct rpc_cred *nfs4_get_renew_cred_locked(struct nfs_client *clp);  int nfs4_discover_server_trunking(struct nfs_client *clp,  			struct nfs_client **);  int nfs40_discover_server_trunking(struct nfs_client *clp,  			struct nfs_client **, struct rpc_cred *);  #if defined(CONFIG_NFS_V4_1) -struct rpc_cred *nfs4_get_machine_cred_locked(struct nfs_client *clp);  struct rpc_cred *nfs4_get_exchange_id_cred(struct nfs_client *clp);  int nfs41_discover_server_trunking(struct nfs_client *clp,  			struct nfs_client **, struct rpc_cred *); diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 992233561db..92bd799eee0 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -3782,8 +3782,13 @@ static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t bu  		goto out_free;  	}  	nfs4_write_cached_acl(inode, pages, res.acl_data_offset, res.acl_len); -	if (buf) +	if (buf) { +		if (res.acl_len > buflen) { +			ret = -ERANGE; +			goto out_free; +		}  		_copy_from_pages(buf, pages, res.acl_data_offset, res.acl_len); +	}  out_ok:  	ret = res.acl_len;  out_free: diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index e786dc7582b..26b14392043 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c @@ -271,6 +271,8 @@ static int nfs4_stat_to_errno(int);  #if defined(CONFIG_NFS_V4_1)  #define NFS4_MAX_MACHINE_NAME_LEN (64) +#define IMPL_NAME_LIMIT (sizeof(utsname()->sysname) + sizeof(utsname()->release) + \ +			 sizeof(utsname()->version) + sizeof(utsname()->machine) + 8)  #define encode_exchange_id_maxsz (op_encode_hdr_maxsz + \  				encode_verifier_maxsz + \ @@ -283,7 +285,7 @@ static int nfs4_stat_to_errno(int);  				1 /* nii_domain */ + \  				XDR_QUADLEN(NFS4_OPAQUE_LIMIT) + \  				1 /* nii_name */ + \ -				XDR_QUADLEN(NFS4_OPAQUE_LIMIT) + \ +				XDR_QUADLEN(IMPL_NAME_LIMIT) + \  				3 /* nii_date */)  #define decode_exchange_id_maxsz (op_decode_hdr_maxsz + \  				2 /* eir_clientid */ + \ @@ -1712,7 +1714,7 @@ static void encode_exchange_id(struct xdr_stream *xdr,  			       struct compound_hdr *hdr)  {  	__be32 *p; -	char impl_name[NFS4_OPAQUE_LIMIT]; +	char impl_name[IMPL_NAME_LIMIT];  	int len = 0;  	encode_op_hdr(xdr, OP_EXCHANGE_ID, decode_exchange_id_maxsz, hdr); @@ -1727,7 +1729,7 @@ static void encode_exchange_id(struct xdr_stream *xdr,  	if (send_implementation_id &&  	    sizeof(CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN) > 1 &&  	    sizeof(CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN) -		<= NFS4_OPAQUE_LIMIT + 1) +		<= sizeof(impl_name) + 1)  		len = snprintf(impl_name, sizeof(impl_name), "%s %s %s %s",  			       utsname()->sysname, utsname()->release,  			       utsname()->version, utsname()->machine); diff --git a/fs/nfs/write.c b/fs/nfs/write.c index f5bc8e11713..f608ca606b2 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c @@ -879,7 +879,7 @@ static bool nfs_write_pageuptodate(struct page *page, struct inode *inode)  {  	if (nfs_have_delegated_attributes(inode))  		goto out; -	if (NFS_I(inode)->cache_validity & NFS_INO_REVAL_PAGECACHE) +	if (NFS_I(inode)->cache_validity & (NFS_INO_INVALID_DATA|NFS_INO_REVAL_PAGECACHE))  		return false;  out:  	return PageUptodate(page) != 0; @@ -1823,7 +1823,7 @@ int __init nfs_init_writepagecache(void)  		goto out_destroy_write_mempool;  	nfs_commit_mempool = mempool_create_slab_pool(MIN_POOL_COMMIT, -						      nfs_wdata_cachep); +						      nfs_cdata_cachep);  	if (nfs_commit_mempool == NULL)  		goto out_destroy_commit_cache; diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c index 3128a1503d8..fd10981ea79 100644 --- a/net/sunrpc/rpc_pipe.c +++ b/net/sunrpc/rpc_pipe.c @@ -1152,14 +1152,19 @@ static void rpc_kill_sb(struct super_block *sb)  	struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);  	mutex_lock(&sn->pipefs_sb_lock); +	if (sn->pipefs_sb != sb) { +		mutex_unlock(&sn->pipefs_sb_lock); +		goto out; +	}  	sn->pipefs_sb = NULL;  	mutex_unlock(&sn->pipefs_sb_lock); -	put_net(net);  	dprintk("RPC:       sending pipefs UMOUNT notification for net %p%s\n",  		net, NET_NAME(net));  	blocking_notifier_call_chain(&rpc_pipefs_notifier_list,  					   RPC_PIPEFS_UMOUNT,  					   sb); +	put_net(net); +out:  	kill_litter_super(sb);  }  |