mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
Merge branch 'bugfixes' into nfs-for-next
This commit is contained in:
commit
7ce0171d4f
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
||||
|
||||
|
@ -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 = {
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
/*
|
||||
|
@ -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;
|
||||
|
||||
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 (!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)
|
||||
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);
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
*/
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
*/
|
||||
|
||||
|
@ -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
|
||||
*/
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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 *);
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user