[PATCH] swsusp: low level interface
Introduce the low level interface that can be used for handling the snapshot of the system memory by the in-kernel swap-writing/reading code of swsusp and the userland interface code (to be introduced shortly). Also change the way in which swsusp records the allocated swap pages and, consequently, simplifies the in-kernel swap-writing/reading code (this is necessary for the userland interface too). To this end, it introduces two helper functions in mm/swapfile.c, so that the swsusp code does not refer directly to the swap internals. Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Acked-by: Pavel Machek <pavel@ucw.cz> Signed-off-by: Adrian Bunk <bunk@stusta.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
2b322ce210
commit
f577eb30af
+54
-1
@@ -45,7 +45,7 @@ static const char Unused_offset[] = "Unused swap offset entry ";
|
||||
|
||||
struct swap_list_t swap_list = {-1, -1};
|
||||
|
||||
struct swap_info_struct swap_info[MAX_SWAPFILES];
|
||||
static struct swap_info_struct swap_info[MAX_SWAPFILES];
|
||||
|
||||
static DEFINE_MUTEX(swapon_mutex);
|
||||
|
||||
@@ -417,6 +417,59 @@ void free_swap_and_cache(swp_entry_t entry)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SOFTWARE_SUSPEND
|
||||
/*
|
||||
* Find the swap type that corresponds to given device (if any)
|
||||
*
|
||||
* This is needed for software suspend and is done in such a way that inode
|
||||
* aliasing is allowed.
|
||||
*/
|
||||
int swap_type_of(dev_t device)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!device)
|
||||
return -EINVAL;
|
||||
spin_lock(&swap_lock);
|
||||
for (i = 0; i < nr_swapfiles; i++) {
|
||||
struct inode *inode;
|
||||
|
||||
if (!(swap_info[i].flags & SWP_WRITEOK))
|
||||
continue;
|
||||
inode = swap_info->swap_file->f_dentry->d_inode;
|
||||
if (S_ISBLK(inode->i_mode) &&
|
||||
device == MKDEV(imajor(inode), iminor(inode))) {
|
||||
spin_unlock(&swap_lock);
|
||||
return i;
|
||||
}
|
||||
}
|
||||
spin_unlock(&swap_lock);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/*
|
||||
* Return either the total number of swap pages of given type, or the number
|
||||
* of free pages of that type (depending on @free)
|
||||
*
|
||||
* This is needed for software suspend
|
||||
*/
|
||||
unsigned int count_swap_pages(int type, int free)
|
||||
{
|
||||
unsigned int n = 0;
|
||||
|
||||
if (type < nr_swapfiles) {
|
||||
spin_lock(&swap_lock);
|
||||
if (swap_info[type].flags & SWP_WRITEOK) {
|
||||
n = swap_info[type].pages;
|
||||
if (free)
|
||||
n -= swap_info[type].inuse_pages;
|
||||
}
|
||||
spin_unlock(&swap_lock);
|
||||
}
|
||||
return n;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* No need to decide whether this PTE shares the swap entry with others,
|
||||
* just let do_wp_page work it out if a write is requested later - to
|
||||
|
||||
Reference in New Issue
Block a user