|
@@ -868,7 +868,7 @@ typedef struct {
|
|
|
} pagemap_entry_t;
|
|
|
|
|
|
struct pagemapread {
|
|
|
- int pos, len;
|
|
|
+ int pos, len; /* units: PM_ENTRY_BYTES, not bytes */
|
|
|
pagemap_entry_t *buffer;
|
|
|
bool v2;
|
|
|
};
|
|
@@ -876,7 +876,7 @@ struct pagemapread {
|
|
|
#define PAGEMAP_WALK_SIZE (PMD_SIZE)
|
|
|
#define PAGEMAP_WALK_MASK (PMD_MASK)
|
|
|
|
|
|
-#define PM_ENTRY_BYTES sizeof(u64)
|
|
|
+#define PM_ENTRY_BYTES sizeof(pagemap_entry_t)
|
|
|
#define PM_STATUS_BITS 3
|
|
|
#define PM_STATUS_OFFSET (64 - PM_STATUS_BITS)
|
|
|
#define PM_STATUS_MASK (((1LL << PM_STATUS_BITS) - 1) << PM_STATUS_OFFSET)
|
|
@@ -1127,8 +1127,8 @@ static ssize_t pagemap_read(struct file *file, char __user *buf,
|
|
|
goto out_task;
|
|
|
|
|
|
pm.v2 = soft_dirty_cleared;
|
|
|
- pm.len = PM_ENTRY_BYTES * (PAGEMAP_WALK_SIZE >> PAGE_SHIFT);
|
|
|
- pm.buffer = kmalloc(pm.len, GFP_TEMPORARY);
|
|
|
+ pm.len = (PAGEMAP_WALK_SIZE >> PAGE_SHIFT);
|
|
|
+ pm.buffer = kmalloc(pm.len * PM_ENTRY_BYTES, GFP_TEMPORARY);
|
|
|
ret = -ENOMEM;
|
|
|
if (!pm.buffer)
|
|
|
goto out_task;
|