162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/fs/sysv/inode.c 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * minix/inode.c 662306a36Sopenharmony_ci * Copyright (C) 1991, 1992 Linus Torvalds 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * xenix/inode.c 962306a36Sopenharmony_ci * Copyright (C) 1992 Doug Evans 1062306a36Sopenharmony_ci * 1162306a36Sopenharmony_ci * coh/inode.c 1262306a36Sopenharmony_ci * Copyright (C) 1993 Pascal Haible, Bruno Haible 1362306a36Sopenharmony_ci * 1462306a36Sopenharmony_ci * sysv/inode.c 1562306a36Sopenharmony_ci * Copyright (C) 1993 Paul B. Monday 1662306a36Sopenharmony_ci * 1762306a36Sopenharmony_ci * sysv/inode.c 1862306a36Sopenharmony_ci * Copyright (C) 1993 Bruno Haible 1962306a36Sopenharmony_ci * Copyright (C) 1997, 1998 Krzysztof G. Baranowski 2062306a36Sopenharmony_ci * 2162306a36Sopenharmony_ci * This file contains code for allocating/freeing inodes and for read/writing 2262306a36Sopenharmony_ci * the superblock. 2362306a36Sopenharmony_ci */ 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#include <linux/highuid.h> 2662306a36Sopenharmony_ci#include <linux/slab.h> 2762306a36Sopenharmony_ci#include <linux/init.h> 2862306a36Sopenharmony_ci#include <linux/buffer_head.h> 2962306a36Sopenharmony_ci#include <linux/vfs.h> 3062306a36Sopenharmony_ci#include <linux/writeback.h> 3162306a36Sopenharmony_ci#include <linux/namei.h> 3262306a36Sopenharmony_ci#include <asm/byteorder.h> 3362306a36Sopenharmony_ci#include "sysv.h" 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_cistatic int sysv_sync_fs(struct super_block *sb, int wait) 3662306a36Sopenharmony_ci{ 3762306a36Sopenharmony_ci struct sysv_sb_info *sbi = SYSV_SB(sb); 3862306a36Sopenharmony_ci u32 time = (u32)ktime_get_real_seconds(), old_time; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci mutex_lock(&sbi->s_lock); 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci /* 4362306a36Sopenharmony_ci * If we are going to write out the super block, 4462306a36Sopenharmony_ci * then attach current time stamp. 4562306a36Sopenharmony_ci * But if the filesystem was marked clean, keep it clean. 4662306a36Sopenharmony_ci */ 4762306a36Sopenharmony_ci old_time = fs32_to_cpu(sbi, *sbi->s_sb_time); 4862306a36Sopenharmony_ci if (sbi->s_type == FSTYPE_SYSV4) { 4962306a36Sopenharmony_ci if (*sbi->s_sb_state == cpu_to_fs32(sbi, 0x7c269d38u - old_time)) 5062306a36Sopenharmony_ci *sbi->s_sb_state = cpu_to_fs32(sbi, 0x7c269d38u - time); 5162306a36Sopenharmony_ci *sbi->s_sb_time = cpu_to_fs32(sbi, time); 5262306a36Sopenharmony_ci mark_buffer_dirty(sbi->s_bh2); 5362306a36Sopenharmony_ci } 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci mutex_unlock(&sbi->s_lock); 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci return 0; 5862306a36Sopenharmony_ci} 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_cistatic int sysv_remount(struct super_block *sb, int *flags, char *data) 6162306a36Sopenharmony_ci{ 6262306a36Sopenharmony_ci struct sysv_sb_info *sbi = SYSV_SB(sb); 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci sync_filesystem(sb); 6562306a36Sopenharmony_ci if (sbi->s_forced_ro) 6662306a36Sopenharmony_ci *flags |= SB_RDONLY; 6762306a36Sopenharmony_ci return 0; 6862306a36Sopenharmony_ci} 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_cistatic void sysv_put_super(struct super_block *sb) 7162306a36Sopenharmony_ci{ 7262306a36Sopenharmony_ci struct sysv_sb_info *sbi = SYSV_SB(sb); 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci if (!sb_rdonly(sb)) { 7562306a36Sopenharmony_ci /* XXX ext2 also updates the state here */ 7662306a36Sopenharmony_ci mark_buffer_dirty(sbi->s_bh1); 7762306a36Sopenharmony_ci if (sbi->s_bh1 != sbi->s_bh2) 7862306a36Sopenharmony_ci mark_buffer_dirty(sbi->s_bh2); 7962306a36Sopenharmony_ci } 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci brelse(sbi->s_bh1); 8262306a36Sopenharmony_ci if (sbi->s_bh1 != sbi->s_bh2) 8362306a36Sopenharmony_ci brelse(sbi->s_bh2); 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci kfree(sbi); 8662306a36Sopenharmony_ci} 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_cistatic int sysv_statfs(struct dentry *dentry, struct kstatfs *buf) 8962306a36Sopenharmony_ci{ 9062306a36Sopenharmony_ci struct super_block *sb = dentry->d_sb; 9162306a36Sopenharmony_ci struct sysv_sb_info *sbi = SYSV_SB(sb); 9262306a36Sopenharmony_ci u64 id = huge_encode_dev(sb->s_bdev->bd_dev); 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci buf->f_type = sb->s_magic; 9562306a36Sopenharmony_ci buf->f_bsize = sb->s_blocksize; 9662306a36Sopenharmony_ci buf->f_blocks = sbi->s_ndatazones; 9762306a36Sopenharmony_ci buf->f_bavail = buf->f_bfree = sysv_count_free_blocks(sb); 9862306a36Sopenharmony_ci buf->f_files = sbi->s_ninodes; 9962306a36Sopenharmony_ci buf->f_ffree = sysv_count_free_inodes(sb); 10062306a36Sopenharmony_ci buf->f_namelen = SYSV_NAMELEN; 10162306a36Sopenharmony_ci buf->f_fsid = u64_to_fsid(id); 10262306a36Sopenharmony_ci return 0; 10362306a36Sopenharmony_ci} 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci/* 10662306a36Sopenharmony_ci * NXI <-> N0XI for PDP, XIN <-> XIN0 for le32, NIX <-> 0NIX for be32 10762306a36Sopenharmony_ci */ 10862306a36Sopenharmony_cistatic inline void read3byte(struct sysv_sb_info *sbi, 10962306a36Sopenharmony_ci unsigned char * from, unsigned char * to) 11062306a36Sopenharmony_ci{ 11162306a36Sopenharmony_ci if (sbi->s_bytesex == BYTESEX_PDP) { 11262306a36Sopenharmony_ci to[0] = from[0]; 11362306a36Sopenharmony_ci to[1] = 0; 11462306a36Sopenharmony_ci to[2] = from[1]; 11562306a36Sopenharmony_ci to[3] = from[2]; 11662306a36Sopenharmony_ci } else if (sbi->s_bytesex == BYTESEX_LE) { 11762306a36Sopenharmony_ci to[0] = from[0]; 11862306a36Sopenharmony_ci to[1] = from[1]; 11962306a36Sopenharmony_ci to[2] = from[2]; 12062306a36Sopenharmony_ci to[3] = 0; 12162306a36Sopenharmony_ci } else { 12262306a36Sopenharmony_ci to[0] = 0; 12362306a36Sopenharmony_ci to[1] = from[0]; 12462306a36Sopenharmony_ci to[2] = from[1]; 12562306a36Sopenharmony_ci to[3] = from[2]; 12662306a36Sopenharmony_ci } 12762306a36Sopenharmony_ci} 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_cistatic inline void write3byte(struct sysv_sb_info *sbi, 13062306a36Sopenharmony_ci unsigned char * from, unsigned char * to) 13162306a36Sopenharmony_ci{ 13262306a36Sopenharmony_ci if (sbi->s_bytesex == BYTESEX_PDP) { 13362306a36Sopenharmony_ci to[0] = from[0]; 13462306a36Sopenharmony_ci to[1] = from[2]; 13562306a36Sopenharmony_ci to[2] = from[3]; 13662306a36Sopenharmony_ci } else if (sbi->s_bytesex == BYTESEX_LE) { 13762306a36Sopenharmony_ci to[0] = from[0]; 13862306a36Sopenharmony_ci to[1] = from[1]; 13962306a36Sopenharmony_ci to[2] = from[2]; 14062306a36Sopenharmony_ci } else { 14162306a36Sopenharmony_ci to[0] = from[1]; 14262306a36Sopenharmony_ci to[1] = from[2]; 14362306a36Sopenharmony_ci to[2] = from[3]; 14462306a36Sopenharmony_ci } 14562306a36Sopenharmony_ci} 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_cistatic const struct inode_operations sysv_symlink_inode_operations = { 14862306a36Sopenharmony_ci .get_link = page_get_link, 14962306a36Sopenharmony_ci .getattr = sysv_getattr, 15062306a36Sopenharmony_ci}; 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_civoid sysv_set_inode(struct inode *inode, dev_t rdev) 15362306a36Sopenharmony_ci{ 15462306a36Sopenharmony_ci if (S_ISREG(inode->i_mode)) { 15562306a36Sopenharmony_ci inode->i_op = &sysv_file_inode_operations; 15662306a36Sopenharmony_ci inode->i_fop = &sysv_file_operations; 15762306a36Sopenharmony_ci inode->i_mapping->a_ops = &sysv_aops; 15862306a36Sopenharmony_ci } else if (S_ISDIR(inode->i_mode)) { 15962306a36Sopenharmony_ci inode->i_op = &sysv_dir_inode_operations; 16062306a36Sopenharmony_ci inode->i_fop = &sysv_dir_operations; 16162306a36Sopenharmony_ci inode->i_mapping->a_ops = &sysv_aops; 16262306a36Sopenharmony_ci } else if (S_ISLNK(inode->i_mode)) { 16362306a36Sopenharmony_ci inode->i_op = &sysv_symlink_inode_operations; 16462306a36Sopenharmony_ci inode_nohighmem(inode); 16562306a36Sopenharmony_ci inode->i_mapping->a_ops = &sysv_aops; 16662306a36Sopenharmony_ci } else 16762306a36Sopenharmony_ci init_special_inode(inode, inode->i_mode, rdev); 16862306a36Sopenharmony_ci} 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_cistruct inode *sysv_iget(struct super_block *sb, unsigned int ino) 17162306a36Sopenharmony_ci{ 17262306a36Sopenharmony_ci struct sysv_sb_info * sbi = SYSV_SB(sb); 17362306a36Sopenharmony_ci struct buffer_head * bh; 17462306a36Sopenharmony_ci struct sysv_inode * raw_inode; 17562306a36Sopenharmony_ci struct sysv_inode_info * si; 17662306a36Sopenharmony_ci struct inode *inode; 17762306a36Sopenharmony_ci unsigned int block; 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci if (!ino || ino > sbi->s_ninodes) { 18062306a36Sopenharmony_ci printk("Bad inode number on dev %s: %d is out of range\n", 18162306a36Sopenharmony_ci sb->s_id, ino); 18262306a36Sopenharmony_ci return ERR_PTR(-EIO); 18362306a36Sopenharmony_ci } 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci inode = iget_locked(sb, ino); 18662306a36Sopenharmony_ci if (!inode) 18762306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 18862306a36Sopenharmony_ci if (!(inode->i_state & I_NEW)) 18962306a36Sopenharmony_ci return inode; 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci raw_inode = sysv_raw_inode(sb, ino, &bh); 19262306a36Sopenharmony_ci if (!raw_inode) { 19362306a36Sopenharmony_ci printk("Major problem: unable to read inode from dev %s\n", 19462306a36Sopenharmony_ci inode->i_sb->s_id); 19562306a36Sopenharmony_ci goto bad_inode; 19662306a36Sopenharmony_ci } 19762306a36Sopenharmony_ci /* SystemV FS: kludge permissions if ino==SYSV_ROOT_INO ?? */ 19862306a36Sopenharmony_ci inode->i_mode = fs16_to_cpu(sbi, raw_inode->i_mode); 19962306a36Sopenharmony_ci i_uid_write(inode, (uid_t)fs16_to_cpu(sbi, raw_inode->i_uid)); 20062306a36Sopenharmony_ci i_gid_write(inode, (gid_t)fs16_to_cpu(sbi, raw_inode->i_gid)); 20162306a36Sopenharmony_ci set_nlink(inode, fs16_to_cpu(sbi, raw_inode->i_nlink)); 20262306a36Sopenharmony_ci inode->i_size = fs32_to_cpu(sbi, raw_inode->i_size); 20362306a36Sopenharmony_ci inode->i_atime.tv_sec = fs32_to_cpu(sbi, raw_inode->i_atime); 20462306a36Sopenharmony_ci inode->i_mtime.tv_sec = fs32_to_cpu(sbi, raw_inode->i_mtime); 20562306a36Sopenharmony_ci inode_set_ctime(inode, fs32_to_cpu(sbi, raw_inode->i_ctime), 0); 20662306a36Sopenharmony_ci inode->i_atime.tv_nsec = 0; 20762306a36Sopenharmony_ci inode->i_mtime.tv_nsec = 0; 20862306a36Sopenharmony_ci inode->i_blocks = 0; 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci si = SYSV_I(inode); 21162306a36Sopenharmony_ci for (block = 0; block < 10+1+1+1; block++) 21262306a36Sopenharmony_ci read3byte(sbi, &raw_inode->i_data[3*block], 21362306a36Sopenharmony_ci (u8 *)&si->i_data[block]); 21462306a36Sopenharmony_ci brelse(bh); 21562306a36Sopenharmony_ci si->i_dir_start_lookup = 0; 21662306a36Sopenharmony_ci if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) 21762306a36Sopenharmony_ci sysv_set_inode(inode, 21862306a36Sopenharmony_ci old_decode_dev(fs32_to_cpu(sbi, si->i_data[0]))); 21962306a36Sopenharmony_ci else 22062306a36Sopenharmony_ci sysv_set_inode(inode, 0); 22162306a36Sopenharmony_ci unlock_new_inode(inode); 22262306a36Sopenharmony_ci return inode; 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_cibad_inode: 22562306a36Sopenharmony_ci iget_failed(inode); 22662306a36Sopenharmony_ci return ERR_PTR(-EIO); 22762306a36Sopenharmony_ci} 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_cistatic int __sysv_write_inode(struct inode *inode, int wait) 23062306a36Sopenharmony_ci{ 23162306a36Sopenharmony_ci struct super_block * sb = inode->i_sb; 23262306a36Sopenharmony_ci struct sysv_sb_info * sbi = SYSV_SB(sb); 23362306a36Sopenharmony_ci struct buffer_head * bh; 23462306a36Sopenharmony_ci struct sysv_inode * raw_inode; 23562306a36Sopenharmony_ci struct sysv_inode_info * si; 23662306a36Sopenharmony_ci unsigned int ino, block; 23762306a36Sopenharmony_ci int err = 0; 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ci ino = inode->i_ino; 24062306a36Sopenharmony_ci if (!ino || ino > sbi->s_ninodes) { 24162306a36Sopenharmony_ci printk("Bad inode number on dev %s: %d is out of range\n", 24262306a36Sopenharmony_ci inode->i_sb->s_id, ino); 24362306a36Sopenharmony_ci return -EIO; 24462306a36Sopenharmony_ci } 24562306a36Sopenharmony_ci raw_inode = sysv_raw_inode(sb, ino, &bh); 24662306a36Sopenharmony_ci if (!raw_inode) { 24762306a36Sopenharmony_ci printk("unable to read i-node block\n"); 24862306a36Sopenharmony_ci return -EIO; 24962306a36Sopenharmony_ci } 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci raw_inode->i_mode = cpu_to_fs16(sbi, inode->i_mode); 25262306a36Sopenharmony_ci raw_inode->i_uid = cpu_to_fs16(sbi, fs_high2lowuid(i_uid_read(inode))); 25362306a36Sopenharmony_ci raw_inode->i_gid = cpu_to_fs16(sbi, fs_high2lowgid(i_gid_read(inode))); 25462306a36Sopenharmony_ci raw_inode->i_nlink = cpu_to_fs16(sbi, inode->i_nlink); 25562306a36Sopenharmony_ci raw_inode->i_size = cpu_to_fs32(sbi, inode->i_size); 25662306a36Sopenharmony_ci raw_inode->i_atime = cpu_to_fs32(sbi, inode->i_atime.tv_sec); 25762306a36Sopenharmony_ci raw_inode->i_mtime = cpu_to_fs32(sbi, inode->i_mtime.tv_sec); 25862306a36Sopenharmony_ci raw_inode->i_ctime = cpu_to_fs32(sbi, inode_get_ctime(inode).tv_sec); 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_ci si = SYSV_I(inode); 26162306a36Sopenharmony_ci if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) 26262306a36Sopenharmony_ci si->i_data[0] = cpu_to_fs32(sbi, old_encode_dev(inode->i_rdev)); 26362306a36Sopenharmony_ci for (block = 0; block < 10+1+1+1; block++) 26462306a36Sopenharmony_ci write3byte(sbi, (u8 *)&si->i_data[block], 26562306a36Sopenharmony_ci &raw_inode->i_data[3*block]); 26662306a36Sopenharmony_ci mark_buffer_dirty(bh); 26762306a36Sopenharmony_ci if (wait) { 26862306a36Sopenharmony_ci sync_dirty_buffer(bh); 26962306a36Sopenharmony_ci if (buffer_req(bh) && !buffer_uptodate(bh)) { 27062306a36Sopenharmony_ci printk ("IO error syncing sysv inode [%s:%08x]\n", 27162306a36Sopenharmony_ci sb->s_id, ino); 27262306a36Sopenharmony_ci err = -EIO; 27362306a36Sopenharmony_ci } 27462306a36Sopenharmony_ci } 27562306a36Sopenharmony_ci brelse(bh); 27662306a36Sopenharmony_ci return err; 27762306a36Sopenharmony_ci} 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ciint sysv_write_inode(struct inode *inode, struct writeback_control *wbc) 28062306a36Sopenharmony_ci{ 28162306a36Sopenharmony_ci return __sysv_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL); 28262306a36Sopenharmony_ci} 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_ciint sysv_sync_inode(struct inode *inode) 28562306a36Sopenharmony_ci{ 28662306a36Sopenharmony_ci return __sysv_write_inode(inode, 1); 28762306a36Sopenharmony_ci} 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_cistatic void sysv_evict_inode(struct inode *inode) 29062306a36Sopenharmony_ci{ 29162306a36Sopenharmony_ci truncate_inode_pages_final(&inode->i_data); 29262306a36Sopenharmony_ci if (!inode->i_nlink) { 29362306a36Sopenharmony_ci inode->i_size = 0; 29462306a36Sopenharmony_ci sysv_truncate(inode); 29562306a36Sopenharmony_ci } 29662306a36Sopenharmony_ci invalidate_inode_buffers(inode); 29762306a36Sopenharmony_ci clear_inode(inode); 29862306a36Sopenharmony_ci if (!inode->i_nlink) 29962306a36Sopenharmony_ci sysv_free_inode(inode); 30062306a36Sopenharmony_ci} 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_cistatic struct kmem_cache *sysv_inode_cachep; 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_cistatic struct inode *sysv_alloc_inode(struct super_block *sb) 30562306a36Sopenharmony_ci{ 30662306a36Sopenharmony_ci struct sysv_inode_info *si; 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci si = alloc_inode_sb(sb, sysv_inode_cachep, GFP_KERNEL); 30962306a36Sopenharmony_ci if (!si) 31062306a36Sopenharmony_ci return NULL; 31162306a36Sopenharmony_ci return &si->vfs_inode; 31262306a36Sopenharmony_ci} 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_cistatic void sysv_free_in_core_inode(struct inode *inode) 31562306a36Sopenharmony_ci{ 31662306a36Sopenharmony_ci kmem_cache_free(sysv_inode_cachep, SYSV_I(inode)); 31762306a36Sopenharmony_ci} 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_cistatic void init_once(void *p) 32062306a36Sopenharmony_ci{ 32162306a36Sopenharmony_ci struct sysv_inode_info *si = (struct sysv_inode_info *)p; 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_ci inode_init_once(&si->vfs_inode); 32462306a36Sopenharmony_ci} 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ciconst struct super_operations sysv_sops = { 32762306a36Sopenharmony_ci .alloc_inode = sysv_alloc_inode, 32862306a36Sopenharmony_ci .free_inode = sysv_free_in_core_inode, 32962306a36Sopenharmony_ci .write_inode = sysv_write_inode, 33062306a36Sopenharmony_ci .evict_inode = sysv_evict_inode, 33162306a36Sopenharmony_ci .put_super = sysv_put_super, 33262306a36Sopenharmony_ci .sync_fs = sysv_sync_fs, 33362306a36Sopenharmony_ci .remount_fs = sysv_remount, 33462306a36Sopenharmony_ci .statfs = sysv_statfs, 33562306a36Sopenharmony_ci}; 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_ciint __init sysv_init_icache(void) 33862306a36Sopenharmony_ci{ 33962306a36Sopenharmony_ci sysv_inode_cachep = kmem_cache_create("sysv_inode_cache", 34062306a36Sopenharmony_ci sizeof(struct sysv_inode_info), 0, 34162306a36Sopenharmony_ci SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD|SLAB_ACCOUNT, 34262306a36Sopenharmony_ci init_once); 34362306a36Sopenharmony_ci if (!sysv_inode_cachep) 34462306a36Sopenharmony_ci return -ENOMEM; 34562306a36Sopenharmony_ci return 0; 34662306a36Sopenharmony_ci} 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_civoid sysv_destroy_icache(void) 34962306a36Sopenharmony_ci{ 35062306a36Sopenharmony_ci /* 35162306a36Sopenharmony_ci * Make sure all delayed rcu free inodes are flushed before we 35262306a36Sopenharmony_ci * destroy cache. 35362306a36Sopenharmony_ci */ 35462306a36Sopenharmony_ci rcu_barrier(); 35562306a36Sopenharmony_ci kmem_cache_destroy(sysv_inode_cachep); 35662306a36Sopenharmony_ci} 357