1 1.2 haad /* $NetBSD: dev-swap.c,v 1.2 2009/12/02 01:53:25 haad Exp $ */ 2 1.1 haad 3 1.1 haad /* 4 1.1 haad * Copyright (C) 2009 Red Hat, Inc. All rights reserved. 5 1.1 haad * 6 1.1 haad * This file is part of LVM2. 7 1.1 haad * 8 1.1 haad * This copyrighted material is made available to anyone wishing to use, 9 1.1 haad * modify, copy, or redistribute it subject to the terms and conditions 10 1.1 haad * of the GNU Lesser General Public License v.2.1. 11 1.1 haad * 12 1.1 haad * You should have received a copy of the GNU Lesser General Public License 13 1.1 haad * along with this program; if not, write to the Free Software Foundation, 14 1.1 haad * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 15 1.1 haad */ 16 1.1 haad 17 1.1 haad #include "lib.h" 18 1.1 haad #include "metadata.h" 19 1.1 haad #include "xlate.h" 20 1.1 haad #include "filter.h" 21 1.1 haad 22 1.1 haad #ifdef linux 23 1.1 haad 24 1.1 haad #define MAX_PAGESIZE (64 * 1024) 25 1.1 haad #define SIGNATURE_SIZE 10 26 1.1 haad 27 1.1 haad static int 28 1.1 haad _swap_detect_signature(const char *buf) 29 1.1 haad { 30 1.1 haad if (memcmp(buf, "SWAP-SPACE", 10) == 0 || 31 1.1 haad memcmp(buf, "SWAPSPACE2", 10) == 0) 32 1.1 haad return 1; 33 1.1 haad 34 1.1 haad if (memcmp(buf, "S1SUSPEND", 9) == 0 || 35 1.1 haad memcmp(buf, "S2SUSPEND", 9) == 0 || 36 1.1 haad memcmp(buf, "ULSUSPEND", 9) == 0 || 37 1.1 haad memcmp(buf, "\xed\xc3\x02\xe9\x98\x56\xe5\x0c", 8) == 0) 38 1.1 haad return 1; 39 1.1 haad 40 1.1 haad return 0; 41 1.1 haad } 42 1.1 haad 43 1.1 haad int dev_is_swap(struct device *dev, uint64_t *signature) 44 1.1 haad { 45 1.1 haad char buf[10]; 46 1.1 haad uint64_t size; 47 1.1 haad int page; 48 1.1 haad 49 1.1 haad if (!dev_get_size(dev, &size)) { 50 1.1 haad stack; 51 1.1 haad return -1; 52 1.1 haad } 53 1.1 haad 54 1.1 haad if (!dev_open(dev)) { 55 1.1 haad stack; 56 1.1 haad return -1; 57 1.1 haad } 58 1.1 haad 59 1.1 haad *signature = 0; 60 1.1 haad 61 1.1 haad for (page = 0x1000; page <= MAX_PAGESIZE; page <<= 1) { 62 1.1 haad /* 63 1.1 haad * skip 32k pagesize since this does not seem to be supported 64 1.1 haad */ 65 1.1 haad if (page == 0x8000) 66 1.1 haad continue; 67 1.1 haad if (size < page) 68 1.1 haad break; 69 1.1 haad if (!dev_read(dev, page - SIGNATURE_SIZE, 70 1.1 haad SIGNATURE_SIZE, buf)) { 71 1.1 haad stack; 72 1.1 haad return -1; 73 1.1 haad } 74 1.1 haad if (_swap_detect_signature(buf)) { 75 1.1 haad *signature = page - SIGNATURE_SIZE; 76 1.1 haad break; 77 1.1 haad } 78 1.1 haad } 79 1.1 haad 80 1.1 haad if (!dev_close(dev)) 81 1.1 haad stack; 82 1.1 haad 83 1.1 haad if (*signature) 84 1.1 haad return 1; 85 1.1 haad 86 1.1 haad return 0; 87 1.1 haad } 88 1.1 haad 89 1.2 haad #else 90 1.2 haad 91 1.2 haad #ifdef __NetBSD__ 92 1.2 haad int dev_is_swap(struct device *dev, uint64_t *signature) 93 1.2 haad { 94 1.2 haad return 0; 95 1.2 haad } 96 1.2 haad #endif 97 1.2 haad 98 1.1 haad #endif 99