2 FUSE: Filesystem in Userspace
3 Copyright (C) 2001-2018 Miklos Szeredi <miklos@szeredi.hu>
5 This program can be distributed under the terms of the GNU GPL.
11 #include <linux/iversion.h>
12 #include <linux/posix_acl.h>
13 #include <linux/pagemap.h>
14 #include <linux/highmem.h>
16 static bool fuse_use_readdirplus(struct inode *dir, struct dir_context *ctx)
18 struct fuse_conn *fc = get_fuse_conn(dir);
19 struct fuse_inode *fi = get_fuse_inode(dir);
21 if (!fc->do_readdirplus)
23 if (!fc->readdirplus_auto)
25 if (test_and_clear_bit(FUSE_I_ADVISE_RDPLUS, &fi->state))
32 static void fuse_add_dirent_to_cache(struct file *file,
33 struct fuse_dirent *dirent, loff_t pos)
35 struct fuse_inode *fi = get_fuse_inode(file_inode(file));
36 size_t reclen = FUSE_DIRENT_SIZE(dirent);
44 spin_lock(&fi->rdc.lock);
46 * Is cache already completed? Or this entry does not go at the end of
49 if (fi->rdc.cached || pos != fi->rdc.pos) {
50 spin_unlock(&fi->rdc.lock);
53 version = fi->rdc.version;
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) {
62 spin_unlock(&fi->rdc.lock);
65 page = find_lock_page(file->f_mapping, index);
67 page = find_or_create_page(file->f_mapping, index,
68 mapping_gfp_mask(file->f_mapping));
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))
79 addr = kmap_local_page(page);
82 SetPageUptodate(page);
84 memcpy(addr + offset, dirent, reclen);
86 fi->rdc.size = (index << PAGE_SHIFT) + offset + reclen;
87 fi->rdc.pos = dirent->off;
89 spin_unlock(&fi->rdc.lock);
94 static void fuse_readdir_cache_end(struct file *file, loff_t pos)
96 struct fuse_inode *fi = get_fuse_inode(file_inode(file));
99 spin_lock(&fi->rdc.lock);
100 /* does cache end position match current position? */
101 if (fi->rdc.pos != pos) {
102 spin_unlock(&fi->rdc.lock);
106 fi->rdc.cached = true;
107 end = ALIGN(fi->rdc.size, PAGE_SIZE);
108 spin_unlock(&fi->rdc.lock);
110 /* truncate unused tail of cache */
111 truncate_inode_pages(file->f_mapping, end);
114 static bool fuse_emit(struct file *file, struct dir_context *ctx,
115 struct fuse_dirent *dirent)
117 struct fuse_file *ff = file->private_data;
119 if (ff->open_flags & FOPEN_CACHE_DIR)
120 fuse_add_dirent_to_cache(file, dirent, ctx->pos);
122 return dir_emit(ctx, dirent->name, dirent->namelen, dirent->ino,
126 static int parse_dirfile(char *buf, size_t nbytes, struct file *file,
127 struct dir_context *ctx)
129 while (nbytes >= FUSE_NAME_OFFSET) {
130 struct fuse_dirent *dirent = (struct fuse_dirent *) buf;
131 size_t reclen = FUSE_DIRENT_SIZE(dirent);
132 if (!dirent->namelen || dirent->namelen > FUSE_NAME_MAX)
136 if (memchr(dirent->name, '/', dirent->namelen) != NULL)
139 if (!fuse_emit(file, ctx, dirent))
144 ctx->pos = dirent->off;
150 static int fuse_direntplus_link(struct file *file,
151 struct fuse_direntplus *direntplus,
154 struct fuse_entry_out *o = &direntplus->entry_out;
155 struct fuse_dirent *dirent = &direntplus->dirent;
156 struct dentry *parent = file->f_path.dentry;
157 struct qstr name = QSTR_INIT(dirent->name, dirent->namelen);
158 struct dentry *dentry;
159 struct dentry *alias;
160 struct inode *dir = d_inode(parent);
161 struct fuse_conn *fc;
163 DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq);
167 * Unlike in the case of fuse_lookup, zero nodeid does not mean
168 * ENOENT. Instead, it only means the userspace filesystem did
169 * not want to return attributes/handle for this entry.
176 if (name.name[0] == '.') {
178 * We could potentially refresh the attributes of the directory
183 if (name.name[1] == '.' && name.len == 2)
187 if (invalid_nodeid(o->nodeid))
189 if (fuse_invalid_attr(&o->attr))
192 fc = get_fuse_conn(dir);
194 name.hash = full_name_hash(parent, name.name, name.len);
195 dentry = d_lookup(parent, &name);
198 dentry = d_alloc_parallel(parent, &name, &wq);
200 return PTR_ERR(dentry);
202 if (!d_in_lookup(dentry)) {
203 struct fuse_inode *fi;
204 inode = d_inode(dentry);
205 if (inode && get_node_id(inode) != o->nodeid)
208 fuse_stale_inode(inode, o->generation, &o->attr)) {
210 fuse_make_bad(inode);
211 d_invalidate(dentry);
215 if (fuse_is_bad(inode)) {
220 fi = get_fuse_inode(inode);
221 spin_lock(&fi->lock);
223 spin_unlock(&fi->lock);
225 forget_all_cached_acls(inode);
226 fuse_change_attributes(inode, &o->attr,
227 entry_attr_timeout(o),
230 * The other branch comes via fuse_iget()
231 * which bumps nlookup inside
234 inode = fuse_iget(dir->i_sb, o->nodeid, o->generation,
235 &o->attr, entry_attr_timeout(o),
238 inode = ERR_PTR(-ENOMEM);
240 alias = d_splice_alias(inode, dentry);
241 d_lookup_done(dentry);
247 return PTR_ERR(dentry);
249 if (fc->readdirplus_auto)
250 set_bit(FUSE_I_INIT_RDPLUS, &get_fuse_inode(inode)->state);
251 fuse_change_entry_timeout(dentry, o);
257 static void fuse_force_forget(struct file *file, u64 nodeid)
259 struct inode *inode = file_inode(file);
260 struct fuse_mount *fm = get_fuse_mount(inode);
261 struct fuse_forget_in inarg;
264 memset(&inarg, 0, sizeof(inarg));
266 args.opcode = FUSE_FORGET;
267 args.nodeid = nodeid;
269 args.in_args[0].size = sizeof(inarg);
270 args.in_args[0].value = &inarg;
274 fuse_simple_request(fm, &args);
278 static int parse_dirplusfile(char *buf, size_t nbytes, struct file *file,
279 struct dir_context *ctx, u64 attr_version)
281 struct fuse_direntplus *direntplus;
282 struct fuse_dirent *dirent;
287 while (nbytes >= FUSE_NAME_OFFSET_DIRENTPLUS) {
288 direntplus = (struct fuse_direntplus *) buf;
289 dirent = &direntplus->dirent;
290 reclen = FUSE_DIRENTPLUS_SIZE(direntplus);
292 if (!dirent->namelen || dirent->namelen > FUSE_NAME_MAX)
296 if (memchr(dirent->name, '/', dirent->namelen) != NULL)
300 /* We fill entries into dstbuf only as much as
301 it can hold. But we still continue iterating
302 over remaining entries to link them. If not,
303 we need to send a FORGET for each of those
304 which we did not link.
306 over = !fuse_emit(file, ctx, dirent);
308 ctx->pos = dirent->off;
314 ret = fuse_direntplus_link(file, direntplus, attr_version);
316 fuse_force_forget(file, direntplus->entry_out.nodeid);
322 static int fuse_readdir_uncached(struct file *file, struct dir_context *ctx)
327 struct inode *inode = file_inode(file);
328 struct fuse_mount *fm = get_fuse_mount(inode);
329 struct fuse_io_args ia = {};
330 struct fuse_args_pages *ap = &ia.ap;
331 struct fuse_page_desc desc = { .length = PAGE_SIZE };
332 u64 attr_version = 0;
335 page = alloc_page(GFP_KERNEL);
339 plus = fuse_use_readdirplus(inode, ctx);
340 ap->args.out_pages = true;
345 attr_version = fuse_get_attr_version(fm->fc);
346 fuse_read_args_fill(&ia, file, ctx->pos, PAGE_SIZE,
349 fuse_read_args_fill(&ia, file, ctx->pos, PAGE_SIZE,
352 locked = fuse_lock_inode(inode);
353 res = fuse_simple_request(fm, &ap->args);
354 fuse_unlock_inode(inode, locked);
357 struct fuse_file *ff = file->private_data;
359 if (ff->open_flags & FOPEN_CACHE_DIR)
360 fuse_readdir_cache_end(file, ctx->pos);
362 res = parse_dirplusfile(page_address(page), res,
363 file, ctx, attr_version);
365 res = parse_dirfile(page_address(page), res, file,
371 fuse_invalidate_atime(inode);
375 enum fuse_parse_result {
382 static enum fuse_parse_result fuse_parse_cache(struct fuse_file *ff,
383 void *addr, unsigned int size,
384 struct dir_context *ctx)
386 unsigned int offset = ff->readdir.cache_off & ~PAGE_MASK;
387 enum fuse_parse_result res = FOUND_NONE;
389 WARN_ON(offset >= size);
392 struct fuse_dirent *dirent = addr + offset;
393 unsigned int nbytes = size - offset;
396 if (nbytes < FUSE_NAME_OFFSET || !dirent->namelen)
399 reclen = FUSE_DIRENT_SIZE(dirent); /* derefs ->namelen */
401 if (WARN_ON(dirent->namelen > FUSE_NAME_MAX))
403 if (WARN_ON(reclen > nbytes))
405 if (WARN_ON(memchr(dirent->name, '/', dirent->namelen) != NULL))
408 if (ff->readdir.pos == ctx->pos) {
410 if (!dir_emit(ctx, dirent->name, dirent->namelen,
411 dirent->ino, dirent->type))
413 ctx->pos = dirent->off;
415 ff->readdir.pos = dirent->off;
416 ff->readdir.cache_off += reclen;
424 static void fuse_rdc_reset(struct inode *inode)
426 struct fuse_inode *fi = get_fuse_inode(inode);
428 fi->rdc.cached = false;
436 static int fuse_readdir_cached(struct file *file, struct dir_context *ctx)
438 struct fuse_file *ff = file->private_data;
439 struct inode *inode = file_inode(file);
440 struct fuse_conn *fc = get_fuse_conn(inode);
441 struct fuse_inode *fi = get_fuse_inode(inode);
442 enum fuse_parse_result res;
448 /* Seeked? If so, reset the cache stream */
449 if (ff->readdir.pos != ctx->pos) {
451 ff->readdir.cache_off = 0;
455 * We're just about to start reading into the cache or reading the
456 * cache; both cases require an up-to-date mtime value.
458 if (!ctx->pos && fc->auto_inval_data) {
459 int err = fuse_update_attributes(inode, file, STATX_MTIME);
466 spin_lock(&fi->rdc.lock);
468 if (!fi->rdc.cached) {
469 /* Starting cache? Set cache mtime. */
470 if (!ctx->pos && !fi->rdc.size) {
471 fi->rdc.mtime = inode->i_mtime;
472 fi->rdc.iversion = inode_query_iversion(inode);
474 spin_unlock(&fi->rdc.lock);
478 * When at the beginning of the directory (i.e. just after opendir(3) or
479 * rewinddir(3)), then need to check whether directory contents have
480 * changed, and reset the cache if so.
483 if (inode_peek_iversion(inode) != fi->rdc.iversion ||
484 !timespec64_equal(&fi->rdc.mtime, &inode->i_mtime)) {
485 fuse_rdc_reset(inode);
491 * If cache version changed since the last getdents() call, then reset
494 if (ff->readdir.version != fi->rdc.version) {
496 ff->readdir.cache_off = 0;
499 * If at the beginning of the cache, than reset version to
502 if (ff->readdir.pos == 0)
503 ff->readdir.version = fi->rdc.version;
505 WARN_ON(fi->rdc.size < ff->readdir.cache_off);
507 index = ff->readdir.cache_off >> PAGE_SHIFT;
509 if (index == (fi->rdc.size >> PAGE_SHIFT))
510 size = fi->rdc.size & ~PAGE_MASK;
513 spin_unlock(&fi->rdc.lock);
516 if ((ff->readdir.cache_off & ~PAGE_MASK) == size)
519 page = find_get_page_flags(file->f_mapping, index,
520 FGP_ACCESSED | FGP_LOCK);
521 /* Page gone missing, then re-added to cache, but not initialized? */
522 if (page && !PageUptodate(page)) {
527 spin_lock(&fi->rdc.lock);
530 * Uh-oh: page gone missing, cache is useless
532 if (fi->rdc.version == ff->readdir.version)
533 fuse_rdc_reset(inode);
537 /* Make sure it's still the same version after getting the page. */
538 if (ff->readdir.version != fi->rdc.version) {
539 spin_unlock(&fi->rdc.lock);
544 spin_unlock(&fi->rdc.lock);
547 * Contents of the page are now protected against changing by holding
551 res = fuse_parse_cache(ff, addr, size, ctx);
556 if (res == FOUND_ERR)
559 if (res == FOUND_ALL)
562 if (size == PAGE_SIZE) {
563 /* We hit end of page: skip to next page. */
564 ff->readdir.cache_off = ALIGN(ff->readdir.cache_off, PAGE_SIZE);
569 * End of cache reached. If found position, then we are done, otherwise
570 * need to fall back to uncached, since the position we were looking for
571 * wasn't in the cache.
573 return res == FOUND_SOME ? 0 : UNCACHED;
576 int fuse_readdir(struct file *file, struct dir_context *ctx)
578 struct fuse_file *ff = file->private_data;
579 struct inode *inode = file_inode(file);
582 if (fuse_is_bad(inode))
585 mutex_lock(&ff->readdir.lock);
588 if (ff->open_flags & FOPEN_CACHE_DIR)
589 err = fuse_readdir_cached(file, ctx);
591 err = fuse_readdir_uncached(file, ctx);
593 mutex_unlock(&ff->readdir.lock);