forked from Minki/linux
mm: Add functions to lock invalidate_lock for two mappings
Some operations such as reflinking blocks among files will need to lock invalidate_lock for two mappings. Add helper functions to do that. Reviewed-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
parent
730633f0b7
commit
7506ae6a70
@ -849,6 +849,12 @@ static inline void filemap_invalidate_unlock_shared(
|
||||
void lock_two_nondirectories(struct inode *, struct inode*);
|
||||
void unlock_two_nondirectories(struct inode *, struct inode*);
|
||||
|
||||
void filemap_invalidate_lock_two(struct address_space *mapping1,
|
||||
struct address_space *mapping2);
|
||||
void filemap_invalidate_unlock_two(struct address_space *mapping1,
|
||||
struct address_space *mapping2);
|
||||
|
||||
|
||||
/*
|
||||
* NOTE: in a 32bit arch with a preemptable kernel and
|
||||
* an UP compile the i_size_read/write must be atomic
|
||||
|
38
mm/filemap.c
38
mm/filemap.c
@ -1009,6 +1009,44 @@ struct page *__page_cache_alloc(gfp_t gfp)
|
||||
EXPORT_SYMBOL(__page_cache_alloc);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* filemap_invalidate_lock_two - lock invalidate_lock for two mappings
|
||||
*
|
||||
* Lock exclusively invalidate_lock of any passed mapping that is not NULL.
|
||||
*
|
||||
* @mapping1: the first mapping to lock
|
||||
* @mapping2: the second mapping to lock
|
||||
*/
|
||||
void filemap_invalidate_lock_two(struct address_space *mapping1,
|
||||
struct address_space *mapping2)
|
||||
{
|
||||
if (mapping1 > mapping2)
|
||||
swap(mapping1, mapping2);
|
||||
if (mapping1)
|
||||
down_write(&mapping1->invalidate_lock);
|
||||
if (mapping2 && mapping1 != mapping2)
|
||||
down_write_nested(&mapping2->invalidate_lock, 1);
|
||||
}
|
||||
EXPORT_SYMBOL(filemap_invalidate_lock_two);
|
||||
|
||||
/*
|
||||
* filemap_invalidate_unlock_two - unlock invalidate_lock for two mappings
|
||||
*
|
||||
* Unlock exclusive invalidate_lock of any passed mapping that is not NULL.
|
||||
*
|
||||
* @mapping1: the first mapping to unlock
|
||||
* @mapping2: the second mapping to unlock
|
||||
*/
|
||||
void filemap_invalidate_unlock_two(struct address_space *mapping1,
|
||||
struct address_space *mapping2)
|
||||
{
|
||||
if (mapping1)
|
||||
up_write(&mapping1->invalidate_lock);
|
||||
if (mapping2 && mapping1 != mapping2)
|
||||
up_write(&mapping2->invalidate_lock);
|
||||
}
|
||||
EXPORT_SYMBOL(filemap_invalidate_unlock_two);
|
||||
|
||||
/*
|
||||
* In order to wait for pages to become available there must be
|
||||
* waitqueues associated with pages. By using a hash table of
|
||||
|
Loading…
Reference in New Issue
Block a user