2 FUSE: Filesystem in Userspace
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_atomic(page);
82 memcpy(addr + offset, dirent, reclen);
84 fi->rdc.size = (index << PAGE_SHIFT) + offset + reclen;
85 fi->rdc.pos = dirent->off;
87 spin_unlock(&fi->rdc.lock);
92 static void fuse_readdir_cache_end(struct file *file, loff_t pos)
94 struct fuse_inode *fi = get_fuse_inode(file_inode(file));
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);
104 fi->rdc.cached = true;
105 end = ALIGN(fi->rdc.size, PAGE_SIZE);
106 spin_unlock(&fi->rdc.lock);
108 /* truncate unused tail of cache */
109 truncate_inode_pages(file->f_mapping, end);
112 static bool fuse_emit(struct file *file, struct dir_context *ctx,
113 struct fuse_dirent *dirent)
115 struct fuse_file *ff = file->private_data;
117 if (ff->open_flags & FOPEN_CACHE_DIR)
118 fuse_add_dirent_to_cache(file, dirent, ctx->pos);
120 return dir_emit(ctx, dirent->name, dirent->namelen, dirent->ino,
124 static int parse_dirfile(char *buf, size_t nbytes, struct file *file,
125 struct dir_context *ctx)
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)
134 if (memchr(dirent->name, '/', dirent->namelen) != NULL)
137 if (!fuse_emit(file, ctx, dirent))
142 ctx->pos = dirent->off;
148 static int fuse_direntplus_link(struct file *file,
149 struct fuse_direntplus *direntplus,
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;
161 DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq);
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.
174 if (name.name[0] == '.') {
176 * We could potentially refresh the attributes of the directory
181 if (name.name[1] == '.' && name.len == 2)
185 if (invalid_nodeid(o->nodeid))
187 if (!fuse_valid_type(o->attr.mode))
190 fc = get_fuse_conn(dir);
192 name.hash = full_name_hash(parent, name.name, name.len);
193 dentry = d_lookup(parent, &name);
196 dentry = d_alloc_parallel(parent, &name, &wq);
198 return PTR_ERR(dentry);
200 if (!d_in_lookup(dentry)) {
201 struct fuse_inode *fi;
202 inode = d_inode(dentry);
204 get_node_id(inode) != o->nodeid ||
205 ((o->attr.mode ^ inode->i_mode) & S_IFMT)) {
206 d_invalidate(dentry);
210 if (is_bad_inode(inode)) {
215 fi = get_fuse_inode(inode);
216 spin_lock(&fc->lock);
218 spin_unlock(&fc->lock);
220 forget_all_cached_acls(inode);
221 fuse_change_attributes(inode, &o->attr,
222 entry_attr_timeout(o),
225 * The other branch comes via fuse_iget()
226 * which bumps nlookup inside
229 inode = fuse_iget(dir->i_sb, o->nodeid, o->generation,
230 &o->attr, entry_attr_timeout(o),
233 inode = ERR_PTR(-ENOMEM);
235 alias = d_splice_alias(inode, dentry);
236 d_lookup_done(dentry);
242 return PTR_ERR(dentry);
244 if (fc->readdirplus_auto)
245 set_bit(FUSE_I_INIT_RDPLUS, &get_fuse_inode(inode)->state);
246 fuse_change_entry_timeout(dentry, o);
252 static int parse_dirplusfile(char *buf, size_t nbytes, struct file *file,
253 struct dir_context *ctx, u64 attr_version)
255 struct fuse_direntplus *direntplus;
256 struct fuse_dirent *dirent;
261 while (nbytes >= FUSE_NAME_OFFSET_DIRENTPLUS) {
262 direntplus = (struct fuse_direntplus *) buf;
263 dirent = &direntplus->dirent;
264 reclen = FUSE_DIRENTPLUS_SIZE(direntplus);
266 if (!dirent->namelen || dirent->namelen > FUSE_NAME_MAX)
270 if (memchr(dirent->name, '/', dirent->namelen) != NULL)
274 /* We fill entries into dstbuf only as much as
275 it can hold. But we still continue iterating
276 over remaining entries to link them. If not,
277 we need to send a FORGET for each of those
278 which we did not link.
280 over = !fuse_emit(file, ctx, dirent);
282 ctx->pos = dirent->off;
288 ret = fuse_direntplus_link(file, direntplus, attr_version);
290 fuse_force_forget(file, direntplus->entry_out.nodeid);
296 static int fuse_readdir_uncached(struct file *file, struct dir_context *ctx)
301 struct inode *inode = file_inode(file);
302 struct fuse_conn *fc = get_fuse_conn(inode);
303 struct fuse_req *req;
304 u64 attr_version = 0;
307 req = fuse_get_req(fc, 1);
311 page = alloc_page(GFP_KERNEL);
313 fuse_put_request(fc, req);
317 plus = fuse_use_readdirplus(inode, ctx);
318 req->out.argpages = 1;
320 req->pages[0] = page;
321 req->page_descs[0].length = PAGE_SIZE;
323 attr_version = fuse_get_attr_version(fc);
324 fuse_read_fill(req, file, ctx->pos, PAGE_SIZE,
327 fuse_read_fill(req, file, ctx->pos, PAGE_SIZE,
330 locked = fuse_lock_inode(inode);
331 fuse_request_send(fc, req);
332 fuse_unlock_inode(inode, locked);
333 nbytes = req->out.args[0].size;
334 err = req->out.h.error;
335 fuse_put_request(fc, req);
338 struct fuse_file *ff = file->private_data;
340 if (ff->open_flags & FOPEN_CACHE_DIR)
341 fuse_readdir_cache_end(file, ctx->pos);
343 err = parse_dirplusfile(page_address(page), nbytes,
344 file, ctx, attr_version);
346 err = parse_dirfile(page_address(page), nbytes, file,
352 fuse_invalidate_atime(inode);
356 enum fuse_parse_result {
363 static enum fuse_parse_result fuse_parse_cache(struct fuse_file *ff,
364 void *addr, unsigned int size,
365 struct dir_context *ctx)
367 unsigned int offset = ff->readdir.cache_off & ~PAGE_MASK;
368 enum fuse_parse_result res = FOUND_NONE;
370 WARN_ON(offset >= size);
373 struct fuse_dirent *dirent = addr + offset;
374 unsigned int nbytes = size - offset;
375 size_t reclen = FUSE_DIRENT_SIZE(dirent);
377 if (nbytes < FUSE_NAME_OFFSET || !dirent->namelen)
380 if (WARN_ON(dirent->namelen > FUSE_NAME_MAX))
382 if (WARN_ON(reclen > nbytes))
384 if (WARN_ON(memchr(dirent->name, '/', dirent->namelen) != NULL))
387 if (ff->readdir.pos == ctx->pos) {
389 if (!dir_emit(ctx, dirent->name, dirent->namelen,
390 dirent->ino, dirent->type))
392 ctx->pos = dirent->off;
394 ff->readdir.pos = dirent->off;
395 ff->readdir.cache_off += reclen;
403 static void fuse_rdc_reset(struct inode *inode)
405 struct fuse_inode *fi = get_fuse_inode(inode);
407 fi->rdc.cached = false;
415 static int fuse_readdir_cached(struct file *file, struct dir_context *ctx)
417 struct fuse_file *ff = file->private_data;
418 struct inode *inode = file_inode(file);
419 struct fuse_conn *fc = get_fuse_conn(inode);
420 struct fuse_inode *fi = get_fuse_inode(inode);
421 enum fuse_parse_result res;
427 /* Seeked? If so, reset the cache stream */
428 if (ff->readdir.pos != ctx->pos) {
430 ff->readdir.cache_off = 0;
434 * We're just about to start reading into the cache or reading the
435 * cache; both cases require an up-to-date mtime value.
437 if (!ctx->pos && fc->auto_inval_data) {
438 int err = fuse_update_attributes(inode, file);
445 spin_lock(&fi->rdc.lock);
447 if (!fi->rdc.cached) {
448 /* Starting cache? Set cache mtime. */
449 if (!ctx->pos && !fi->rdc.size) {
450 fi->rdc.mtime = inode->i_mtime;
451 fi->rdc.iversion = inode_query_iversion(inode);
453 spin_unlock(&fi->rdc.lock);
457 * When at the beginning of the directory (i.e. just after opendir(3) or
458 * rewinddir(3)), then need to check whether directory contents have
459 * changed, and reset the cache if so.
462 if (inode_peek_iversion(inode) != fi->rdc.iversion ||
463 !timespec64_equal(&fi->rdc.mtime, &inode->i_mtime)) {
464 fuse_rdc_reset(inode);
470 * If cache version changed since the last getdents() call, then reset
473 if (ff->readdir.version != fi->rdc.version) {
475 ff->readdir.cache_off = 0;
478 * If at the beginning of the cache, than reset version to
481 if (ff->readdir.pos == 0)
482 ff->readdir.version = fi->rdc.version;
484 WARN_ON(fi->rdc.size < ff->readdir.cache_off);
486 index = ff->readdir.cache_off >> PAGE_SHIFT;
488 if (index == (fi->rdc.size >> PAGE_SHIFT))
489 size = fi->rdc.size & ~PAGE_MASK;
492 spin_unlock(&fi->rdc.lock);
495 if ((ff->readdir.cache_off & ~PAGE_MASK) == size)
498 page = find_get_page_flags(file->f_mapping, index,
499 FGP_ACCESSED | FGP_LOCK);
500 spin_lock(&fi->rdc.lock);
503 * Uh-oh: page gone missing, cache is useless
505 if (fi->rdc.version == ff->readdir.version)
506 fuse_rdc_reset(inode);
510 /* Make sure it's still the same version after getting the page. */
511 if (ff->readdir.version != fi->rdc.version) {
512 spin_unlock(&fi->rdc.lock);
517 spin_unlock(&fi->rdc.lock);
520 * Contents of the page are now protected against changing by holding
524 res = fuse_parse_cache(ff, addr, size, ctx);
529 if (res == FOUND_ERR)
532 if (res == FOUND_ALL)
535 if (size == PAGE_SIZE) {
536 /* We hit end of page: skip to next page. */
537 ff->readdir.cache_off = ALIGN(ff->readdir.cache_off, PAGE_SIZE);
542 * End of cache reached. If found position, then we are done, otherwise
543 * need to fall back to uncached, since the position we were looking for
544 * wasn't in the cache.
546 return res == FOUND_SOME ? 0 : UNCACHED;
549 int fuse_readdir(struct file *file, struct dir_context *ctx)
551 struct fuse_file *ff = file->private_data;
552 struct inode *inode = file_inode(file);
555 if (is_bad_inode(inode))
558 mutex_lock(&ff->readdir.lock);
561 if (ff->open_flags & FOPEN_CACHE_DIR)
562 err = fuse_readdir_cached(file, ctx);
564 err = fuse_readdir_uncached(file, ctx);
566 mutex_unlock(&ff->readdir.lock);