unsigned int ll_xattr_cache_enabled:1,
ll_xattr_cache_set:1, /* already set to 0/1 */
ll_client_common_fill_super_succeeded:1,
- ll_checksum_set:1;
+ ll_checksum_set:1,
+ ll_inode_cache_enabled:1;
struct lustre_client_ocd ll_lco;
sb->s_blocksize_bits = log2(osfs->os_bsize);
sb->s_magic = LL_SUPER_MAGIC;
sb->s_maxbytes = MAX_LFS_FILESIZE;
+ sbi->ll_inode_cache_enabled = 1;
sbi->ll_namelen = osfs->os_namelen;
sbi->ll_mnt.mnt = current->fs->root.mnt;
sbi->ll_mnt_ns = current->nsproxy->mnt_ns;
}
LUSTRE_RW_ATTR(opencache_max_ms);
+static ssize_t inode_cache_show(struct kobject *kobj,
+ struct attribute *attr,
+ char *buf)
+{
+ struct ll_sb_info *sbi = container_of(kobj, struct ll_sb_info,
+ ll_kset.kobj);
+
+ return snprintf(buf, PAGE_SIZE, "%u\n", sbi->ll_inode_cache_enabled);
+}
+
+static ssize_t inode_cache_store(struct kobject *kobj,
+ struct attribute *attr,
+ const char *buffer,
+ size_t count)
+{
+ struct ll_sb_info *sbi = container_of(kobj, struct ll_sb_info,
+ ll_kset.kobj);
+ bool val;
+ int rc;
+
+ rc = kstrtobool(buffer, &val);
+ if (rc)
+ return rc;
+
+ sbi->ll_inode_cache_enabled = val;
+
+ return count;
+}
+LUSTRE_RW_ATTR(inode_cache);
+
static int ll_unstable_stats_seq_show(struct seq_file *m, void *v)
{
struct super_block *sb = m->private;
&lustre_attr_opencache_threshold_count.attr,
&lustre_attr_opencache_threshold_ms.attr,
&lustre_attr_opencache_max_ms.attr,
+ &lustre_attr_inode_cache.attr,
NULL,
};
static int ll_drop_inode(struct inode *inode)
{
- int drop = generic_drop_inode(inode);
+ struct ll_sb_info *sbi = ll_i2sbi(inode);
+ int drop;
+ if (!sbi->ll_inode_cache_enabled)
+ return 1;
+
+ drop = generic_drop_inode(inode);
if (!drop)
drop = llcrypt_drop_inode(inode);
}
run_test 432 "mv dir from outside Lustre"
+test_433() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run"
+
+ [[ -n "$($LCTL list_param llite.*.inode_cache 2>/dev/null)" ]] ||
+ skip "inode cache not supported"
+
+ $LCTL set_param llite.*.inode_cache=0
+ stack_trap "$LCTL set_param llite.*.inode_cache=1"
+
+ local count=256
+ local before
+ local after
+
+ cancel_lru_locks mdc
+ test_mkdir $DIR/$tdir || error "mkdir $tdir"
+ createmany -m $DIR/$tdir/f $count
+ createmany -d $DIR/$tdir/d $count
+ ls -l $DIR/$tdir > /dev/null
+ stack_trap "rm -rf $DIR/$tdir"
+
+ before=$(num_objects)
+ cancel_lru_locks mdc
+ after=$(num_objects)
+
+ # sometimes even @before is less than 2 * count
+ while (( before - after < count )); do
+ sleep 1
+ after=$(num_objects)
+ wait=$((wait + 1))
+ (( wait % 5 == 0 )) && echo "wait $wait seconds objects: $after"
+ if (( wait > 60 )); then
+ error "inode slab grew from $before to $after"
+ fi
+ done
+
+ echo "lustre_inode_cache $before objs before lock cancel, $after after"
+}
+run_test 433 "ldlm lock cancel releases dentries and inodes"
+
prep_801() {
[[ $MDS1_VERSION -lt $(version_code 2.9.55) ]] ||
[[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&