mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-25 18:59:33 +03:00
Fix zfs_write_limit_max integer size mismatch on 32-bit systems
Commit c409e4647f
introduced a
number of module parameters. This required several types to be
changed to accomidate the required module parameters Linux macros.
Unfortunately, arc.c contained its own extern definition of the
zfs_write_limit_max variable and its type was not updated to be
consistent with its dsl_pool.c counterpart. If the variable had
been properly marked extern in a common header, then gcc would
have generated a warning and this would not have slipped through.
The result of this was that the ARC unconditionally expected
zfs_write_limit_max to be 64-bit. Unfortunately, the largest size
integer module parameter that Linux supports is unsigned long, which
varies in size depending on the host system's native word size. The
effect was that on 32-bit systems, ARC incorrectly performed 64-bit
operations on a 32-bit value by reading the neighboring 32 bits as
the upper 32 bits of the 64-bit value.
We correct that by changing the extern declaration to use the unsigned
long type and move these extern definitions in to the common arc.h
header. This should make ARC correctly treat zfs_write_limit_max as a
32-bit value on 32-bit systems.
Reported-by: Jorgen Lundman <lundman@lundman.net>
Signed-off-by: Richard Yao <ryao@cs.stonybrook.edu>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #749
This commit is contained in:
parent
15fd274973
commit
7df05a4266
@ -150,6 +150,11 @@ void l2arc_fini(void);
|
|||||||
void l2arc_start(void);
|
void l2arc_start(void);
|
||||||
void l2arc_stop(void);
|
void l2arc_stop(void);
|
||||||
|
|
||||||
|
/* Global tunings */
|
||||||
|
extern int zfs_write_limit_shift;
|
||||||
|
extern unsigned long zfs_write_limit_max;
|
||||||
|
extern kmutex_t zfs_write_limit_lock;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -147,10 +147,6 @@ static kmutex_t arc_reclaim_thr_lock;
|
|||||||
static kcondvar_t arc_reclaim_thr_cv; /* used to signal reclaim thr */
|
static kcondvar_t arc_reclaim_thr_cv; /* used to signal reclaim thr */
|
||||||
static uint8_t arc_thread_exit;
|
static uint8_t arc_thread_exit;
|
||||||
|
|
||||||
extern int zfs_write_limit_shift;
|
|
||||||
extern uint64_t zfs_write_limit_max;
|
|
||||||
extern kmutex_t zfs_write_limit_lock;
|
|
||||||
|
|
||||||
/* number of bytes to prune from caches when at arc_meta_limit is reached */
|
/* number of bytes to prune from caches when at arc_meta_limit is reached */
|
||||||
uint_t arc_meta_prune = 1048576;
|
uint_t arc_meta_prune = 1048576;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user