Home | History | Annotate | Line # | Download | only in device
      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