Files
Jaegeuk Kim 596158d26a Merge upstream-f2fs-stable-linux-4.9.y into android-4.9
Cherry-picked from origin/upstream-f2fs-stable-linux-4.9.y:

 treewide: Use array_size in f2fs_kvzalloc()
 treewide: Use array_size() in f2fs_kzalloc()
 treewide: Use array_size() in f2fs_kmalloc()
 overflow.h: Add allocation size calculation helpers
 f2fs: fix to clear FI_VOLATILE_FILE correctly
 f2fs: let sync node IO interrupt async one
 f2fs: don't change wbc->sync_mode
 f2fs: fix to update mtime correctly
 fs: f2fs: insert space around that ':' and ', '
 fs: f2fs: add missing blank lines after declarations
 fs: f2fs: changed variable type of offset "unsigned" to "loff_t"
 f2fs: clean up symbol namespace
 f2fs: make set_de_type() static
 f2fs: make __f2fs_write_data_pages() static
 f2fs: fix to avoid accessing cross the boundary
 f2fs: fix to let caller retry allocating block address
 disable loading f2fs module on PAGE_SIZE > 4KB
 f2fs: fix error path of move_data_page
 f2fs: don't drop dentry pages after fs shutdown
 f2fs: fix to avoid race during access gc_thread pointer
 f2fs: clean up with clear_radix_tree_dirty_tag
 f2fs: fix to don't trigger writeback during recovery
 f2fs: clear discard_wake earlier
 f2fs: let discard thread wait a little longer if dev is busy
 f2fs: avoid stucking GC due to atomic write
 f2fs: introduce sbi->gc_mode to determine the policy
 f2fs: keep migration IO order in LFS mode
 f2fs: fix to wait page writeback during revoking atomic write
 f2fs: Fix deadlock in shutdown ioctl
 f2fs: detect synchronous writeback more earlier
 mm: remove nr_pages argument from pagevec_lookup_{,range}_tag()
 ceph: use pagevec_lookup_range_nr_tag()
 mm: add variant of pagevec_lookup_range_tag() taking number of pages
 mm: use pagevec_lookup_range_tag() in write_cache_pages()
 mm: use pagevec_lookup_range_tag() in __filemap_fdatawait_range()
 nilfs2: use pagevec_lookup_range_tag()
 gfs2: use pagevec_lookup_range_tag()
 f2fs: use find_get_pages_tag() for looking up single page
 f2fs: simplify page iteration loops
 f2fs: use pagevec_lookup_range_tag()
 ext4: use pagevec_lookup_range_tag()
 ceph: use pagevec_lookup_range_tag()
 btrfs: use pagevec_lookup_range_tag()
 mm: implement find_get_pages_range_tag()
 f2fs: clean up with is_valid_blkaddr()
 f2fs: fix to initialize min_mtime with ULLONG_MAX
 f2fs: fix to let checkpoint guarantee atomic page persistence
 f2fs: fix to initialize i_current_depth according to inode type
 Revert "f2fs: add ovp valid_blocks check for bg gc victim to fg_gc"
 f2fs: don't drop any page on f2fs_cp_error() case
 f2fs: fix spelling mistake: "extenstion" -> "extension"
 f2fs: enhance sanity_check_raw_super() to avoid potential overflows
 f2fs: treat volatile file's data as hot one
 f2fs: introduce release_discard_addr() for cleanup
 f2fs: fix potential overflow
 f2fs: rename dio_rwsem to i_gc_rwsem
 f2fs: move mnt_want_write_file after range check
 f2fs: fix missing clear FI_NO_PREALLOC in some error case
 f2fs: enforce fsync_mode=strict for renamed directory
 f2fs: sanity check for total valid node blocks
 f2fs: sanity check on sit entry
 f2fs: avoid bug_on on corrupted inode
 f2fs: give message and set need_fsck given broken node id
 f2fs: clean up commit_inmem_pages()
 f2fs: do not check F2FS_INLINE_DOTS in recover
 f2fs: remove duplicated dquot_initialize and fix error handling
 f2fs: stop issue discard if something wrong with f2fs
 f2fs: fix return value in f2fs_ioc_commit_atomic_write
 f2fs: allocate hot_data for atomic write more strictly
 f2fs: check if inmem_pages list is empty correctly
 f2fs: fix race in between GC and atomic open
 f2fs: change le32 to le16 of f2fs_inode->i_extra_size
 f2fs: check cur_valid_map_mir & raw_sit block count when flush sit entries
 f2fs: correct return value of f2fs_trim_fs
 f2fs: fix to show missing bits in FS_IOC_GETFLAGS
 f2fs: remove unneeded F2FS_PROJINHERIT_FL
 f2fs: don't use GFP_ZERO for page caches
 f2fs: issue all big range discards in umount process
 f2fs: remove redundant block plug
 f2fs: remove unmatched zero_user_segment when convert inline dentry
 f2fs: introduce private inode status mapping
 fscrypt: log the crypto algorithm implementations
 fscrypt: add Speck128/256 support
 fscrypt: only derive the needed portion of the key
 fscrypt: separate key lookup from key derivation
 fscrypt: use a common logging function
 fscrypt: remove internal key size constants
 fscrypt: remove unnecessary check for non-logon key type
 fscrypt: make fscrypt_operations.max_namelen an integer
 fscrypt: drop empty name check from fname_decrypt()
 fscrypt: drop max_namelen check from fname_decrypt()
 fscrypt: don't special-case EOPNOTSUPP from fscrypt_get_encryption_info()
 fscrypt: don't clear flags on crypto transform
 fscrypt: remove stale comment from fscrypt_d_revalidate()
 fscrypt: remove error messages for skcipher_request_alloc() failure
 fscrypt: remove unnecessary NULL check when allocating skcipher
 fscrypt: clean up after fscrypt_prepare_lookup() conversions
 ext4: switch to fscrypt_prepare_lookup()
 fscrypt: use unbound workqueue for decryption

