Some cleanups for shmem
Subsystems (3)
Baolin Wang
reviewercover Some cleanups for shmem
Hi,
This series does some cleanups to reuse code, rename functions and simplify logic to make code more clear. No functional changes are expected.
Baolin Wang (3):
mm: shmem: simplify the suitable huge orders validation for tmpfs
mm: shmem: rename shmem_is_huge() to shmem_huge_global_enabled()
mm: shmem: move shmem_huge_global_enabled() into
shmem_allowable_huge_orders()
include/linux/shmem_fs.h | 11 +----- mm/huge_memory.c | 11 ++---- mm/shmem.c | 84 ++++++++++++++++++++-------------------- 3 files changed, 46 insertions(+), 60 deletions(-)
Signature · 1 line
2.39.3
Baolin Wang
reviewerPATCH 1/3 mm: shmem: simplify the suitable huge orders validation for tmpfs
Move the suitable huge orders validation into shmem_suitable_orders() for tmpfs, which can reuse some code to simplify the logic.
In addition, we don't have special handling for the error code -E2BIG when checking for conflicts with PMD sized THP in the pagecache for tmpfs, instead, it will just fallback to order-0 allocations like this patch does, so this simplification will not add functional changes.
--- mm/shmem.c | 39 +++++++++++++++------------------------ 1 file changed, 15 insertions(+), 24 deletions(-)
mm/shmem.c +15 -24
@@ -1685,19 +1685,29 @@ static unsigned long shmem_suitable_orders(struct inode *inode, struct vm_fault struct address_space *mapping, pgoff_t index, unsigned long orders) { - struct vm_area_struct *vma = vmf->vma; + struct vm_area_struct *vma = vmf ? vmf->vma : NULL;unsigned long pages;int order; - orders =thp_vma_suitable_orders (vma, vmf->address, orders); -if (!orders) -return 0 ; +if (vma) { + orders =thp_vma_suitable_orders (vma, vmf->address, orders); +if (!orders) +return 0 ; + }/* Find the highest order that can add into the page cache */ order =highest_order (orders);while (orders) { pages =1UL << order; index =round_down (index, pages); +/* +* Check for conflict before waiting on a huge allocation. +* Conflict might be that a huge page has just been allocated +* and added to page cache by a racing thread, or that there +* is already at least one small page in the huge extent. +* Be careful to retry when appropriate, but not forever! +* Elsewhere -EEXIST would be the right code, but not here. +*/ if (!xa_find (&mapping->i_pages, &index, index + pages -1 ,XA_PRESENT ))break ;
@@ -1735,7 +1745,6 @@ static struct folio *shmem_alloc_and_add_folio(struct vm_fault *vmf, {struct address_space *mapping = inode->i_mapping;struct shmem_inode_info *info =SHMEM_I (inode); -struct vm_area_struct *vma = vmf ? vmf->vma :NULL ;unsigned long suitable_orders =0 ;struct folio *folio =NULL ;long pages;
@@ -1745,26 +1754,8 @@ static struct folio *shmem_alloc_and_add_folio(struct vm_fault *vmf, orders =0 ;if (orders >0 ) { -if (vma &&vma_is_anon_shmem (vma)) { - suitable_orders =shmem_suitable_orders (inode, vmf, + suitable_orders =shmem_suitable_orders (inode, vmf, mapping, index, orders); - }else if (orders &BIT (HPAGE_PMD_ORDER )) { - pages =HPAGE_PMD_NR ; - suitable_orders =BIT (HPAGE_PMD_ORDER ); - index =round_down (index,HPAGE_PMD_NR ); - -/* -* Check for conflict before waiting on a huge allocation. -* Conflict might be that a huge page has just been allocated -* and added to page cache by a racing thread, or that there -* is already at least one small page in the huge extent. -* Be careful to retry when appropriate, but not forever! -* Elsewhere -EEXIST would be the right code, but not here. -*/ -if (xa_find (&mapping->i_pages, &index, - index +HPAGE_PMD_NR -1 ,XA_PRESENT )) -return ERR_PTR (-E2BIG ); - } order =highest_order (suitable_orders);while (suitable_orders) {
Signature · 1 line
2.39.3
Baolin Wang
reviewerPATCH 2/3 mm: shmem: rename shmem_is_huge() to shmem_huge_global_enabled()
In reply to Baolin WangThe shmem_is_huge() is now used to check if the top-level huge page is enabled, thus rename it to reflect its usage.
--- include/linux/shmem_fs.h | 9 +++++---- mm/huge_memory.c | 5 +++-- mm/shmem.c | 15 ++++++++------- 3 files changed, 16 insertions(+), 13 deletions(-)
include/linux/shmem_fs.h +5 -4
@@ -111,14 +111,15 @@ extern void shmem_truncate_range(struct inode *inode, loff_t start, loff_t end);int shmem_unuse (unsigned int type);#ifdef CONFIG_TRANSPARENT_HUGEPAGE -extern bool shmem_is_huge (struct inode *inode,pgoff_t index,bool shmem_huge_force, -struct mm_struct *mm,unsigned long vm_flags); +extern bool shmem_huge_global_enabled (struct inode *inode,pgoff_t index,bool shmem_huge_force, +struct mm_struct *mm,unsigned long vm_flags);unsigned long shmem_allowable_huge_orders (struct inode *inode,struct vm_area_struct *vma,pgoff_t index,bool global_huge);#else -static __always_inline bool shmem_is_huge(struct inode *inode, pgoff_t index, bool shmem_huge_force, -struct mm_struct *mm,unsigned long vm_flags) +static __always_inline bool shmem_huge_global_enabled(struct inode *inode, pgoff_t index, +bool shmem_huge_force,struct mm_struct *mm, +unsigned long vm_flags) {return false; }
mm/huge_memory.c +3 -2
@@ -152,8 +152,9 @@ unsigned long __thp_vma_allowable_orders(struct vm_area_struct *vma,* own flags. */ if (!in_pf &&shmem_file (vma->vm_file)) { -bool global_huge =shmem_is_huge (file_inode (vma->vm_file), vma->vm_pgoff, - !enforce_sysfs, vma->vm_mm, vm_flags); +bool global_huge =shmem_huge_global_enabled (file_inode (vma->vm_file), + vma->vm_pgoff, !enforce_sysfs, + vma->vm_mm, vm_flags);if (!vma_is_anon_shmem (vma))return global_huge ? orders :0 ;
mm/shmem.c +8 -7
@@ -548,9 +548,9 @@ static bool shmem_confirm_swap(struct address_space *mapping,static int shmem_huge__read_mostly =SHMEM_HUGE_NEVER ; -static bool __shmem_is_huge (struct inode *inode,pgoff_t index, -bool shmem_huge_force,struct mm_struct *mm, -unsigned long vm_flags) +static bool __shmem_huge_global_enabled (struct inode *inode,pgoff_t index, +bool shmem_huge_force,struct mm_struct *mm, +unsigned long vm_flags) {loff_t i_size;
@@ -581,14 +581,15 @@ static bool __shmem_is_huge(struct inode *inode, pgoff_t index, } } -bool shmem_is_huge (struct inode *inode,pgoff_t index, +bool shmem_huge_global_enabled (struct inode *inode,pgoff_t index,bool shmem_huge_force,struct mm_struct *mm,unsigned long vm_flags) {if (HPAGE_PMD_ORDER >MAX_PAGECACHE_ORDER )return false; -return __shmem_is_huge (inode, index, shmem_huge_force, mm, vm_flags); +return __shmem_huge_global_enabled (inode, index, shmem_huge_force, + mm, vm_flags); }#if defined(CONFIG_SYSFS )
@@ -1156,7 +1157,7 @@ static int shmem_getattr(struct mnt_idmap *idmap, STATX_ATTR_NODUMP);generic_fillattr (idmap, request_mask, inode, stat); -if (shmem_is_huge (inode,0 , false,NULL ,0 )) +if (shmem_huge_global_enabled (inode,0 , false,NULL ,0 )) stat->blksize =HPAGE_PMD_SIZE ;if (request_mask &STATX_BTIME ) {
@@ -2153,7 +2154,7 @@ static int shmem_get_folio_gfp(struct inode *inode, pgoff_t index,return 0 ; } - huge =shmem_is_huge (inode, index, false, fault_mm, + huge =shmem_huge_global_enabled (inode, index, false, fault_mm, vma ? vma->vm_flags :0 );/* Find hugepage orders that are allowed for anonymous shmem. */ if (vma &&vma_is_anon_shmem (vma))
Signature · 1 line
2.39.3
Baolin Wang
reviewerPATCH 3/3 mm: shmem: move shmem_huge_global_enabled() into shmem_allowable_huge_orders()
In reply to Baolin WangMove shmem_huge_global_enabled() into the shmem_allowable_huge_orders() function, so that shmem_allowable_huge_orders() can also help to find the allowable huge orders for tmpfs. Moreover the shmem_huge_global_enabled() can become static.
No functional changes.
--- include/linux/shmem_fs.h | 12 ++---------- mm/huge_memory.c | 12 +++--------- mm/shmem.c | 34 ++++++++++++++++++++-------------- 3 files changed, 25 insertions(+), 33 deletions(-)
include/linux/shmem_fs.h +2 -10
@@ -111,21 +111,13 @@ extern void shmem_truncate_range(struct inode *inode, loff_t start, loff_t end);int shmem_unuse (unsigned int type);#ifdef CONFIG_TRANSPARENT_HUGEPAGE -extern bool shmem_huge_global_enabled (struct inode *inode,pgoff_t index,bool shmem_huge_force, -struct mm_struct *mm,unsigned long vm_flags);unsigned long shmem_allowable_huge_orders (struct inode *inode,struct vm_area_struct *vma,pgoff_t index, -bool global_huge); +bool shmem_huge_force);#else -static __always_inline bool shmem_huge_global_enabled(struct inode *inode, pgoff_t index, -bool shmem_huge_force,struct mm_struct *mm, -unsigned long vm_flags) -{ -return false; -}static inline unsigned long shmem_allowable_huge_orders (struct inode *inode,struct vm_area_struct *vma,pgoff_t index, -bool global_huge) +bool shmem_huge_force) {return 0 ; }
mm/huge_memory.c +3 -9
@@ -151,16 +151,10 @@ unsigned long __thp_vma_allowable_orders(struct vm_area_struct *vma,* Must be done before hugepage flags check since shmem has its * own flags. */ -if (!in_pf &&shmem_file (vma->vm_file)) { -bool global_huge =shmem_huge_global_enabled (file_inode (vma->vm_file), - vma->vm_pgoff, !enforce_sysfs, - vma->vm_mm, vm_flags); - -if (!vma_is_anon_shmem (vma)) -return global_huge ? orders :0 ; +if (!in_pf &&shmem_file (vma->vm_file))return shmem_allowable_huge_orders (file_inode (vma->vm_file), - vma, vma->vm_pgoff, global_huge); - } + vma, vma->vm_pgoff, + !enforce_sysfs);if (!vma_is_anonymous (vma)) {/*
mm/shmem.c +20 -14
@@ -581,7 +581,7 @@ static bool __shmem_huge_global_enabled(struct inode *inode, pgoff_t index, } } -bool shmem_huge_global_enabled (struct inode *inode,pgoff_t index, +static bool shmem_huge_global_enabled (struct inode *inode,pgoff_t index,bool shmem_huge_force,struct mm_struct *mm,unsigned long vm_flags) {
@@ -1625,27 +1625,39 @@ static gfp_t limit_gfp_mask(gfp_t huge_gfp, gfp_t limit_gfp)#ifdef CONFIG_TRANSPARENT_HUGEPAGE unsigned long shmem_allowable_huge_orders (struct inode *inode,struct vm_area_struct *vma,pgoff_t index, -bool global_huge) +bool shmem_huge_force) {unsigned long mask =READ_ONCE (huge_shmem_orders_always);unsigned long within_size_orders =READ_ONCE (huge_shmem_orders_within_size); -unsigned long vm_flags = vma->vm_flags; +unsigned long vm_flags = vma ? vma->vm_flags :0 ; +struct mm_struct *fault_mm = vma ? vma->vm_mm :NULL ;/* * Check all the (large) orders below HPAGE_PMD_ORDER + 1 that * are enabled for this vma. */ unsigned long orders =BIT (PMD_ORDER +1 ) -1 ; +bool global_huge;loff_t i_size;int order; -if ((vm_flags &VM_NOHUGEPAGE ) || -test_bit (MMF_DISABLE_THP , &vma->vm_mm->flags)) +if (vma && ((vm_flags &VM_NOHUGEPAGE ) || +test_bit (MMF_DISABLE_THP , &vma->vm_mm->flags)))return 0 ;/* If the hardware/firmware marked hugepage support disabled. */ if (transparent_hugepage_flags & (1 <<TRANSPARENT_HUGEPAGE_UNSUPPORTED ))return 0 ; + global_huge =shmem_huge_global_enabled (inode, index, shmem_huge_force, + fault_mm, vm_flags); +if (!vma || !vma_is_anon_shmem (vma)) { +/* +* For tmpfs, we now only support PMD sized THP if huge page +* is enabled, otherwise fallback to order 0. +*/ +return global_huge ?BIT (HPAGE_PMD_ORDER ) :0 ; + } +/* * Following the 'deny' semantics of the top level, force the huge * option off from all mounts.
@@ -2081,7 +2093,7 @@ static int shmem_get_folio_gfp(struct inode *inode, pgoff_t index,struct mm_struct *fault_mm;struct folio *folio;int error; -bool alloced, huge; +bool alloced;unsigned long orders =0 ;if (WARN_ON_ONCE (!shmem_mapping (inode->i_mapping)))
@@ -2154,14 +2166,8 @@ static int shmem_get_folio_gfp(struct inode *inode, pgoff_t index,return 0 ; } - huge =shmem_huge_global_enabled (inode, index, false, fault_mm, - vma ? vma->vm_flags :0 ); -/* Find hugepage orders that are allowed for anonymous shmem. */ -if (vma &&vma_is_anon_shmem (vma)) - orders =shmem_allowable_huge_orders (inode, vma, index, huge); -else if (huge) - orders =BIT (HPAGE_PMD_ORDER ); - +/* Find hugepage orders that are allowed for anonymous shmem and tmpfs. */ + orders =shmem_allowable_huge_orders (inode, vma, index, false);if (orders >0 ) {gfp_t huge_gfp;
Signature · 1 line
2.39.3
kernel test robot
build botRe: [PATCH 3/3] mm: shmem: move shmem_huge_global_enabled() into shmem_allowable_huge_orders()
kernel test robot noticed the following build errors:
Hi Baolin,
kernel test robot noticed the following build errors:
[auto build test ERROR on akpm-mm/mm-everything]
[also build test ERROR on next-20240711]
[cannot apply to linus/master v6.10-rc7]
[If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Baolin-Wang/mm-shmem-simplify-the-suitable-huge-orders-validation-for-tmpfs/20240711-134512 base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything patch link: https://lore.kernel.org/r/6e5858d345304d0428c1c2c2a25c289c062b4ea8.1720668581.git.baolin.wang%40linux.alibaba.com patch subject: [PATCH 3/3] mm: shmem: move shmem_huge_global_enabled() into shmem_allowable_huge_orders() config: x86_64-allnoconfig (https://download.01.org/0day-ci/archive/20240712/[email protected]/config) compiler: clang version 18.1.5 (https://github.com/llvm/llvm-project 617a15a9eac96088ae5e9134248d8236e34b91b1) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240712/[email protected]/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
All errors (new ones prefixed by >>):
>> mm/shmem.c:1160:6: error: call to undeclared function 'shmem_huge_global_enabled'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
1160 | if (shmem_huge_global_enabled(inode, 0, false, NULL, 0))
| ^1 error generated.
vim +/shmem_huge_global_enabled +1160 mm/shmem.c
^1da177e4c3f41 Linus Torvalds 2005-04-16 1138
b74d24f7a74ffd Christian Brauner 2023-01-13 1139 static int shmem_getattr(struct mnt_idmap *idmap,
549c7297717c32 Christian Brauner 2021-01-21 1140 const struct path *path, struct kstat *stat,
a528d35e8bfcc5 David Howells 2017-01-31 1141 u32 request_mask, unsigned int query_flags)
44a30220bc0a17 Yu Zhao 2015-09-08 1142 {
a528d35e8bfcc5 David Howells 2017-01-31 1143 struct inode *inode = path->dentry->d_inode;
44a30220bc0a17 Yu Zhao 2015-09-08 1144 struct shmem_inode_info *info = SHMEM_I(inode);
44a30220bc0a17 Yu Zhao 2015-09-08 1145
3c1b7528d8969a Hugh Dickins 2023-08-03 1146 if (info->alloced - info->swapped != inode->i_mapping->nrpages)
3c1b7528d8969a Hugh Dickins 2023-08-03 1147 shmem_recalc_inode(inode, 0, 0);
3c1b7528d8969a Hugh Dickins 2023-08-03 1148
e408e695f5f1f6 Theodore Ts'o 2022-07-14 1149 if (info->fsflags & FS_APPEND_FL)
e408e695f5f1f6 Theodore Ts'o 2022-07-14 1150 stat->attributes |= STATX_ATTR_APPEND;
e408e695f5f1f6 Theodore Ts'o 2022-07-14 1151 if (info->fsflags & FS_IMMUTABLE_FL)
e408e695f5f1f6 Theodore Ts'o 2022-07-14 1152 stat->attributes |= STATX_ATTR_IMMUTABLE;
e408e695f5f1f6 Theodore Ts'o 2022-07-14 1153 if (info->fsflags & FS_NODUMP_FL)
e408e695f5f1f6 Theodore Ts'o 2022-07-14 1154 stat->attributes |= STATX_ATTR_NODUMP;
e408e695f5f1f6 Theodore Ts'o 2022-07-14 1155 stat->attributes_mask |= (STATX_ATTR_APPEND |
e408e695f5f1f6 Theodore Ts'o 2022-07-14 1156 STATX_ATTR_IMMUTABLE |
e408e695f5f1f6 Theodore Ts'o 2022-07-14 1157 STATX_ATTR_NODUMP);
0d72b92883c651 Jeff Layton 2023-08-07 1158 generic_fillattr(idmap, request_mask, inode, stat);
89fdcd262fd407 Yang Shi 2018-06-07 1159
dca7b12ffe751b Baolin Wang 2024-07-11 @1160 if (shmem_huge_global_enabled(inode, 0, false, NULL, 0))
89fdcd262fd407 Yang Shi 2018-06-07 1161 stat->blksize = HPAGE_PMD_SIZE;
89fdcd262fd407 Yang Shi 2018-06-07 1162
f7cd16a55837f3 Xavier Roche 2022-03-22 1163 if (request_mask & STATX_BTIME) {
f7cd16a55837f3 Xavier Roche 2022-03-22 1164 stat->result_mask |= STATX_BTIME;
f7cd16a55837f3 Xavier Roche 2022-03-22 1165 stat->btime.tv_sec = info->i_crtime.tv_sec;
f7cd16a55837f3 Xavier Roche 2022-03-22 1166 stat->btime.tv_nsec = info->i_crtime.tv_nsec;
f7cd16a55837f3 Xavier Roche 2022-03-22 1167 }
f7cd16a55837f3 Xavier Roche 2022-03-22 1168
44a30220bc0a17 Yu Zhao 2015-09-08 1169 return 0;
44a30220bc0a17 Yu Zhao 2015-09-08 1170 }
44a30220bc0a17 Yu Zhao 2015-09-08 1171 Signature · 2 lines
0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Baolin Wang
reviewerRe: [PATCH 3/3] mm: shmem: move shmem_huge_global_enabled() into shmem_allowable_huge_orders()
Quoted 24 lines · kernel test robot
Hi Baolin,
kernel test robot noticed the following build errors:
[auto build test ERROR on akpm-mm/mm-everything]
[also build test ERROR on next-20240711]
[cannot apply to linus/master v6.10-rc7]
[If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]url: https://github.com/intel-lab-lkp/linux/commits/Baolin-Wang/mm-shmem-simplify-the-suitable-huge-orders-validation-for-tmpfs/20240711-134512 base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything patch link: https://lore.kernel.org/r/6e5858d345304d0428c1c2c2a25c289c062b4ea8.1720668581.git.baolin.wang%40linux.alibaba.com patch subject: [PATCH 3/3] mm: shmem: move shmem_huge_global_enabled() into shmem_allowable_huge_orders() config: x86_64-allnoconfig (https://download.01.org/0day-ci/archive/20240712/[email protected]/config) compiler: clang version 18.1.5 (https://github.com/llvm/llvm-project 617a15a9eac96088ae5e9134248d8236e34b91b1) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240712/[email protected]/reproduce)If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
Quoted 6 lines
All errors (new ones prefixed by >>):
Quoted 1 line
Quoted 1 line
mm/shmem.c:1160:6: error: call to undeclared function 'shmem_huge_global_enabled'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]1160 | if (
shmem_huge_global_enabled(inode, 0, false, NULL, 0))
| ^
1 error generated.
Thanks for reporting. I forgot to add a dummy function in case CONFIG_TRANSPARENT_HUGEPAGE is not enabled. Will fix in next version.
kernel test robot
build botRe: [PATCH 3/3] mm: shmem: move shmem_huge_global_enabled() into shmem_allowable_huge_orders()
In reply to Baolin Wangkernel test robot noticed the following build errors:
Hi Baolin,
kernel test robot noticed the following build errors:
[auto build test ERROR on akpm-mm/mm-everything]
[also build test ERROR on next-20240711]
[cannot apply to linus/master v6.10-rc7]
[If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Baolin-Wang/mm-shmem-simplify-the-suitable-huge-orders-validation-for-tmpfs/20240711-134512 base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything patch link: https://lore.kernel.org/r/6e5858d345304d0428c1c2c2a25c289c062b4ea8.1720668581.git.baolin.wang%40linux.alibaba.com patch subject: [PATCH 3/3] mm: shmem: move shmem_huge_global_enabled() into shmem_allowable_huge_orders() config: x86_64-defconfig (https://download.01.org/0day-ci/archive/20240712/[email protected]/config) compiler: gcc-13 (Ubuntu 13.2.0-4ubuntu3) 13.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240712/[email protected]/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
All errors (new ones prefixed by >>):
mm/shmem.c: In function 'shmem_getattr':
>> mm/shmem.c:1160:13: error: implicit declaration of function 'shmem_huge_global_enabled' [-Werror=implicit-function-declaration]
1160 | if (shmem_huge_global_enabled(inode, 0, false, NULL, 0))
| ^~~~~~~~~~~~~~~~~~~~~~~~~cc1: some warnings being treated as errors
vim +/shmem_huge_global_enabled +1160 mm/shmem.c
^1da177e4c3f41 Linus Torvalds 2005-04-16 1138
b74d24f7a74ffd Christian Brauner 2023-01-13 1139 static int shmem_getattr(struct mnt_idmap *idmap,
549c7297717c32 Christian Brauner 2021-01-21 1140 const struct path *path, struct kstat *stat,
a528d35e8bfcc5 David Howells 2017-01-31 1141 u32 request_mask, unsigned int query_flags)
44a30220bc0a17 Yu Zhao 2015-09-08 1142 {
a528d35e8bfcc5 David Howells 2017-01-31 1143 struct inode *inode = path->dentry->d_inode;
44a30220bc0a17 Yu Zhao 2015-09-08 1144 struct shmem_inode_info *info = SHMEM_I(inode);
44a30220bc0a17 Yu Zhao 2015-09-08 1145
3c1b7528d8969a Hugh Dickins 2023-08-03 1146 if (info->alloced - info->swapped != inode->i_mapping->nrpages)
3c1b7528d8969a Hugh Dickins 2023-08-03 1147 shmem_recalc_inode(inode, 0, 0);
3c1b7528d8969a Hugh Dickins 2023-08-03 1148
e408e695f5f1f6 Theodore Ts'o 2022-07-14 1149 if (info->fsflags & FS_APPEND_FL)
e408e695f5f1f6 Theodore Ts'o 2022-07-14 1150 stat->attributes |= STATX_ATTR_APPEND;
e408e695f5f1f6 Theodore Ts'o 2022-07-14 1151 if (info->fsflags & FS_IMMUTABLE_FL)
e408e695f5f1f6 Theodore Ts'o 2022-07-14 1152 stat->attributes |= STATX_ATTR_IMMUTABLE;
e408e695f5f1f6 Theodore Ts'o 2022-07-14 1153 if (info->fsflags & FS_NODUMP_FL)
e408e695f5f1f6 Theodore Ts'o 2022-07-14 1154 stat->attributes |= STATX_ATTR_NODUMP;
e408e695f5f1f6 Theodore Ts'o 2022-07-14 1155 stat->attributes_mask |= (STATX_ATTR_APPEND |
e408e695f5f1f6 Theodore Ts'o 2022-07-14 1156 STATX_ATTR_IMMUTABLE |
e408e695f5f1f6 Theodore Ts'o 2022-07-14 1157 STATX_ATTR_NODUMP);
0d72b92883c651 Jeff Layton 2023-08-07 1158 generic_fillattr(idmap, request_mask, inode, stat);
89fdcd262fd407 Yang Shi 2018-06-07 1159
dca7b12ffe751b Baolin Wang 2024-07-11 @1160 if (shmem_huge_global_enabled(inode, 0, false, NULL, 0))
89fdcd262fd407 Yang Shi 2018-06-07 1161 stat->blksize = HPAGE_PMD_SIZE;
89fdcd262fd407 Yang Shi 2018-06-07 1162
f7cd16a55837f3 Xavier Roche 2022-03-22 1163 if (request_mask & STATX_BTIME) {
f7cd16a55837f3 Xavier Roche 2022-03-22 1164 stat->result_mask |= STATX_BTIME;
f7cd16a55837f3 Xavier Roche 2022-03-22 1165 stat->btime.tv_sec = info->i_crtime.tv_sec;
f7cd16a55837f3 Xavier Roche 2022-03-22 1166 stat->btime.tv_nsec = info->i_crtime.tv_nsec;
f7cd16a55837f3 Xavier Roche 2022-03-22 1167 }
f7cd16a55837f3 Xavier Roche 2022-03-22 1168
44a30220bc0a17 Yu Zhao 2015-09-08 1169 return 0;
44a30220bc0a17 Yu Zhao 2015-09-08 1170 }
44a30220bc0a17 Yu Zhao 2015-09-08 1171 Signature · 2 lines
0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki