Lines Matching full:fs
3 * virtio-fs: Virtio Filesystem
7 #include <linux/fs.h>
31 /* List of virtio-fs device instances and a lock for the list. Also provides
37 /* The /sys/fs/virtio_fs/ kset */
63 /* A virtio-fs device instance */
155 struct virtio_fs *fs = vq->vdev->priv; in vq_to_fsvq() local
157 return &fs->vqs[vq->index]; in vq_to_fsvq()
178 struct virtio_fs *fs = container_of(kobj, struct virtio_fs, kobj); in tag_show() local
180 return sysfs_emit(buf, "%s\n", fs->tag); in tag_show()
206 static struct virtio_fs_vq *virtio_fs_kobj_to_vq(struct virtio_fs *fs, in virtio_fs_kobj_to_vq() argument
211 for (i = 0; i < fs->nvqs; i++) { in virtio_fs_kobj_to_vq()
212 if (kobj == fs->vqs[i].kobj) in virtio_fs_kobj_to_vq()
213 return &fs->vqs[i]; in virtio_fs_kobj_to_vq()
221 struct virtio_fs *fs = container_of(kobj->parent->parent, struct virtio_fs, kobj); in name_show() local
222 struct virtio_fs_vq *fsvq = virtio_fs_kobj_to_vq(fs, kobj); in name_show()
234 struct virtio_fs *fs = container_of(kobj->parent->parent, struct virtio_fs, kobj); in cpu_list_show() local
235 struct virtio_fs_vq *fsvq = virtio_fs_kobj_to_vq(fs, kobj); in cpu_list_show()
246 if (qid < VQ_REQUEST || (fs->mq_map[cpu] == qid)) { in cpu_list_show()
275 static void virtio_fs_put_locked(struct virtio_fs *fs) in virtio_fs_put_locked() argument
279 kobject_put(&fs->kobj); in virtio_fs_put_locked()
282 static void virtio_fs_put(struct virtio_fs *fs) in virtio_fs_put() argument
285 virtio_fs_put_locked(fs); in virtio_fs_put()
317 static void virtio_fs_drain_all_queues_locked(struct virtio_fs *fs) in virtio_fs_drain_all_queues_locked() argument
322 for (i = 0; i < fs->nvqs; i++) { in virtio_fs_drain_all_queues_locked()
323 fsvq = &fs->vqs[i]; in virtio_fs_drain_all_queues_locked()
328 static void virtio_fs_drain_all_queues(struct virtio_fs *fs) in virtio_fs_drain_all_queues() argument
337 virtio_fs_drain_all_queues_locked(fs); in virtio_fs_drain_all_queues()
341 static void virtio_fs_start_all_queues(struct virtio_fs *fs) in virtio_fs_start_all_queues() argument
346 for (i = 0; i < fs->nvqs; i++) { in virtio_fs_start_all_queues()
347 fsvq = &fs->vqs[i]; in virtio_fs_start_all_queues()
354 static void virtio_fs_delete_queues_sysfs(struct virtio_fs *fs) in virtio_fs_delete_queues_sysfs() argument
359 for (i = 0; i < fs->nvqs; i++) { in virtio_fs_delete_queues_sysfs()
360 fsvq = &fs->vqs[i]; in virtio_fs_delete_queues_sysfs()
365 static int virtio_fs_add_queues_sysfs(struct virtio_fs *fs) in virtio_fs_add_queues_sysfs() argument
371 for (i = 0; i < fs->nvqs; i++) { in virtio_fs_add_queues_sysfs()
372 fsvq = &fs->vqs[i]; in virtio_fs_add_queues_sysfs()
375 fsvq->kobj = kobject_create_and_add(buff, fs->mqs_kobj); in virtio_fs_add_queues_sysfs()
376 if (!fs->mqs_kobj) { in virtio_fs_add_queues_sysfs()
392 fsvq = &fs->vqs[j]; in virtio_fs_add_queues_sysfs()
400 struct virtio_fs *fs) in virtio_fs_add_instance() argument
408 if (strcmp(fs->tag, fs2->tag) == 0) { in virtio_fs_add_instance()
419 fs->kobj.kset = virtio_fs_kset; in virtio_fs_add_instance()
420 ret = kobject_add(&fs->kobj, NULL, "%d", vdev->index); in virtio_fs_add_instance()
424 fs->mqs_kobj = kobject_create_and_add("mqs", &fs->kobj); in virtio_fs_add_instance()
425 if (!fs->mqs_kobj) { in virtio_fs_add_instance()
430 ret = sysfs_create_link(&fs->kobj, &vdev->dev.kobj, "device"); in virtio_fs_add_instance()
434 ret = virtio_fs_add_queues_sysfs(fs); in virtio_fs_add_instance()
438 list_add_tail(&fs->list, &virtio_fs_instances); in virtio_fs_add_instance()
442 kobject_uevent(&fs->kobj, KOBJ_ADD); in virtio_fs_add_instance()
447 sysfs_remove_link(&fs->kobj, "device"); in virtio_fs_add_instance()
449 kobject_put(fs->mqs_kobj); in virtio_fs_add_instance()
451 kobject_del(&fs->kobj); in virtio_fs_add_instance()
460 struct virtio_fs *fs; in virtio_fs_find_instance() local
464 list_for_each_entry(fs, &virtio_fs_instances, list) { in virtio_fs_find_instance()
465 if (strcmp(fs->tag, tag) == 0) { in virtio_fs_find_instance()
466 kobject_get(&fs->kobj); in virtio_fs_find_instance()
471 fs = NULL; /* not found */ in virtio_fs_find_instance()
476 return fs; in virtio_fs_find_instance()
479 static void virtio_fs_free_devs(struct virtio_fs *fs) in virtio_fs_free_devs() argument
483 for (i = 0; i < fs->nvqs; i++) { in virtio_fs_free_devs()
484 struct virtio_fs_vq *fsvq = &fs->vqs[i]; in virtio_fs_free_devs()
494 /* Read filesystem name from virtio config into fs->tag (must kfree()). */
495 static int virtio_fs_read_tag(struct virtio_device *vdev, struct virtio_fs *fs) in virtio_fs_read_tag() argument
510 fs->tag = devm_kmalloc(&vdev->dev, len + 1, GFP_KERNEL); in virtio_fs_read_tag()
511 if (!fs->tag) in virtio_fs_read_tag()
513 memcpy(fs->tag, tag_buf, len); in virtio_fs_read_tag()
514 fs->tag[len] = '\0'; in virtio_fs_read_tag()
520 if (strchr(fs->tag, '\n')) { in virtio_fs_read_tag()
525 dev_info(&vdev->dev, "discovered new tag: %s\n", fs->tag); in virtio_fs_read_tag()
563 pr_debug("virtio-fs: worker %s called.\n", __func__); in virtio_fs_request_dispatch_work()
606 pr_err("virtio-fs: virtio_fs_enqueue_req() failed %d\n", in virtio_fs_request_dispatch_work()
642 pr_debug("virtio-fs: Could not queue FORGET: err=%d. Will try later\n", in send_forget_request()
650 pr_debug("virtio-fs: Could not queue FORGET: err=%d. Dropping it.\n", in send_forget_request()
677 pr_debug("virtio-fs: worker %s called.\n", __func__); in virtio_fs_hiprio_dispatch_work()
862 static void virtio_fs_map_queues(struct virtio_device *vdev, struct virtio_fs *fs) in virtio_fs_map_queues() argument
873 for (q = 0; q < fs->num_request_queues; q++) { in virtio_fs_map_queues()
879 fs->mq_map[cpu] = q + VQ_REQUEST; in virtio_fs_map_queues()
885 masks = group_cpus_evenly(fs->num_request_queues); in virtio_fs_map_queues()
889 fs->mq_map[cpu] = VQ_REQUEST; in virtio_fs_map_queues()
893 for (q = 0; q < fs->num_request_queues; q++) { in virtio_fs_map_queues()
895 fs->mq_map[cpu] = q + VQ_REQUEST; in virtio_fs_map_queues()
932 struct virtio_fs *fs) in virtio_fs_setup_vqs() argument
945 &fs->num_request_queues); in virtio_fs_setup_vqs()
946 if (fs->num_request_queues == 0) in virtio_fs_setup_vqs()
950 fs->num_request_queues = min_t(unsigned int, fs->num_request_queues, in virtio_fs_setup_vqs()
952 fs->nvqs = VQ_REQUEST + fs->num_request_queues; in virtio_fs_setup_vqs()
953 fs->vqs = kcalloc(fs->nvqs, sizeof(fs->vqs[VQ_HIPRIO]), GFP_KERNEL); in virtio_fs_setup_vqs()
954 if (!fs->vqs) in virtio_fs_setup_vqs()
957 vqs = kmalloc_array(fs->nvqs, sizeof(vqs[VQ_HIPRIO]), GFP_KERNEL); in virtio_fs_setup_vqs()
958 fs->mq_map = kcalloc_node(nr_cpu_ids, sizeof(*fs->mq_map), GFP_KERNEL, in virtio_fs_setup_vqs()
960 vqs_info = kcalloc(fs->nvqs, sizeof(*vqs_info), GFP_KERNEL); in virtio_fs_setup_vqs()
961 if (!vqs || !vqs_info || !fs->mq_map) { in virtio_fs_setup_vqs()
968 virtio_fs_init_vq(&fs->vqs[VQ_HIPRIO], "hiprio", VQ_HIPRIO); in virtio_fs_setup_vqs()
969 vqs_info[VQ_HIPRIO].name = fs->vqs[VQ_HIPRIO].name; in virtio_fs_setup_vqs()
972 for (i = VQ_REQUEST; i < fs->nvqs; i++) { in virtio_fs_setup_vqs()
976 virtio_fs_init_vq(&fs->vqs[i], vq_name, VQ_REQUEST); in virtio_fs_setup_vqs()
978 vqs_info[i].name = fs->vqs[i].name; in virtio_fs_setup_vqs()
981 ret = virtio_find_vqs(vdev, fs->nvqs, vqs, vqs_info, &desc); in virtio_fs_setup_vqs()
985 for (i = 0; i < fs->nvqs; i++) in virtio_fs_setup_vqs()
986 fs->vqs[i].vq = vqs[i]; in virtio_fs_setup_vqs()
988 virtio_fs_start_all_queues(fs); in virtio_fs_setup_vqs()
993 kfree(fs->vqs); in virtio_fs_setup_vqs()
994 kfree(fs->mq_map); in virtio_fs_setup_vqs()
1013 struct virtio_fs *fs = dax_get_private(dax_dev); in virtio_fs_direct_access() local
1015 size_t max_nr_pages = fs->window_len / PAGE_SIZE - pgoff; in virtio_fs_direct_access()
1018 *kaddr = fs->window_kaddr + offset; in virtio_fs_direct_access()
1020 *pfn = phys_to_pfn_t(fs->window_phys_addr + offset, in virtio_fs_direct_access()
1056 static int virtio_fs_setup_dax(struct virtio_device *vdev, struct virtio_fs *fs) in virtio_fs_setup_dax() argument
1066 dax_dev = alloc_dax(fs, &virtio_fs_dax_ops); in virtio_fs_setup_dax()
1107 fs->window_kaddr = devm_memremap_pages(&vdev->dev, pgmap); in virtio_fs_setup_dax()
1108 if (IS_ERR(fs->window_kaddr)) in virtio_fs_setup_dax()
1109 return PTR_ERR(fs->window_kaddr); in virtio_fs_setup_dax()
1111 fs->window_phys_addr = (phys_addr_t) cache_reg.addr; in virtio_fs_setup_dax()
1112 fs->window_len = (phys_addr_t) cache_reg.len; in virtio_fs_setup_dax()
1115 __func__, fs->window_kaddr, cache_reg.addr, cache_reg.len); in virtio_fs_setup_dax()
1117 fs->dax_dev = no_free_ptr(dax_dev); in virtio_fs_setup_dax()
1119 fs->dax_dev); in virtio_fs_setup_dax()
1124 struct virtio_fs *fs; in virtio_fs_probe() local
1127 fs = kzalloc(sizeof(*fs), GFP_KERNEL); in virtio_fs_probe()
1128 if (!fs) in virtio_fs_probe()
1130 kobject_init(&fs->kobj, &virtio_fs_ktype); in virtio_fs_probe()
1131 vdev->priv = fs; in virtio_fs_probe()
1133 ret = virtio_fs_read_tag(vdev, fs); in virtio_fs_probe()
1137 ret = virtio_fs_setup_vqs(vdev, fs); in virtio_fs_probe()
1141 virtio_fs_map_queues(vdev, fs); in virtio_fs_probe()
1143 ret = virtio_fs_setup_dax(vdev, fs); in virtio_fs_probe()
1152 ret = virtio_fs_add_instance(vdev, fs); in virtio_fs_probe()
1164 kobject_put(&fs->kobj); in virtio_fs_probe()
1168 static void virtio_fs_stop_all_queues(struct virtio_fs *fs) in virtio_fs_stop_all_queues() argument
1173 for (i = 0; i < fs->nvqs; i++) { in virtio_fs_stop_all_queues()
1174 fsvq = &fs->vqs[i]; in virtio_fs_stop_all_queues()
1183 struct virtio_fs *fs = vdev->priv; in virtio_fs_remove() local
1187 list_del_init(&fs->list); in virtio_fs_remove()
1188 virtio_fs_delete_queues_sysfs(fs); in virtio_fs_remove()
1189 sysfs_remove_link(&fs->kobj, "device"); in virtio_fs_remove()
1190 kobject_put(fs->mqs_kobj); in virtio_fs_remove()
1191 kobject_del(&fs->kobj); in virtio_fs_remove()
1192 virtio_fs_stop_all_queues(fs); in virtio_fs_remove()
1193 virtio_fs_drain_all_queues_locked(fs); in virtio_fs_remove()
1199 virtio_fs_put_locked(fs); in virtio_fs_remove()
1207 pr_warn("virtio-fs: suspend/resume not yet supported\n"); in virtio_fs_freeze()
1242 struct virtio_fs *fs = fiq->priv; in virtio_fs_send_forget() local
1243 struct virtio_fs_vq *fsvq = &fs->vqs[VQ_HIPRIO]; in virtio_fs_send_forget()
1269 * Normal fs operations on a local filesystems aren't interruptible. in virtio_fs_send_interrupt()
1481 struct virtio_fs *fs; in virtio_fs_send_req() local
1490 fs = fiq->priv; in virtio_fs_send_req()
1491 queue_id = fs->mq_map[raw_smp_processor_id()]; in virtio_fs_send_req()
1499 fsvq = &fs->vqs[queue_id]; in virtio_fs_send_req()
1514 pr_err("virtio-fs: virtio_fs_enqueue_req() failed %d\n", ret); in virtio_fs_send_req()
1548 struct virtio_fs *fs = fc->iq.priv; in virtio_fs_fill_super() local
1561 if (list_empty(&fs->list)) { in virtio_fs_fill_super()
1562 pr_info("virtio-fs: tag <%s> not found\n", fs->tag); in virtio_fs_fill_super()
1568 for (i = 0; i < fs->nvqs; i++) { in virtio_fs_fill_super()
1569 struct virtio_fs_vq *fsvq = &fs->vqs[i]; in virtio_fs_fill_super()
1579 if (ctx->dax_mode == FUSE_DAX_ALWAYS && !fs->dax_dev) { in virtio_fs_fill_super()
1581 pr_err("virtio-fs: dax can't be enabled as filesystem" in virtio_fs_fill_super()
1585 ctx->dax_dev = fs->dax_dev; in virtio_fs_fill_super()
1591 for (i = 0; i < fs->nvqs; i++) { in virtio_fs_fill_super()
1592 struct virtio_fs_vq *fsvq = &fs->vqs[i]; in virtio_fs_fill_super()
1598 virtio_fs_start_all_queues(fs); in virtio_fs_fill_super()
1604 virtio_fs_free_devs(fs); in virtio_fs_fill_super()
1666 struct virtio_fs *fs; in virtio_fs_get_tree() local
1680 fs = virtio_fs_find_instance(fsc->source); in virtio_fs_get_tree()
1681 if (!fs) { in virtio_fs_get_tree()
1682 pr_info("virtio-fs: tag <%s> not found\n", fsc->source); in virtio_fs_get_tree()
1686 virtqueue_size = virtqueue_get_vring_size(fs->vqs[VQ_REQUEST].vq); in virtio_fs_get_tree()
1699 fuse_conn_init(fc, fm, fsc->user_ns, &virtio_fs_fiq_ops, fs); in virtio_fs_get_tree()
1733 virtio_fs_put(fs); in virtio_fs_get_tree()
1768 const struct virtio_fs *fs = container_of(kobj, struct virtio_fs, kobj); in virtio_fs_uevent() local
1770 add_uevent_var(env, "TAG=%s", fs->tag); in virtio_fs_uevent()