.parameters = shmem_fs_parameters,
#endif
.kill_sb = kill_litter_super,
- .fs_flags = FS_USERNS_MOUNT | FS_ALLOW_IDMAP,
+ .fs_flags = FS_USERNS_MOUNT | FS_ALLOW_IDMAP | FS_MGTIME,
};
+ #if defined(CONFIG_SYSFS) && defined(CONFIG_TMPFS)
+
+ #define __INIT_KOBJ_ATTR(_name, _mode, _show, _store) \
+ { \
+ .attr = { .name = __stringify(_name), .mode = _mode }, \
+ .show = _show, \
+ .store = _store, \
+ }
+
+ #define TMPFS_ATTR_W(_name, _store) \
+ static struct kobj_attribute tmpfs_attr_##_name = \
+ __INIT_KOBJ_ATTR(_name, 0200, NULL, _store)
+
+ #define TMPFS_ATTR_RW(_name, _show, _store) \
+ static struct kobj_attribute tmpfs_attr_##_name = \
+ __INIT_KOBJ_ATTR(_name, 0644, _show, _store)
+
+ #define TMPFS_ATTR_RO(_name, _show) \
+ static struct kobj_attribute tmpfs_attr_##_name = \
+ __INIT_KOBJ_ATTR(_name, 0444, _show, NULL)
+
+ #if IS_ENABLED(CONFIG_UNICODE)
+ static ssize_t casefold_show(struct kobject *kobj, struct kobj_attribute *a,
+ char *buf)
+ {
+ return sysfs_emit(buf, "supported\n");
+ }
+ TMPFS_ATTR_RO(casefold, casefold_show);
+ #endif
+
+ static struct attribute *tmpfs_attributes[] = {
+ #if IS_ENABLED(CONFIG_UNICODE)
+ &tmpfs_attr_casefold.attr,
+ #endif
+ NULL
+ };
+
+ static const struct attribute_group tmpfs_attribute_group = {
+ .attrs = tmpfs_attributes,
+ .name = "features"
+ };
+
+ static struct kobject *tmpfs_kobj;
+
+ static int __init tmpfs_sysfs_init(void)
+ {
+ int ret;
+
+ tmpfs_kobj = kobject_create_and_add("tmpfs", fs_kobj);
+ if (!tmpfs_kobj)
+ return -ENOMEM;
+
+ ret = sysfs_create_group(tmpfs_kobj, &tmpfs_attribute_group);
+ if (ret)
+ kobject_put(tmpfs_kobj);
+
+ return ret;
+ }
+ #endif /* CONFIG_SYSFS && CONFIG_TMPFS */
+
void __init shmem_init(void)
{
int error;