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 lock_two_nondirectories(struct inode *, struct inode*);
|
||||||
void unlock_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
|
* NOTE: in a 32bit arch with a preemptable kernel and
|
||||||
* an UP compile the i_size_read/write must be atomic
|
* 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);
|
EXPORT_SYMBOL(__page_cache_alloc);
|
||||||
#endif
|
#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
|
* In order to wait for pages to become available there must be
|
||||||
* waitqueues associated with pages. By using a hash table of
|
* waitqueues associated with pages. By using a hash table of
|
||||||
|
|
Loading…
Reference in New Issue