Skip to content

Commit 0669d2b

Browse files
Peter Zijlstraaxboe
authored andcommitted
zram: Fix __zram_bvec_{read,write}() locking order
Mikhail reported a lockdep spat detailing how __zram_bvec_read() and __zram_bvec_write() use zstrm->lock and zspage->lock in opposite order. Reported-by: Mikhail Gavrilov <mikhail.v.gavrilov@gmail.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Tested-by: Mikhail Gavrilov <mikhail.v.gavrilov@gmail.com> Acked-by: Minchan Kim <minchan@kernel.org> Acked-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent db07327 commit 0669d2b

1 file changed

Lines changed: 5 additions & 3 deletions

File tree

drivers/block/zram/zram_drv.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1218,10 +1218,11 @@ static void zram_free_page(struct zram *zram, size_t index)
12181218
static int __zram_bvec_read(struct zram *zram, struct page *page, u32 index,
12191219
struct bio *bio, bool partial_io)
12201220
{
1221-
int ret;
1221+
struct zcomp_strm *zstrm;
12221222
unsigned long handle;
12231223
unsigned int size;
12241224
void *src, *dst;
1225+
int ret;
12251226

12261227
zram_slot_lock(zram, index);
12271228
if (zram_test_flag(zram, index, ZRAM_WB)) {
@@ -1252,15 +1253,16 @@ static int __zram_bvec_read(struct zram *zram, struct page *page, u32 index,
12521253

12531254
size = zram_get_obj_size(zram, index);
12541255

1256+
if (size != PAGE_SIZE)
1257+
zstrm = zcomp_stream_get(zram->comp);
1258+
12551259
src = zs_map_object(zram->mem_pool, handle, ZS_MM_RO);
12561260
if (size == PAGE_SIZE) {
12571261
dst = kmap_atomic(page);
12581262
memcpy(dst, src, PAGE_SIZE);
12591263
kunmap_atomic(dst);
12601264
ret = 0;
12611265
} else {
1262-
struct zcomp_strm *zstrm = zcomp_stream_get(zram->comp);
1263-
12641266
dst = kmap_atomic(page);
12651267
ret = zcomp_decompress(zstrm, src, size, dst);
12661268
kunmap_atomic(dst);

0 commit comments

Comments
 (0)