Merge tag 'auxdisplay-for-linus-v5.15-rc1' of git://github.com/ojeda/linux
[linux-2.6-microblaze.git] / fs / fuse / readdir.c
1 /*
2   FUSE: Filesystem in Userspace
3   Copyright (C) 2001-2018  Miklos Szeredi <miklos@szeredi.hu>
4
5   This program can be distributed under the terms of the GNU GPL.
6   See the file COPYING.
7 */
8
9
10 #include "fuse_i.h"
11 #include <linux/iversion.h>
12 #include <linux/posix_acl.h>
13 #include <linux/pagemap.h>
14 #include <linux/highmem.h>
15
16 static bool fuse_use_readdirplus(struct inode *dir, struct dir_context *ctx)
17 {
18         struct fuse_conn *fc = get_fuse_conn(dir);
19         struct fuse_inode *fi = get_fuse_inode(dir);
20
21         if (!fc->do_readdirplus)
22                 return false;
23         if (!fc->readdirplus_auto)
24                 return true;
25         if (test_and_clear_bit(FUSE_I_ADVISE_RDPLUS, &fi->state))
26                 return true;
27         if (ctx->pos == 0)
28                 return true;
29         return false;
30 }
31
32 static void fuse_add_dirent_to_cache(struct file *file,
33                                      struct fuse_dirent *dirent, loff_t pos)
34 {
35         struct fuse_inode *fi = get_fuse_inode(file_inode(file));
36         size_t reclen = FUSE_DIRENT_SIZE(dirent);
37         pgoff_t index;
38         struct page *page;
39         loff_t size;
40         u64 version;
41         unsigned int offset;
42         void *addr;
43
44         spin_lock(&fi->rdc.lock);
45         /*
46          * Is cache already completed?  Or this entry does not go at the end of
47          * cache?
48          */
49         if (fi->rdc.cached || pos != fi->rdc.pos) {
50                 spin_unlock(&fi->rdc.lock);
51                 return;
52         }
53         version = fi->rdc.version;
54         size = fi->rdc.size;
55         offset = size & ~PAGE_MASK;
56         index = size >> PAGE_SHIFT;
57         /* Dirent doesn't fit in current page?  Jump to next page. */
58         if (offset + reclen > PAGE_SIZE) {
59                 index++;
60                 offset = 0;
61         }
62         spin_unlock(&fi->rdc.lock);
63
64         if (offset) {
65                 page = find_lock_page(file->f_mapping, index);
66         } else {
67                 page = find_or_create_page(file->f_mapping, index,
68                                            mapping_gfp_mask(file->f_mapping));
69         }
70         if (!page)
71                 return;
72
73         spin_lock(&fi->rdc.lock);
74         /* Raced with another readdir */
75         if (fi->rdc.version != version || fi->rdc.size != size ||
76             WARN_ON(fi->rdc.pos != pos))
77                 goto unlock;
78
79         addr = kmap_atomic(page);
80         if (!offset)
81                 clear_page(addr);
82         memcpy(addr + offset, dirent, reclen);
83         kunmap_atomic(addr);
84         fi->rdc.size = (index << PAGE_SHIFT) + offset + reclen;
85         fi->rdc.pos = dirent->off;
86 unlock:
87         spin_unlock(&fi->rdc.lock);
88         unlock_page(page);
89         put_page(page);
90 }
91
92 static void fuse_readdir_cache_end(struct file *file, loff_t pos)
93 {
94         struct fuse_inode *fi = get_fuse_inode(file_inode(file));
95         loff_t end;
96
97         spin_lock(&fi->rdc.lock);
98         /* does cache end position match current position? */
99         if (fi->rdc.pos != pos) {
100                 spin_unlock(&fi->rdc.lock);
101                 return;
102         }
103
104         fi->rdc.cached = true;
105         end = ALIGN(fi->rdc.size, PAGE_SIZE);
106         spin_unlock(&fi->rdc.lock);
107
108         /* truncate unused tail of cache */
109         truncate_inode_pages(file->f_mapping, end);
110 }
111
112 static bool fuse_emit(struct file *file, struct dir_context *ctx,
113                       struct fuse_dirent *dirent)
114 {
115         struct fuse_file *ff = file->private_data;
116
117         if (ff->open_flags & FOPEN_CACHE_DIR)
118                 fuse_add_dirent_to_cache(file, dirent, ctx->pos);
119
120         return dir_emit(ctx, dirent->name, dirent->namelen, dirent->ino,
121                         dirent->type);
122 }
123
124 static int parse_dirfile(char *buf, size_t nbytes, struct file *file,
125                          struct dir_context *ctx)
126 {
127         while (nbytes >= FUSE_NAME_OFFSET) {
128                 struct fuse_dirent *dirent = (struct fuse_dirent *) buf;
129                 size_t reclen = FUSE_DIRENT_SIZE(dirent);
130                 if (!dirent->namelen || dirent->namelen > FUSE_NAME_MAX)
131                         return -EIO;
132                 if (reclen > nbytes)
133                         break;
134                 if (memchr(dirent->name, '/', dirent->namelen) != NULL)
135                         return -EIO;
136
137                 if (!fuse_emit(file, ctx, dirent))
138                         break;
139
140                 buf += reclen;
141                 nbytes -= reclen;
142                 ctx->pos = dirent->off;
143         }
144
145         return 0;
146 }
147
148 static int fuse_direntplus_link(struct file *file,
149                                 struct fuse_direntplus *direntplus,
150                                 u64 attr_version)
151 {
152         struct fuse_entry_out *o = &direntplus->entry_out;
153         struct fuse_dirent *dirent = &direntplus->dirent;
154         struct dentry *parent = file->f_path.dentry;
155         struct qstr name = QSTR_INIT(dirent->name, dirent->namelen);
156         struct dentry *dentry;
157         struct dentry *alias;
158         struct inode *dir = d_inode(parent);
159         struct fuse_conn *fc;
160         struct inode *inode;
161         DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq);
162
163         if (!o->nodeid) {
164                 /*
165                  * Unlike in the case of fuse_lookup, zero nodeid does not mean
166                  * ENOENT. Instead, it only means the userspace filesystem did
167                  * not want to return attributes/handle for this entry.
168                  *
169                  * So do nothing.
170                  */
171                 return 0;
172         }
173
174         if (name.name[0] == '.') {
175                 /*
176                  * We could potentially refresh the attributes of the directory
177                  * and its parent?
178                  */
179                 if (name.len == 1)
180                         return 0;
181                 if (name.name[1] == '.' && name.len == 2)
182                         return 0;
183         }
184
185         if (invalid_nodeid(o->nodeid))
186                 return -EIO;
187         if (fuse_invalid_attr(&o->attr))
188                 return -EIO;
189
190         fc = get_fuse_conn(dir);
191
192         name.hash = full_name_hash(parent, name.name, name.len);
193         dentry = d_lookup(parent, &name);
194         if (!dentry) {
195 retry:
196                 dentry = d_alloc_parallel(parent, &name, &wq);
197                 if (IS_ERR(dentry))
198                         return PTR_ERR(dentry);
199         }
200         if (!d_in_lookup(dentry)) {
201                 struct fuse_inode *fi;
202                 inode = d_inode(dentry);
203                 if (inode && get_node_id(inode) != o->nodeid)
204                         inode = NULL;
205                 if (!inode ||
206                     fuse_stale_inode(inode, o->generation, &o->attr)) {
207                         if (inode)
208                                 fuse_make_bad(inode);
209                         d_invalidate(dentry);
210                         dput(dentry);
211                         goto retry;
212                 }
213                 if (fuse_is_bad(inode)) {
214                         dput(dentry);
215                         return -EIO;
216                 }
217
218                 fi = get_fuse_inode(inode);
219                 spin_lock(&fi->lock);
220                 fi->nlookup++;
221                 spin_unlock(&fi->lock);
222
223                 forget_all_cached_acls(inode);
224                 fuse_change_attributes(inode, &o->attr,
225                                        entry_attr_timeout(o),
226                                        attr_version);
227                 /*
228                  * The other branch comes via fuse_iget()
229                  * which bumps nlookup inside
230                  */
231         } else {
232                 inode = fuse_iget(dir->i_sb, o->nodeid, o->generation,
233                                   &o->attr, entry_attr_timeout(o),
234                                   attr_version);
235                 if (!inode)
236                         inode = ERR_PTR(-ENOMEM);
237
238                 alias = d_splice_alias(inode, dentry);
239                 d_lookup_done(dentry);
240                 if (alias) {
241                         dput(dentry);
242                         dentry = alias;
243                 }
244                 if (IS_ERR(dentry))
245                         return PTR_ERR(dentry);
246         }
247         if (fc->readdirplus_auto)
248                 set_bit(FUSE_I_INIT_RDPLUS, &get_fuse_inode(inode)->state);
249         fuse_change_entry_timeout(dentry, o);
250
251         dput(dentry);
252         return 0;
253 }
254
255 static void fuse_force_forget(struct file *file, u64 nodeid)
256 {
257         struct inode *inode = file_inode(file);
258         struct fuse_mount *fm = get_fuse_mount(inode);
259         struct fuse_forget_in inarg;
260         FUSE_ARGS(args);
261
262         memset(&inarg, 0, sizeof(inarg));
263         inarg.nlookup = 1;
264         args.opcode = FUSE_FORGET;
265         args.nodeid = nodeid;
266         args.in_numargs = 1;
267         args.in_args[0].size = sizeof(inarg);
268         args.in_args[0].value = &inarg;
269         args.force = true;
270         args.noreply = true;
271
272         fuse_simple_request(fm, &args);
273         /* ignore errors */
274 }
275
276 static int parse_dirplusfile(char *buf, size_t nbytes, struct file *file,
277                              struct dir_context *ctx, u64 attr_version)
278 {
279         struct fuse_direntplus *direntplus;
280         struct fuse_dirent *dirent;
281         size_t reclen;
282         int over = 0;
283         int ret;
284
285         while (nbytes >= FUSE_NAME_OFFSET_DIRENTPLUS) {
286                 direntplus = (struct fuse_direntplus *) buf;
287                 dirent = &direntplus->dirent;
288                 reclen = FUSE_DIRENTPLUS_SIZE(direntplus);
289
290                 if (!dirent->namelen || dirent->namelen > FUSE_NAME_MAX)
291                         return -EIO;
292                 if (reclen > nbytes)
293                         break;
294                 if (memchr(dirent->name, '/', dirent->namelen) != NULL)
295                         return -EIO;
296
297                 if (!over) {
298                         /* We fill entries into dstbuf only as much as
299                            it can hold. But we still continue iterating
300                            over remaining entries to link them. If not,
301                            we need to send a FORGET for each of those
302                            which we did not link.
303                         */
304                         over = !fuse_emit(file, ctx, dirent);
305                         if (!over)
306                                 ctx->pos = dirent->off;
307                 }
308
309                 buf += reclen;
310                 nbytes -= reclen;
311
312                 ret = fuse_direntplus_link(file, direntplus, attr_version);
313                 if (ret)
314                         fuse_force_forget(file, direntplus->entry_out.nodeid);
315         }
316
317         return 0;
318 }
319
320 static int fuse_readdir_uncached(struct file *file, struct dir_context *ctx)
321 {
322         int plus;
323         ssize_t res;
324         struct page *page;
325         struct inode *inode = file_inode(file);
326         struct fuse_mount *fm = get_fuse_mount(inode);
327         struct fuse_io_args ia = {};
328         struct fuse_args_pages *ap = &ia.ap;
329         struct fuse_page_desc desc = { .length = PAGE_SIZE };
330         u64 attr_version = 0;
331         bool locked;
332
333         page = alloc_page(GFP_KERNEL);
334         if (!page)
335                 return -ENOMEM;
336
337         plus = fuse_use_readdirplus(inode, ctx);
338         ap->args.out_pages = true;
339         ap->num_pages = 1;
340         ap->pages = &page;
341         ap->descs = &desc;
342         if (plus) {
343                 attr_version = fuse_get_attr_version(fm->fc);
344                 fuse_read_args_fill(&ia, file, ctx->pos, PAGE_SIZE,
345                                     FUSE_READDIRPLUS);
346         } else {
347                 fuse_read_args_fill(&ia, file, ctx->pos, PAGE_SIZE,
348                                     FUSE_READDIR);
349         }
350         locked = fuse_lock_inode(inode);
351         res = fuse_simple_request(fm, &ap->args);
352         fuse_unlock_inode(inode, locked);
353         if (res >= 0) {
354                 if (!res) {
355                         struct fuse_file *ff = file->private_data;
356
357                         if (ff->open_flags & FOPEN_CACHE_DIR)
358                                 fuse_readdir_cache_end(file, ctx->pos);
359                 } else if (plus) {
360                         res = parse_dirplusfile(page_address(page), res,
361                                                 file, ctx, attr_version);
362                 } else {
363                         res = parse_dirfile(page_address(page), res, file,
364                                             ctx);
365                 }
366         }
367
368         __free_page(page);
369         fuse_invalidate_atime(inode);
370         return res;
371 }
372
373 enum fuse_parse_result {
374         FOUND_ERR = -1,
375         FOUND_NONE = 0,
376         FOUND_SOME,
377         FOUND_ALL,
378 };
379
380 static enum fuse_parse_result fuse_parse_cache(struct fuse_file *ff,
381                                                void *addr, unsigned int size,
382                                                struct dir_context *ctx)
383 {
384         unsigned int offset = ff->readdir.cache_off & ~PAGE_MASK;
385         enum fuse_parse_result res = FOUND_NONE;
386
387         WARN_ON(offset >= size);
388
389         for (;;) {
390                 struct fuse_dirent *dirent = addr + offset;
391                 unsigned int nbytes = size - offset;
392                 size_t reclen;
393
394                 if (nbytes < FUSE_NAME_OFFSET || !dirent->namelen)
395                         break;
396
397                 reclen = FUSE_DIRENT_SIZE(dirent); /* derefs ->namelen */
398
399                 if (WARN_ON(dirent->namelen > FUSE_NAME_MAX))
400                         return FOUND_ERR;
401                 if (WARN_ON(reclen > nbytes))
402                         return FOUND_ERR;
403                 if (WARN_ON(memchr(dirent->name, '/', dirent->namelen) != NULL))
404                         return FOUND_ERR;
405
406                 if (ff->readdir.pos == ctx->pos) {
407                         res = FOUND_SOME;
408                         if (!dir_emit(ctx, dirent->name, dirent->namelen,
409                                       dirent->ino, dirent->type))
410                                 return FOUND_ALL;
411                         ctx->pos = dirent->off;
412                 }
413                 ff->readdir.pos = dirent->off;
414                 ff->readdir.cache_off += reclen;
415
416                 offset += reclen;
417         }
418
419         return res;
420 }
421
422 static void fuse_rdc_reset(struct inode *inode)
423 {
424         struct fuse_inode *fi = get_fuse_inode(inode);
425
426         fi->rdc.cached = false;
427         fi->rdc.version++;
428         fi->rdc.size = 0;
429         fi->rdc.pos = 0;
430 }
431
432 #define UNCACHED 1
433
434 static int fuse_readdir_cached(struct file *file, struct dir_context *ctx)
435 {
436         struct fuse_file *ff = file->private_data;
437         struct inode *inode = file_inode(file);
438         struct fuse_conn *fc = get_fuse_conn(inode);
439         struct fuse_inode *fi = get_fuse_inode(inode);
440         enum fuse_parse_result res;
441         pgoff_t index;
442         unsigned int size;
443         struct page *page;
444         void *addr;
445
446         /* Seeked?  If so, reset the cache stream */
447         if (ff->readdir.pos != ctx->pos) {
448                 ff->readdir.pos = 0;
449                 ff->readdir.cache_off = 0;
450         }
451
452         /*
453          * We're just about to start reading into the cache or reading the
454          * cache; both cases require an up-to-date mtime value.
455          */
456         if (!ctx->pos && fc->auto_inval_data) {
457                 int err = fuse_update_attributes(inode, file);
458
459                 if (err)
460                         return err;
461         }
462
463 retry:
464         spin_lock(&fi->rdc.lock);
465 retry_locked:
466         if (!fi->rdc.cached) {
467                 /* Starting cache? Set cache mtime. */
468                 if (!ctx->pos && !fi->rdc.size) {
469                         fi->rdc.mtime = inode->i_mtime;
470                         fi->rdc.iversion = inode_query_iversion(inode);
471                 }
472                 spin_unlock(&fi->rdc.lock);
473                 return UNCACHED;
474         }
475         /*
476          * When at the beginning of the directory (i.e. just after opendir(3) or
477          * rewinddir(3)), then need to check whether directory contents have
478          * changed, and reset the cache if so.
479          */
480         if (!ctx->pos) {
481                 if (inode_peek_iversion(inode) != fi->rdc.iversion ||
482                     !timespec64_equal(&fi->rdc.mtime, &inode->i_mtime)) {
483                         fuse_rdc_reset(inode);
484                         goto retry_locked;
485                 }
486         }
487
488         /*
489          * If cache version changed since the last getdents() call, then reset
490          * the cache stream.
491          */
492         if (ff->readdir.version != fi->rdc.version) {
493                 ff->readdir.pos = 0;
494                 ff->readdir.cache_off = 0;
495         }
496         /*
497          * If at the beginning of the cache, than reset version to
498          * current.
499          */
500         if (ff->readdir.pos == 0)
501                 ff->readdir.version = fi->rdc.version;
502
503         WARN_ON(fi->rdc.size < ff->readdir.cache_off);
504
505         index = ff->readdir.cache_off >> PAGE_SHIFT;
506
507         if (index == (fi->rdc.size >> PAGE_SHIFT))
508                 size = fi->rdc.size & ~PAGE_MASK;
509         else
510                 size = PAGE_SIZE;
511         spin_unlock(&fi->rdc.lock);
512
513         /* EOF? */
514         if ((ff->readdir.cache_off & ~PAGE_MASK) == size)
515                 return 0;
516
517         page = find_get_page_flags(file->f_mapping, index,
518                                    FGP_ACCESSED | FGP_LOCK);
519         spin_lock(&fi->rdc.lock);
520         if (!page) {
521                 /*
522                  * Uh-oh: page gone missing, cache is useless
523                  */
524                 if (fi->rdc.version == ff->readdir.version)
525                         fuse_rdc_reset(inode);
526                 goto retry_locked;
527         }
528
529         /* Make sure it's still the same version after getting the page. */
530         if (ff->readdir.version != fi->rdc.version) {
531                 spin_unlock(&fi->rdc.lock);
532                 unlock_page(page);
533                 put_page(page);
534                 goto retry;
535         }
536         spin_unlock(&fi->rdc.lock);
537
538         /*
539          * Contents of the page are now protected against changing by holding
540          * the page lock.
541          */
542         addr = kmap(page);
543         res = fuse_parse_cache(ff, addr, size, ctx);
544         kunmap(page);
545         unlock_page(page);
546         put_page(page);
547
548         if (res == FOUND_ERR)
549                 return -EIO;
550
551         if (res == FOUND_ALL)
552                 return 0;
553
554         if (size == PAGE_SIZE) {
555                 /* We hit end of page: skip to next page. */
556                 ff->readdir.cache_off = ALIGN(ff->readdir.cache_off, PAGE_SIZE);
557                 goto retry;
558         }
559
560         /*
561          * End of cache reached.  If found position, then we are done, otherwise
562          * need to fall back to uncached, since the position we were looking for
563          * wasn't in the cache.
564          */
565         return res == FOUND_SOME ? 0 : UNCACHED;
566 }
567
568 int fuse_readdir(struct file *file, struct dir_context *ctx)
569 {
570         struct fuse_file *ff = file->private_data;
571         struct inode *inode = file_inode(file);
572         int err;
573
574         if (fuse_is_bad(inode))
575                 return -EIO;
576
577         mutex_lock(&ff->readdir.lock);
578
579         err = UNCACHED;
580         if (ff->open_flags & FOPEN_CACHE_DIR)
581                 err = fuse_readdir_cached(file, ctx);
582         if (err == UNCACHED)
583                 err = fuse_readdir_uncached(file, ctx);
584
585         mutex_unlock(&ff->readdir.lock);
586
587         return err;
588 }