Bug: 116220732
Change-Id: Ia9a47ef30e9e47c4c3e1e9e91e37ae1dc018384f
Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2018-09-26 20:01:53 +00:00

81 lines
2.0 KiB
C

/*
* include/linux/pagevec.h
*
* In many places it is efficient to batch an operation up against multiple
* pages. A pagevec is a multipage container which is used for that.
*/
#ifndef _LINUX_PAGEVEC_H
#define _LINUX_PAGEVEC_H
/* 14 pointers + two long's align the pagevec structure to a power of two */
#define PAGEVEC_SIZE 14
struct page;
struct address_space;
struct pagevec {
unsigned long nr;
unsigned long cold;
struct page *pages[PAGEVEC_SIZE];
};
void __pagevec_release(struct pagevec *pvec);
void __pagevec_lru_add(struct pagevec *pvec);
unsigned pagevec_lookup_entries(struct pagevec *pvec,
struct address_space *mapping,
pgoff_t start, unsigned nr_entries,
pgoff_t *indices);
void pagevec_remove_exceptionals(struct pagevec *pvec);
unsigned pagevec_lookup(struct pagevec *pvec, struct address_space *mapping,
pgoff_t start, unsigned nr_pages);
unsigned pagevec_lookup_range_tag(struct pagevec *pvec,
struct address_space *mapping, pgoff_t *index, pgoff_t end,
int tag);
unsigned pagevec_lookup_range_nr_tag(struct pagevec *pvec,
struct address_space *mapping, pgoff_t *index, pgoff_t end,
int tag, unsigned max_pages);
static inline unsigned pagevec_lookup_tag(struct pagevec *pvec,
struct address_space *mapping, pgoff_t *index, int tag)
{
return pagevec_lookup_range_tag(pvec, mapping, index, (pgoff_t)-1, tag);
}
static inline void pagevec_init(struct pagevec *pvec, int cold)
{
pvec->nr = 0;
pvec->cold = cold;
}
static inline void pagevec_reinit(struct pagevec *pvec)
{
pvec->nr = 0;
}
static inline unsigned pagevec_count(struct pagevec *pvec)
{
return pvec->nr;
}
static inline unsigned pagevec_space(struct pagevec *pvec)
{
return PAGEVEC_SIZE - pvec->nr;
}
/*
* Add a page to a pagevec. Returns the number of slots still available.
*/
static inline unsigned pagevec_add(struct pagevec *pvec, struct page *page)
{
pvec->pages[pvec->nr++] = page;
return pagevec_space(pvec);
}
static inline void pagevec_release(struct pagevec *pvec)
{
if (pagevec_count(pvec))
__pagevec_release(pvec);
}
#endif /* _LINUX_PAGEVEC_H */