git://git.camperquake.de
/
zfs.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix NULL pointer dereference on PaX/GRSecurity patched Linux 3.3 and later kernels
[zfs.git]
/
module
/
zfs
/
zvol.c
diff --git
a/module/zfs/zvol.c
b/module/zfs/zvol.c
index
9dd9547
..
125d58d
100644
(file)
--- a/
module/zfs/zvol.c
+++ b/
module/zfs/zvol.c
@@
-46,6
+46,7
@@
#include <sys/zvol.h>
#include <linux/blkdev_compat.h>
#include <sys/zvol.h>
#include <linux/blkdev_compat.h>
+unsigned int zvol_inhibit_dev = 0;
unsigned int zvol_major = ZVOL_MAJOR;
unsigned int zvol_threads = 32;
unsigned int zvol_major = ZVOL_MAJOR;
unsigned int zvol_threads = 32;
@@
-459,11
+460,15
@@
zvol_log_write(zvol_state_t *zv, dmu_tx_t *tx,
uint32_t blocksize = zv->zv_volblocksize;
zilog_t *zilog = zv->zv_zilog;
boolean_t slogging;
uint32_t blocksize = zv->zv_volblocksize;
zilog_t *zilog = zv->zv_zilog;
boolean_t slogging;
+ ssize_t immediate_write_sz;
if (zil_replaying(zilog, tx))
return;
if (zil_replaying(zilog, tx))
return;
- slogging = spa_has_slogs(zilog->zl_spa);
+ immediate_write_sz = (zilog->zl_logbias == ZFS_LOGBIAS_THROUGHPUT)
+ ? 0 : zvol_immediate_write_sz;
+ slogging = spa_has_slogs(zilog->zl_spa) &&
+ (zilog->zl_logbias == ZFS_LOGBIAS_LATENCY);
while (size) {
itx_t *itx;
while (size) {
itx_t *itx;
@@
-475,7
+480,7
@@
zvol_log_write(zvol_state_t *zv, dmu_tx_t *tx,
* Unlike zfs_log_write() we can be called with
* up to DMU_MAX_ACCESS/2 (5MB) writes.
*/
* Unlike zfs_log_write() we can be called with
* up to DMU_MAX_ACCESS/2 (5MB) writes.
*/
- if (blocksize >
zvol_
immediate_write_sz && !slogging &&
+ if (blocksize > immediate_write_sz && !slogging &&
size >= blocksize && offset % blocksize == 0) {
write_state = WR_INDIRECT; /* uses dmu_sync */
len = blocksize;
size >= blocksize && offset % blocksize == 0) {
write_state = WR_INDIRECT; /* uses dmu_sync */
len = blocksize;
@@
-1337,6
+1342,9
@@
zvol_create_minors(const char *pool)
spa_t *spa = NULL;
int error = 0;
spa_t *spa = NULL;
int error = 0;
+ if (zvol_inhibit_dev)
+ return (0);
+
mutex_enter(&zvol_state_lock);
if (pool) {
error = dmu_objset_find_spa(NULL, pool, zvol_create_minors_cb,
mutex_enter(&zvol_state_lock);
if (pool) {
error = dmu_objset_find_spa(NULL, pool, zvol_create_minors_cb,
@@
-1366,6
+1374,9
@@
zvol_remove_minors(const char *pool)
zvol_state_t *zv, *zv_next;
char *str;
zvol_state_t *zv, *zv_next;
char *str;
+ if (zvol_inhibit_dev)
+ return;
+
str = kmem_zalloc(MAXNAMELEN, KM_SLEEP);
if (pool) {
(void) strncpy(str, pool, strlen(pool));
str = kmem_zalloc(MAXNAMELEN, KM_SLEEP);
if (pool) {
(void) strncpy(str, pool, strlen(pool));
@@
-1390,14
+1401,8
@@
zvol_init(void)
{
int error;
{
int error;
- /*
- * The zvol taskqs are created with TASKQ_NORECLAIM so they may be
- * used safely as a swap device. If direct reclaim is allowed then
- * they quickly deadlock in one of the internal memory allocations.
- */
zvol_taskq = taskq_create(ZVOL_DRIVER, zvol_threads, maxclsyspri,
zvol_taskq = taskq_create(ZVOL_DRIVER, zvol_threads, maxclsyspri,
- zvol_threads, INT_MAX,
- TASKQ_PREPOPULATE | TASKQ_NORECLAIM);
+ zvol_threads, INT_MAX, TASKQ_PREPOPULATE);
if (zvol_taskq == NULL) {
printk(KERN_INFO "ZFS: taskq_create() failed\n");
return (-ENOMEM);
if (zvol_taskq == NULL) {
printk(KERN_INFO "ZFS: taskq_create() failed\n");
return (-ENOMEM);
@@
-1433,6
+1438,9
@@
zvol_fini(void)
list_destroy(&zvol_state_list);
}
list_destroy(&zvol_state_list);
}
+module_param(zvol_inhibit_dev, uint, 0644);
+MODULE_PARM_DESC(zvol_inhibit_dev, "Do not create zvol device nodes");
+
module_param(zvol_major, uint, 0444);
MODULE_PARM_DESC(zvol_major, "Major number for zvol device");
module_param(zvol_major, uint, 0444);
MODULE_PARM_DESC(zvol_major, "Major number for zvol device");