Merge tag 'ceph-for-5.14-rc1' of git://github.com/ceph/ceph-client
[linux-2.6-microblaze.git] / mm / zswap.c
index e934593..7944e3e 100644 (file)
@@ -967,6 +967,13 @@ static int zswap_writeback_entry(struct zpool *pool, unsigned long handle)
        spin_unlock(&tree->lock);
        BUG_ON(offset != entry->offset);
 
+       src = (u8 *)zhdr + sizeof(struct zswap_header);
+       if (!zpool_can_sleep_mapped(pool)) {
+               memcpy(tmp, src, entry->length);
+               src = tmp;
+               zpool_unmap_handle(pool, handle);
+       }
+
        /* try to allocate swap cache page */
        switch (zswap_get_swap_cache_page(swpentry, &page)) {
        case ZSWAP_SWAPCACHE_FAIL: /* no memory or invalidate happened */
@@ -982,17 +989,7 @@ static int zswap_writeback_entry(struct zpool *pool, unsigned long handle)
        case ZSWAP_SWAPCACHE_NEW: /* page is locked */
                /* decompress */
                acomp_ctx = raw_cpu_ptr(entry->pool->acomp_ctx);
-
                dlen = PAGE_SIZE;
-               src = (u8 *)zhdr + sizeof(struct zswap_header);
-
-               if (!zpool_can_sleep_mapped(pool)) {
-
-                       memcpy(tmp, src, entry->length);
-                       src = tmp;
-
-                       zpool_unmap_handle(pool, handle);
-               }
 
                mutex_lock(acomp_ctx->mutex);
                sg_init_one(&input, src, entry->length);
@@ -1203,7 +1200,7 @@ static int zswap_frontswap_store(unsigned type, pgoff_t offset,
                zswap_reject_alloc_fail++;
                goto put_dstmem;
        }
-       buf = zpool_map_handle(entry->pool->zpool, handle, ZPOOL_MM_RW);
+       buf = zpool_map_handle(entry->pool->zpool, handle, ZPOOL_MM_WO);
        memcpy(buf, &zhdr, hlen);
        memcpy(buf + hlen, dst, dlen);
        zpool_unmap_handle(entry->pool->zpool, handle);