diff options
| author | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
|---|---|---|
| committer | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
| commit | 79828b4fa835f73cdaf4bffa48696abdcbea9d02 (patch) | |
| tree | 5e0fa7156acb75ba603022bc807df8f2fedb97a8 /fs/nfs/blocklayout/dev.c | |
| parent | 721b51fcf91898299d96f4b72cb9434cda29dce6 (diff) | |
| parent | 8c1a9d6323abf0fb1e5dad96cf3f1c783505ea5a (diff) | |
Merge remote-tracking branch 'asoc/fix/rt5645' into asoc-fix-rt5645
Diffstat (limited to 'fs/nfs/blocklayout/dev.c')
| -rw-r--r-- | fs/nfs/blocklayout/dev.c | 9 | 
1 files changed, 7 insertions, 2 deletions
diff --git a/fs/nfs/blocklayout/dev.c b/fs/nfs/blocklayout/dev.c index e535599a0719..a861bbdfe577 100644 --- a/fs/nfs/blocklayout/dev.c +++ b/fs/nfs/blocklayout/dev.c @@ -22,7 +22,7 @@ bl_free_device(struct pnfs_block_dev *dev)  		kfree(dev->children);  	} else {  		if (dev->bdev) -			blkdev_put(dev->bdev, FMODE_READ); +			blkdev_put(dev->bdev, FMODE_READ | FMODE_WRITE);  	}  } @@ -65,6 +65,11 @@ nfs4_block_decode_volume(struct xdr_stream *xdr, struct pnfs_block_volume *b)  				return -EIO;  			p = xdr_decode_hyper(p, &b->simple.sigs[i].offset);  			b->simple.sigs[i].sig_len = be32_to_cpup(p++); +			if (b->simple.sigs[i].sig_len > PNFS_BLOCK_UUID_LEN) { +				pr_info("signature too long: %d\n", +					b->simple.sigs[i].sig_len); +				return -EIO; +			}  			p = xdr_inline_decode(xdr, b->simple.sigs[i].sig_len);  			if (!p) @@ -195,7 +200,7 @@ bl_parse_simple(struct nfs_server *server, struct pnfs_block_dev *d,  	if (!dev)  		return -EIO; -	d->bdev = blkdev_get_by_dev(dev, FMODE_READ, NULL); +	d->bdev = blkdev_get_by_dev(dev, FMODE_READ | FMODE_WRITE, NULL);  	if (IS_ERR(d->bdev)) {  		printk(KERN_WARNING "pNFS: failed to open device %d:%d (%ld)\n",  			MAJOR(dev), MINOR(dev), PTR_ERR(d->bdev));  |