Lines Matching refs:ei

39 	struct eventfs_inode		ei;  member
43 static struct eventfs_root_inode *get_root_inode(struct eventfs_inode *ei) in get_root_inode() argument
45 WARN_ON_ONCE(!ei->is_events); in get_root_inode()
46 return container_of(ei, struct eventfs_root_inode, ei); in get_root_inode()
50 static int eventfs_dir_ino(struct eventfs_inode *ei) in eventfs_dir_ino() argument
52 if (!ei->ino) { in eventfs_dir_ino()
53 ei->ino = get_next_ino(); in eventfs_dir_ino()
55 if (ei->ino == EVENTFS_FILE_INODE_INO) in eventfs_dir_ino()
56 ei->ino = get_next_ino(); in eventfs_dir_ino()
59 return ei->ino; in eventfs_dir_ino()
81 struct eventfs_inode *ei = container_of(rcu, struct eventfs_inode, rcu); in free_ei_rcu() local
84 kfree(ei->entry_attrs); in free_ei_rcu()
85 kfree_const(ei->name); in free_ei_rcu()
86 if (ei->is_events) { in free_ei_rcu()
87 rei = get_root_inode(ei); in free_ei_rcu()
90 kfree(ei); in free_ei_rcu()
104 struct eventfs_inode *ei = container_of(ref, struct eventfs_inode, kref); in release_ei() local
107 WARN_ON_ONCE(!ei->is_freed); in release_ei()
109 for (int i = 0; i < ei->nr_entries; i++) { in release_ei()
110 entry = &ei->entries[i]; in release_ei()
112 entry->release(entry->name, ei->data); in release_ei()
115 call_srcu(&eventfs_srcu, &ei->rcu, free_ei_rcu); in release_ei()
118 static inline void put_ei(struct eventfs_inode *ei) in put_ei() argument
120 if (ei) in put_ei()
121 kref_put(&ei->kref, release_ei); in put_ei()
124 static inline void free_ei(struct eventfs_inode *ei) in free_ei() argument
126 if (ei) { in free_ei()
127 ei->is_freed = 1; in free_ei()
128 put_ei(ei); in free_ei()
135 static inline void cleanup_ei(struct eventfs_inode *ei) in cleanup_ei() argument
137 if (ei) { in cleanup_ei()
139 ei->nr_entries = 0; in cleanup_ei()
140 free_ei(ei); in cleanup_ei()
144 static inline struct eventfs_inode *get_ei(struct eventfs_inode *ei) in get_ei() argument
146 if (ei) in get_ei()
147 kref_get(&ei->kref); in get_ei()
148 return ei; in get_ei()
179 struct eventfs_inode *ei; in eventfs_set_attr() local
184 ei = dentry->d_fsdata; in eventfs_set_attr()
185 if (ei->is_freed) { in eventfs_set_attr()
193 if (!ei->entry_attrs) { in eventfs_set_attr()
194 ei->entry_attrs = kcalloc(ei->nr_entries, sizeof(*ei->entry_attrs), in eventfs_set_attr()
196 if (!ei->entry_attrs) { in eventfs_set_attr()
214 if (!ei->is_events) in eventfs_set_attr()
215 update_attr(&ei->attr, iattr); in eventfs_set_attr()
220 for (int i = 0; i < ei->nr_entries; i++) { in eventfs_set_attr()
221 entry = &ei->entries[i]; in eventfs_set_attr()
223 update_attr(&ei->entry_attrs[i], iattr); in eventfs_set_attr()
248 static void eventfs_set_attrs(struct eventfs_inode *ei, bool update_uid, kuid_t uid, in eventfs_set_attrs() argument
258 ei->attr.mode &= ~EVENTFS_SAVE_UID; in eventfs_set_attrs()
259 ei->attr.uid = uid; in eventfs_set_attrs()
263 ei->attr.mode &= ~EVENTFS_SAVE_GID; in eventfs_set_attrs()
264 ei->attr.gid = gid; in eventfs_set_attrs()
267 list_for_each_entry(ei_child, &ei->children, list) { in eventfs_set_attrs()
271 if (!ei->entry_attrs) in eventfs_set_attrs()
274 for (int i = 0; i < ei->nr_entries; i++) { in eventfs_set_attrs()
276 ei->entry_attrs[i].mode &= ~EVENTFS_SAVE_UID; in eventfs_set_attrs()
277 ei->entry_attrs[i].uid = uid; in eventfs_set_attrs()
280 ei->entry_attrs[i].mode &= ~EVENTFS_SAVE_GID; in eventfs_set_attrs()
281 ei->entry_attrs[i].gid = gid; in eventfs_set_attrs()
294 struct eventfs_inode *ei = ti->private; in eventfs_remount() local
297 if (!ei || !ei->is_events || ei->is_freed) in eventfs_remount()
300 eventfs_set_attrs(ei, update_uid, ti->vfs_inode.i_uid, in eventfs_remount()
315 inode->i_uid = rei->ei.attr.uid; in update_inode_attr()
320 inode->i_gid = rei->ei.attr.gid; in update_inode_attr()
324 umode_t mode, struct eventfs_inode *ei) in eventfs_get_inode() argument
336 ti->private = ei; in eventfs_get_inode()
410 struct eventfs_inode *pei, struct eventfs_inode *ei) in lookup_dir_entry() argument
415 inode = eventfs_get_inode(dentry, &ei->attr, mode, ei); in lookup_dir_entry()
423 inode->i_ino = eventfs_dir_ino(ei); in lookup_dir_entry()
425 dentry->d_fsdata = get_ei(ei); in lookup_dir_entry()
431 static inline struct eventfs_inode *init_ei(struct eventfs_inode *ei, const char *name) in init_ei() argument
433 ei->name = kstrdup_const(name, GFP_KERNEL); in init_ei()
434 if (!ei->name) in init_ei()
436 kref_init(&ei->kref); in init_ei()
437 return ei; in init_ei()
442 struct eventfs_inode *ei = kzalloc(sizeof(*ei), GFP_KERNEL); in alloc_ei() local
445 if (!ei) in alloc_ei()
448 result = init_ei(ei, name); in alloc_ei()
450 kfree(ei); in alloc_ei()
458 struct eventfs_inode *ei; in alloc_root_ei() local
463 rei->ei.is_events = 1; in alloc_root_ei()
464 ei = init_ei(&rei->ei, name); in alloc_root_ei()
465 if (!ei) in alloc_root_ei()
468 return ei; in alloc_root_ei()
501 struct eventfs_inode *ei, int idx, in lookup_file_dentry() argument
507 if (ei->entry_attrs) in lookup_file_dentry()
508 attr = &ei->entry_attrs[idx]; in lookup_file_dentry()
510 return lookup_file(ei, dentry, mode, attr, data, fops); in lookup_file_dentry()
529 struct eventfs_inode *ei; in eventfs_root_lookup() local
539 ei = ti->private; in eventfs_root_lookup()
540 if (!ei || ei->is_freed) in eventfs_root_lookup()
543 list_for_each_entry(ei_child, &ei->children, list) { in eventfs_root_lookup()
549 result = lookup_dir_entry(dentry, ei, ei_child); in eventfs_root_lookup()
553 for (int i = 0; i < ei->nr_entries; i++) { in eventfs_root_lookup()
557 const struct eventfs_entry *entry = &ei->entries[i]; in eventfs_root_lookup()
562 data = ei->data; in eventfs_root_lookup()
566 result = lookup_file_dentry(dentry, ei, i, mode, data, fops); in eventfs_root_lookup()
584 struct eventfs_inode *ei; in eventfs_iterate() local
604 ei = READ_ONCE(ti->private); in eventfs_iterate()
605 if (ei && ei->is_freed) in eventfs_iterate()
606 ei = NULL; in eventfs_iterate()
609 if (!ei) in eventfs_iterate()
619 for (i = c; i < ei->nr_entries; i++, ctx->pos++) { in eventfs_iterate()
620 void *cdata = ei->data; in eventfs_iterate()
622 entry = &ei->entries[i]; in eventfs_iterate()
627 if (ei->is_freed) { in eventfs_iterate()
643 c -= min((unsigned int)c, (unsigned int)ei->nr_entries); in eventfs_iterate()
645 list_for_each_entry_srcu(ei_child, &ei->children, list, in eventfs_iterate()
716 struct eventfs_inode *ei; in eventfs_create_dir() local
721 ei = alloc_ei(name); in eventfs_create_dir()
722 if (!ei) in eventfs_create_dir()
725 ei->entries = entries; in eventfs_create_dir()
726 ei->nr_entries = size; in eventfs_create_dir()
727 ei->data = data; in eventfs_create_dir()
728 INIT_LIST_HEAD(&ei->children); in eventfs_create_dir()
729 INIT_LIST_HEAD(&ei->list); in eventfs_create_dir()
733 list_add_tail(&ei->list, &parent->children); in eventfs_create_dir()
737 if (list_empty(&ei->list)) { in eventfs_create_dir()
738 cleanup_ei(ei); in eventfs_create_dir()
739 ei = ERR_PTR(-EBUSY); in eventfs_create_dir()
741 return ei; in eventfs_create_dir()
762 struct eventfs_inode *ei; in eventfs_create_events_dir() local
774 ei = alloc_root_ei(name); in eventfs_create_events_dir()
775 if (!ei) in eventfs_create_events_dir()
783 rei = get_root_inode(ei); in eventfs_create_events_dir()
786 ei->entries = entries; in eventfs_create_events_dir()
787 ei->nr_entries = size; in eventfs_create_events_dir()
788 ei->data = data; in eventfs_create_events_dir()
798 ei->attr.uid = uid; in eventfs_create_events_dir()
799 ei->attr.gid = gid; in eventfs_create_events_dir()
801 INIT_LIST_HEAD(&ei->children); in eventfs_create_events_dir()
802 INIT_LIST_HEAD(&ei->list); in eventfs_create_events_dir()
806 ti->private = ei; in eventfs_create_events_dir()
814 dentry->d_fsdata = get_ei(ei); in eventfs_create_events_dir()
831 return ei; in eventfs_create_events_dir()
834 cleanup_ei(ei); in eventfs_create_events_dir()
847 static void eventfs_remove_rec(struct eventfs_inode *ei, int level) in eventfs_remove_rec() argument
862 list_for_each_entry(ei_child, &ei->children, list) in eventfs_remove_rec()
865 list_del_rcu(&ei->list); in eventfs_remove_rec()
866 free_ei(ei); in eventfs_remove_rec()
875 void eventfs_remove_dir(struct eventfs_inode *ei) in eventfs_remove_dir() argument
877 if (!ei) in eventfs_remove_dir()
881 eventfs_remove_rec(ei, 0); in eventfs_remove_dir()
891 void eventfs_remove_events_dir(struct eventfs_inode *ei) in eventfs_remove_events_dir() argument
896 rei = get_root_inode(ei); in eventfs_remove_events_dir()
902 eventfs_remove_dir(ei); in eventfs_remove_events_dir()