Revert commit884759fa73("f2fs: show the fsync_mode=nobarrier mount option") Revert commit8145e4913c("f2fs: fix unnecessary periodic wakeup of discard thread when dev is busy") Revert commit39fe1cda39("f2fs: let discard thread wait a little longer if dev is busy") Revert commit4bbf1ce3a1("f2fs: avoid fsync() failure caused by EAGAIN in writepage()") Revert commit67226fb52c("f2fs: fix race in between GC and atomic open") Revert commitad8d61efc9("f2fs: fix to detect failure of dquot_initialize") Revert commitc92d09e35d("f2fs: Fix deadlock in shutdown ioctl") Revert commit4f979af7b0("f2fs: fix to wait page writeback during revoking atomic write") Revert commitde13b2ac74("f2fs: fix to don't trigger writeback during recovery") Revert commitf3f0291977("f2fs: fix error path of move_data_page") Revert commit122031c292("disable loading f2fs module on PAGE_SIZE > 4KB") Revert commiteab3a34122("f2fs: give message and set need_fsck given broken node id") Merge remote-tracking branch 'origin/upstream-f2fs-stable-linux-4.14.y' into android-4.14 Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y:1bb3cca126treewide: Use array_size in f2fs_kvzalloc()cf663a62b1treewide: Use array_size() in f2fs_kzalloc()eac699e689treewide: Use array_size() in f2fs_kmalloc()fc8ab902e9overflow.h: Add allocation size calculation helpersccd39d96d1f2fs: fix to clear FI_VOLATILE_FILE correctly57344fb593f2fs: let sync node IO interrupt async one6cf9490912f2fs: don't change wbc->sync_modec4a1d7bb27f2fs: fix to update mtime correctlyb693f29b24fs: f2fs: insert space around that ':' and ', '9449a17f33fs: f2fs: add missing blank lines after declarationsb6f703cbedfs: f2fs: changed variable type of offset "unsigned" to "loff_t"9919f98051f2fs: clean up symbol namespace1a37234c5ef2fs: make set_de_type() static57d24d20b7f2fs: make __f2fs_write_data_pages() statice269eadf64f2fs: fix to avoid accessing cross the boundary3e1842e7caf2fs: fix to let caller retry allocating block addressb97a9b9308disable loading f2fs module on PAGE_SIZE > 4KB46df5fe2baf2fs: fix error path of move_data_page1b8f49aeb0f2fs: don't drop dentry pages after fs shutdown5dbd21b17bf2fs: fix to avoid race during access gc_thread pointerb6f0cb1850f2fs: clean up with clear_radix_tree_dirty_tagb9272dd416f2fs: fix to don't trigger writeback during recoveryd46792d624f2fs: clear discard_wake earlier161d1c91b8f2fs: let discard thread wait a little longer if dev is busy4329d61ca5f2fs: avoid stucking GC due to atomic write223d239c6df2fs: introduce sbi->gc_mode to determine the policyc5f57523fcf2fs: keep migration IO order in LFS mode4a4f98b7e1f2fs: fix to wait page writeback during revoking atomic write6c5d01ab37f2fs: Fix deadlock in shutdown ioctl1f315091b8f2fs: detect synchronous writeback more earlierc806c4187amm: remove nr_pages argument from pagevec_lookup_{,range}_tag()8aa71a3295ceph: use pagevec_lookup_range_nr_tag()b44cc9e860mm: add variant of pagevec_lookup_range_tag() taking number of pagesaf44f89b90mm: use pagevec_lookup_range_tag() in write_cache_pages()a01f2023a8mm: use pagevec_lookup_range_tag() in __filemap_fdatawait_range()ed5739e31enilfs2: use pagevec_lookup_range_tag()95954b0dbbgfs2: use pagevec_lookup_range_tag()8d62b4b25bf2fs: use find_get_pages_tag() for looking up single page53f38f268af2fs: simplify page iteration loopsb0310cc6e6f2fs: use pagevec_lookup_range_tag()e62fbfd6d4ext4: use pagevec_lookup_range_tag()1062214924ceph: use pagevec_lookup_range_tag()4b65630c0dbtrfs: use pagevec_lookup_range_tag()8e8455a68cmm: implement find_get_pages_range_tag()a9a6eb48b7f2fs: clean up with is_valid_blkaddr()992fa7bd77f2fs: fix to initialize min_mtime with ULLONG_MAX9af9ec1b6cf2fs: fix to let checkpoint guarantee atomic page persistenced5f8aab3aef2fs: fix to initialize i_current_depth according to inode type12dab4e61bRevert "f2fs: add ovp valid_blocks check for bg gc victim to fg_gc"34f089c528f2fs: don't drop any page on f2fs_cp_error() case76dffc9986f2fs: fix spelling mistake: "extenstion" -> "extension"a5a897aabdf2fs: enhance sanity_check_raw_super() to avoid potential overflowsf0b5d76682f2fs: treat volatile file's data as hot one50644840d8f2fs: introduce release_discard_addr() for cleanup39b292a402f2fs: fix potential overflow76ddd4ff06f2fs: rename dio_rwsem to i_gc_rwsemc75638d5f5f2fs: move mnt_want_write_file after range checkcc7e70c070f2fs: fix missing clear FI_NO_PREALLOC in some error casec9b3f46fd2f2fs: enforce fsync_mode=strict for renamed directorycbbd81cf17f2fs: sanity check for total valid node blocksbbd9c950fdf2fs: sanity check on sit entryd921ced41cf2fs: avoid bug_on on corrupted inode32c00c538ef2fs: give message and set need_fsck given broken node id568765d739f2fs: clean up commit_inmem_pages()ac2074b52ef2fs: do not check F2FS_INLINE_DOTS in recover1f14739160f2fs: remove duplicated dquot_initialize and fix error handling913efaeca9f2fs: fix to detect failure of dquot_initializef60d3b8fccf2fs: stop issue discard if something wrong with f2fs4470ece5c0f2fs: fix return value in f2fs_ioc_commit_atomic_write318a9d5ae7f2fs: allocate hot_data for atomic write more strictlybd5f1c23a7f2fs: check if inmem_pages list is empty correctly2e405acc86f2fs: fix race in between GC and atomic open408e9720d8f2fs: change le32 to le16 of f2fs_inode->i_extra_size2f3cee5b22f2fs: check cur_valid_map_mir & raw_sit block count when flush sit entries8cd907eea5f2fs: correct return value of f2fs_trim_fs0be91d342af2fs: fix to show missing bits in FS_IOC_GETFLAGSdbfe915c2cf2fs: remove unneeded F2FS_PROJINHERIT_FLee8586bbd6f2fs: don't use GFP_ZERO for page caches50332ac97df2fs: issue all big range discards in umount process1c3ec702f0f2fs: remove redundant block plug694cd12fe9f2fs: remove unmatched zero_user_segment when convert inline dentry39c9aacbcdf2fs: introduce private inode status mapping755a8a8a3bfscrypt: log the crypto algorithm implementationse81950ade1fscrypt: add Speck128/256 support9637768c61fscrypt: only derive the needed portion of the keydeba2007d2fscrypt: separate key lookup from key derivation04566cd682fscrypt: use a common logging function2a95469530fscrypt: remove internal key size constantsfc161f4450fscrypt: remove unnecessary check for non-logon key typeab8345a11cfscrypt: make fscrypt_operations.max_namelen an integer65702a6ef7fscrypt: drop empty name check from fname_decrypt()219e65410cfscrypt: drop max_namelen check from fname_decrypt()ef1def58e2fscrypt: don't special-case EOPNOTSUPP from fscrypt_get_encryption_info()49ddcfcdd7fscrypt: don't clear flags on crypto transformff8225b62cfscrypt: remove stale comment from fscrypt_d_revalidate()712401bc77fscrypt: remove error messages for skcipher_request_alloc() failure6e4e39cc92fscrypt: remove unnecessary NULL check when allocating skcipher42b3feb2bdfscrypt: clean up after fscrypt_prepare_lookup() conversionse43a072723ubifs: switch to fscrypt_prepare_lookup()f76b2cb673ext4: switch to fscrypt_prepare_lookup()fc30ddc3b0fscrypt: use unbound workqueue for decryption Change-Id: I3912aa38b2bf515ef8af8ed4945e54bc63945c86 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
90 lines
2.3 KiB
C
90 lines
2.3 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* 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_range(struct pagevec *pvec,
|
|
struct address_space *mapping,
|
|
pgoff_t *start, pgoff_t end);
|
|
static inline unsigned pagevec_lookup(struct pagevec *pvec,
|
|
struct address_space *mapping,
|
|
pgoff_t *start)
|
|
{
|
|
return pagevec_lookup_range(pvec, mapping, start, (pgoff_t)-1);
|
|
}
|
|
|
|
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 */
|