From: kernel test robot <lkp@intel.com>
To: Ajay Kaher <akaher@vmware.com>, rostedt@goodmis.org, mhiramat@kernel.org
Cc: oe-kbuild-all@lists.linux.dev, linux-kernel@vger.kernel.org,
linux-trace-kernel@vger.kernel.org, chinglinyu@google.com,
namit@vmware.com, srivatsab@vmware.com, srivatsa@csail.mit.edu,
amakhalov@vmware.com, vsirnapalli@vmware.com, tkundu@vmware.com,
er.ajay.kaher@gmail.com, Ajay Kaher <akaher@vmware.com>
Subject: Re: [PATCH 6/8] eventfs: adding eventfs lookup, read, open functions
Date: Mon, 23 Jan 2023 03:38:07 +0800 [thread overview]
Message-ID: <202301230340.oZWnhDJu-lkp@intel.com> (raw)
In-Reply-To: <1674407228-49109-6-git-send-email-akaher@vmware.com>
Hi Ajay,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on linus/master]
[also build test WARNING on v6.2-rc5 next-20230120]
[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/Ajay-Kaher/eventfs-adding-eventfs-dir-add-functions/20230123-010956
patch link: https://lore.kernel.org/r/1674407228-49109-6-git-send-email-akaher%40vmware.com
patch subject: [PATCH 6/8] eventfs: adding eventfs lookup, read, open functions
config: arc-defconfig (https://download.01.org/0day-ci/archive/20230123/202301230340.oZWnhDJu-lkp@intel.com/config)
compiler: arc-elf-gcc (GCC) 12.1.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/bdfb24dc39f183eda75dc7c6ad54798181ad4a94
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Ajay-Kaher/eventfs-adding-eventfs-dir-add-functions/20230123-010956
git checkout bdfb24dc39f183eda75dc7c6ad54798181ad4a94
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=arc olddefconfig
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=arc SHELL=/bin/bash fs/tracefs/ kernel/trace/
If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
fs/tracefs/event_inode.c:48:16: warning: no previous prototype for 'eventfs_create_file' [-Wmissing-prototypes]
48 | struct dentry *eventfs_create_file(const char *name, umode_t mode,
| ^~~~~~~~~~~~~~~~~~~
fs/tracefs/event_inode.c:117:16: warning: no previous prototype for 'eventfs_create_dir' [-Wmissing-prototypes]
117 | struct dentry *eventfs_create_dir(const char *name, umode_t mode,
| ^~~~~~~~~~~~~~~~~~
>> fs/tracefs/event_inode.c:192:6: warning: no previous prototype for 'eventfs_post_create_dir' [-Wmissing-prototypes]
192 | void eventfs_post_create_dir(struct eventfs_file *ef)
| ^~~~~~~~~~~~~~~~~~~~~~~
>> fs/tracefs/event_inode.c:291:5: warning: no previous prototype for 'dcache_dir_open_wrapper' [-Wmissing-prototypes]
291 | int dcache_dir_open_wrapper(struct inode *inode, struct file *file)
| ^~~~~~~~~~~~~~~~~~~~~~~
vim +/eventfs_post_create_dir +192 fs/tracefs/event_inode.c
23
24 /**
25 * eventfs_create_file - create a file in the tracefs filesystem
26 * @name: a pointer to a string containing the name of the file to create.
27 * @mode: the permission that the file should have.
28 * @parent: a pointer to the parent dentry for this file. This should be a
29 * directory dentry if set. If this parameter is NULL, then the
30 * file will be created in the root of the tracefs filesystem.
31 * @data: a pointer to something that the caller will want to get to later
32 * on. The inode.i_private pointer will point to this value on
33 * the open() call.
34 * @fops: a pointer to a struct file_operations that should be used for
35 * this file.
36 *
37 * This is the basic "create a file" function for tracefs. It allows for a
38 * wide range of flexibility in creating a file.
39 *
40 * This function will return a pointer to a dentry if it succeeds. This
41 * pointer must be passed to the tracefs_remove() function when the file is
42 * to be removed (no automatic cleanup happens if your module is unloaded,
43 * you are responsible here.) If an error occurs, %NULL will be returned.
44 *
45 * If tracefs is not enabled in the kernel, the value -%ENODEV will be
46 * returned.
47 */
> 48 struct dentry *eventfs_create_file(const char *name, umode_t mode,
49 struct dentry *parent, void *data,
50 const struct file_operations *fop,
51 bool anon)
52 {
53 struct tracefs_inode *ti;
54 struct dentry *dentry;
55 struct inode *inode;
56
57 if (security_locked_down(LOCKDOWN_TRACEFS))
58 return NULL;
59
60 if (!(mode & S_IFMT))
61 mode |= S_IFREG;
62
63 if (WARN_ON_ONCE(!S_ISREG(mode)))
64 return NULL;
65
66 dentry = eventfs_start_creating(name, parent);
67
68 if (IS_ERR(dentry))
69 return dentry;
70
71 inode = tracefs_get_inode(dentry->d_sb);
72 if (unlikely(!inode))
73 return eventfs_failed_creating(dentry);
74
75 inode->i_mode = mode;
76 inode->i_fop = fop;
77 inode->i_private = data;
78
79 ti = get_tracefs(inode);
80 ti->flags |= TRACEFS_EVENT_INODE;
81
82 if (anon)
83 d_instantiate_anon(dentry, inode);
84 else
85 d_instantiate(dentry, inode);
86
87 fsnotify_create(dentry->d_parent->d_inode, dentry);
88 return eventfs_end_creating(dentry);
89 }
90
91 /**
92 * eventfs_create_dir - create a dir in the tracefs filesystem
93 * @name: a pointer to a string containing the name of the file to create.
94 * @mode: the permission that the file should have.
95 * @parent: a pointer to the parent dentry for this file. This should be a
96 * directory dentry if set. If this parameter is NULL, then the
97 * file will be created in the root of the tracefs filesystem.
98 * @data: a pointer to something that the caller will want to get to later
99 * on. The inode.i_private pointer will point to this value on
100 * the open() call.
101 * @fop: a pointer to a struct file_operations that should be used for
102 * this dir.
103 * @iop: a pointer to a struct inode_operations that should be used for
104 * this dir.
105 *
106 * This is the basic "create a dir" function for eventfs. It allows for a
107 * wide range of flexibility in creating a dir.
108 *
109 * This function will return a pointer to a dentry if it succeeds. This
110 * pointer must be passed to the tracefs_remove() function when the file is
111 * to be removed (no automatic cleanup happens if your module is unloaded,
112 * you are responsible here.) If an error occurs, %NULL will be returned.
113 *
114 * If tracefs is not enabled in the kernel, the value -%ENODEV will be
115 * returned.
116 */
117 struct dentry *eventfs_create_dir(const char *name, umode_t mode,
118 struct dentry *parent, void *data,
119 const struct file_operations *fop,
120 const struct inode_operations *iop,
121 bool anon)
122 {
123 struct tracefs_inode *ti;
124 struct dentry *dentry;
125 struct inode *inode;
126
127 if (security_locked_down(LOCKDOWN_TRACEFS))
128 return NULL;
129
130 WARN_ON(!S_ISDIR(mode));
131
132 dentry = eventfs_start_creating(name, parent);
133
134 if (IS_ERR(dentry))
135 return dentry;
136
137 inode = tracefs_get_inode(dentry->d_sb);
138 if (unlikely(!inode))
139 return eventfs_failed_creating(dentry);
140
141 inode->i_mode = mode;
142 inode->i_op = iop;
143 inode->i_fop = fop;
144 inode->i_private = data;
145
146 ti = get_tracefs(inode);
147 ti->flags |= TRACEFS_EVENT_INODE;
148
149 inc_nlink(inode);
150 if (anon)
151 d_instantiate_anon(dentry, inode);
152 else
153 d_instantiate(dentry, inode);
154 inc_nlink(dentry->d_parent->d_inode);
155 fsnotify_mkdir(dentry->d_parent->d_inode, dentry);
156 return eventfs_end_creating(dentry);
157 }
158
159 /**
160 * eventfs_set_ef_status_free - set the ef->status to free
161 * @dentry: dentry who's status to be freed
162 *
163 * eventfs_set_ef_status_free will be called if no more
164 * reference remains
165 */
166 void eventfs_set_ef_status_free(struct dentry *dentry)
167 {
168 struct tracefs_inode *ti_parent;
169 struct eventfs_inode *ei_parent;
170 struct eventfs_file *ef;
171
172 ti_parent = get_tracefs(dentry->d_parent->d_inode);
173 if (!ti_parent || !(ti_parent->flags & TRACEFS_EVENT_INODE))
174 return;
175 ei_parent = ti_parent->private;
176
177 list_for_each_entry(ef, &ei_parent->e_top_files, list) {
178 if (!strcmp(ef->name, dentry->d_name.name)) {
179 ef->created = false;
180 ef->dentry = NULL;
181 break;
182 }
183 }
184 }
185
186 /**
187 * eventfs_post_create_dir - post create dir routine
188 * @eventfs_file: eventfs_file of recently created dir
189 *
190 * Files with-in eventfs dir should know dentry of parent dir
191 */
> 192 void eventfs_post_create_dir(struct eventfs_file *ef)
193 {
194 struct eventfs_file *ef_child;
195 struct tracefs_inode *ti;
196
197 /* fill parent-child relation */
198 list_for_each_entry(ef_child, &ef->ei->e_top_files, list) {
199 ef_child->d_parent = ef->dentry;
200 }
201
202 ti = get_tracefs(ef->dentry->d_inode);
203 ti->private = ef->ei;
204 }
205
206 /**
207 * eventfs_root_lookup - lookup routine to create file/dir
208 * @dir: directory in which lookup to be done
209 * @dentry: file/dir dentry
210 * @flags:
211 *
212 * Used to create dynamic file/dir with-in @dir, search with-in ei
213 * list, if @dentry found go ahead and create the file/dir
214 */
215
216 static struct dentry *eventfs_root_lookup(struct inode *dir,
217 struct dentry *dentry,
218 unsigned int flags)
219 {
220 struct tracefs_inode *ti;
221 struct eventfs_inode *ei;
222 struct eventfs_file *ef;
223 struct dentry *ret = simple_lookup(dir, dentry, flags);
224
225 ti = get_tracefs(dir);
226 if (!(ti->flags & TRACEFS_EVENT_INODE))
227 return NULL;
228
229 ei = ti->private;
230 list_for_each_entry(ef, &ei->e_top_files, list) {
231 if (strcmp(ef->name, dentry->d_name.name))
232 continue;
233
234 if(ef->created)
235 continue;
236
237 ef->created = true;
238
239 if (ef->ei)
240 ef->dentry = eventfs_create_dir(ef->name, ef->mode, ef->d_parent,
241 ef->data, ef->fop, ef->iop, 0);
242 else
243 ef->dentry = eventfs_create_file(ef->name, ef->mode, ef->d_parent,
244 ef->data, ef->fop, 0);
245
246 if (IS_ERR_OR_NULL(ef->dentry)) {
247 ef->created = false;
248 } else {
249 if (ef->ei)
250 eventfs_post_create_dir(ef);
251 ef->dentry->d_fsdata = ef;
252 dput(ef->dentry);
253 }
254 break;
255 }
256 return ret;
257 }
258
259 /**
260 * eventfs_release - called to release eventfs file/dir
261 * @inode: inode to be released
262 * @file: file to be released (not used)
263 */
264 static int eventfs_release(struct inode *inode, struct file *file)
265 {
266 struct tracefs_inode *ti;
267 struct eventfs_inode *ei;
268 struct eventfs_file *ef;
269
270 ti = get_tracefs(inode);
271 if (!(ti->flags & TRACEFS_EVENT_INODE))
272 return -EINVAL;
273
274 ei = ti->private;
275 list_for_each_entry(ef, &ei->e_top_files, list) {
276 if (ef->created)
277 dput(ef->dentry);
278 }
279 return dcache_dir_close(inode, file);
280 }
281
282 /**
283 * dcache_dir_open_wrapper - eventfs open wrapper
284 * @inode: not used
285 * @file: dir to be opened (to create it's child)
286 *
287 * Used to dynamic create file/dir with-in @file, all the
288 * file/dir will be created. If already created then reference
289 * will be increased
290 */
> 291 int dcache_dir_open_wrapper(struct inode *inode, struct file *file)
292 {
293 struct tracefs_inode *ti;
294 struct eventfs_inode *ei;
295 struct eventfs_file *ef;
296 struct inode *f_inode = file_inode(file);
297 struct dentry *dentry = file_dentry(file);
298
299 ti = get_tracefs(f_inode);
300 if (!(ti->flags & TRACEFS_EVENT_INODE))
301 return -EINVAL;
302
303 ei = ti->private;
304 list_for_each_entry(ef, &ei->e_top_files, list) {
305 if (ef->created) {
306 dget(ef->dentry);
307 continue;
308 }
309
310 ef->created = true;
311
312 inode_lock(dentry->d_inode);
313 if (ef->ei)
314 ef->dentry = eventfs_create_dir(ef->name, ef->mode, dentry,
315 ef->data, ef->fop, ef->iop, 1);
316 else
317 ef->dentry = eventfs_create_file(ef->name, ef->mode, dentry,
318 ef->data, ef->fop, 1);
319 inode_unlock(dentry->d_inode);
320
321 if (IS_ERR_OR_NULL(ef->dentry)) {
322 ef->created = false;
323 } else {
324 if (ef->ei)
325 eventfs_post_create_dir(ef);
326 ef->dentry->d_fsdata = ef;
327 }
328 }
329 return dcache_dir_open(inode, file);
330 }
331
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests
next prev parent reply other threads:[~2023-01-22 19:38 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-22 17:07 [PATCH 1/8] eventfs: introducing struct tracefs_inode Ajay Kaher
2023-01-22 17:07 ` [PATCH 2/8] eventfs: adding eventfs dir add functions Ajay Kaher
2023-01-23 2:06 ` kernel test robot
2023-01-23 7:44 ` kernel test robot
2023-01-23 12:04 ` Dan Carpenter
2023-01-22 17:07 ` [PATCH 3/8] eventfs: adding eventfs file " Ajay Kaher
2023-01-22 17:07 ` [PATCH 4/8] eventfs: adding eventfs file, directory remove function Ajay Kaher
2023-01-22 17:07 ` [PATCH 5/8] eventfs: adding functions to create eventfs files and directories Ajay Kaher
2023-01-22 18:45 ` kernel test robot
2023-01-22 20:09 ` kernel test robot
2023-01-23 9:26 ` kernel test robot
2023-01-22 17:07 ` [PATCH 6/8] eventfs: adding eventfs lookup, read, open functions Ajay Kaher
2023-01-22 19:38 ` kernel test robot [this message]
2023-01-23 11:49 ` kernel test robot
2023-01-23 16:54 ` Steven Rostedt
2023-01-22 17:07 ` [PATCH 7/8] eventfs: creating tracefs_inode_cache Ajay Kaher
2023-01-22 17:07 ` [PATCH 8/8] eventfs: moving tracing/events to eventfs Ajay Kaher
2023-01-22 21:00 ` kernel test robot
2023-01-23 14:14 ` kernel test robot
2023-01-31 8:08 ` kernel test robot
2023-01-22 17:07 ` [PATCH 0/8] tracing: introducing eventfs Ajay Kaher
2023-01-23 16:51 ` Steven Rostedt
2023-01-29 18:07 ` Ajay Kaher
2023-01-30 6:43 ` Nadav Amit
2023-03-28 22:47 ` Steven Rostedt
2023-03-29 18:00 ` Ajay Kaher
2023-01-23 5:41 ` [PATCH 1/8] eventfs: introducing struct tracefs_inode kernel test robot
2023-01-23 6:01 ` kernel test robot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202301230340.oZWnhDJu-lkp@intel.com \
--to=lkp@intel.com \
--cc=akaher@vmware.com \
--cc=amakhalov@vmware.com \
--cc=chinglinyu@google.com \
--cc=er.ajay.kaher@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mhiramat@kernel.org \
--cc=namit@vmware.com \
--cc=oe-kbuild-all@lists.linux.dev \
--cc=rostedt@goodmis.org \
--cc=srivatsa@csail.mit.edu \
--cc=srivatsab@vmware.com \
--cc=tkundu@vmware.com \
--cc=vsirnapalli@vmware.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.