Lines Matching +full:fixed +full:- +full:length
24 #include "block/block_int-common.h"
29 #include "qapi/qapi-commands-block.h"
30 #include "qemu/main-loop.h"
31 #include "system/block-backend.h"
86 aio_set_fd_handler(exp->common.ctx, in fuse_export_drained_begin()
87 fuse_session_fd(exp->fuse_session), in fuse_export_drained_begin()
89 exp->fd_handler_set_up = false; in fuse_export_drained_begin()
97 exp->common.ctx = blk_get_aio_context(exp->common.blk); in fuse_export_drained_end()
99 aio_set_fd_handler(exp->common.ctx, in fuse_export_drained_end()
100 fuse_session_fd(exp->fuse_session), in fuse_export_drained_end()
102 exp->fd_handler_set_up = true; in fuse_export_drained_end()
109 return qatomic_read(&exp->in_flight) > 0; in fuse_export_drained_poll()
123 BlockExportOptionsFuse *args = &blk_exp_args->u.fuse; in fuse_export_create()
126 assert(blk_exp_args->type == BLOCK_EXPORT_TYPE_FUSE); in fuse_export_create()
129 if (args->growable || blk_exp_args->writable) { in fuse_export_create()
132 blk_get_perm(exp->common.blk, &blk_perm, &blk_shared_perm); in fuse_export_create()
134 ret = blk_set_perm(exp->common.blk, blk_perm | BLK_PERM_RESIZE, in fuse_export_create()
141 blk_set_dev_ops(exp->common.blk, &fuse_export_blk_dev_ops, exp); in fuse_export_create()
144 * We handle draining ourselves using an in-flight counter and by disabling in fuse_export_create()
146 * complete so the in-flight counter reaches zero. in fuse_export_create()
148 blk_set_disable_request_queuing(exp->common.blk, true); in fuse_export_create()
153 * It is important to do this check before calling is_regular_file() -- in fuse_export_create()
166 if (g_hash_table_contains(exports, args->mountpoint)) { in fuse_export_create()
168 args->mountpoint); in fuse_export_create()
169 ret = -EEXIST; in fuse_export_create()
173 if (!is_regular_file(args->mountpoint, errp)) { in fuse_export_create()
174 ret = -EINVAL; in fuse_export_create()
178 exp->mountpoint = g_strdup(args->mountpoint); in fuse_export_create()
179 exp->writable = blk_exp_args->writable; in fuse_export_create()
180 exp->growable = args->growable; in fuse_export_create()
183 if (!args->has_allow_other) { in fuse_export_create()
184 args->allow_other = FUSE_EXPORT_ALLOW_OTHER_AUTO; in fuse_export_create()
187 exp->st_mode = S_IFREG | S_IRUSR; in fuse_export_create()
188 if (exp->writable) { in fuse_export_create()
189 exp->st_mode |= S_IWUSR; in fuse_export_create()
191 exp->st_uid = getuid(); in fuse_export_create()
192 exp->st_gid = getgid(); in fuse_export_create()
194 if (args->allow_other == FUSE_EXPORT_ALLOW_OTHER_AUTO) { in fuse_export_create()
196 ret = setup_fuse_export(exp, args->mountpoint, true, NULL); in fuse_export_create()
197 exp->allow_other = ret == 0; in fuse_export_create()
199 ret = setup_fuse_export(exp, args->mountpoint, false, errp); in fuse_export_create()
202 exp->allow_other = args->allow_other == FUSE_EXPORT_ALLOW_OTHER_ON; in fuse_export_create()
203 ret = setup_fuse_export(exp, args->mountpoint, exp->allow_other, errp); in fuse_export_create()
229 * Create exp->fuse_session and mount it.
248 fuse_argv[1] = "-o"; in setup_fuse_export()
253 exp->fuse_session = fuse_session_new(&fuse_args, &fuse_ops, in setup_fuse_export()
256 if (!exp->fuse_session) { in setup_fuse_export()
258 ret = -EIO; in setup_fuse_export()
262 ret = fuse_session_mount(exp->fuse_session, mountpoint); in setup_fuse_export()
265 ret = -EIO; in setup_fuse_export()
268 exp->mounted = true; in setup_fuse_export()
272 aio_set_fd_handler(exp->common.ctx, in setup_fuse_export()
273 fuse_session_fd(exp->fuse_session), in setup_fuse_export()
275 exp->fd_handler_set_up = true; in setup_fuse_export()
280 fuse_export_shutdown(&exp->common); in setup_fuse_export()
293 blk_exp_ref(&exp->common); in read_from_fuse_export()
295 qatomic_inc(&exp->in_flight); in read_from_fuse_export()
298 ret = fuse_session_receive_buf(exp->fuse_session, &exp->fuse_buf); in read_from_fuse_export()
299 } while (ret == -EINTR); in read_from_fuse_export()
304 fuse_session_process_buf(exp->fuse_session, &exp->fuse_buf); in read_from_fuse_export()
307 if (qatomic_fetch_dec(&exp->in_flight) == 1) { in read_from_fuse_export()
311 blk_exp_unref(&exp->common); in read_from_fuse_export()
318 if (exp->fuse_session) { in fuse_export_shutdown()
319 fuse_session_exit(exp->fuse_session); in fuse_export_shutdown()
321 if (exp->fd_handler_set_up) { in fuse_export_shutdown()
322 aio_set_fd_handler(exp->common.ctx, in fuse_export_shutdown()
323 fuse_session_fd(exp->fuse_session), in fuse_export_shutdown()
325 exp->fd_handler_set_up = false; in fuse_export_shutdown()
329 if (exp->mountpoint) { in fuse_export_shutdown()
334 g_hash_table_remove(exports, exp->mountpoint); in fuse_export_shutdown()
342 if (exp->fuse_session) { in fuse_export_delete()
343 if (exp->mounted) { in fuse_export_delete()
344 fuse_session_unmount(exp->fuse_session); in fuse_export_delete()
347 fuse_session_destroy(exp->fuse_session); in fuse_export_delete()
350 free(exp->fuse_buf.mem); in fuse_export_delete()
351 g_free(exp->mountpoint); in fuse_export_delete()
387 * to set max_read to a fixed value here. in fuse_init()
389 conn->max_read = FUSE_MAX_BOUNCE_BYTES; in fuse_init()
391 conn->max_write = MIN_NON_ZERO(BDRV_REQUEST_MAX_BYTES, conn->max_write); in fuse_init()
410 int64_t length, allocated_blocks; in fuse_getattr() local
414 length = blk_getlength(exp->common.blk); in fuse_getattr()
415 if (length < 0) { in fuse_getattr()
416 fuse_reply_err(req, -length); in fuse_getattr()
420 allocated_blocks = bdrv_get_allocated_file_size(blk_bs(exp->common.blk)); in fuse_getattr()
422 allocated_blocks = DIV_ROUND_UP(length, 512); in fuse_getattr()
429 .st_mode = exp->st_mode, in fuse_getattr()
431 .st_uid = exp->st_uid, in fuse_getattr()
432 .st_gid = exp->st_gid, in fuse_getattr()
433 .st_size = length, in fuse_getattr()
434 .st_blksize = blk_bs(exp->common.blk)->bl.request_alignment, in fuse_getattr()
453 add_resize_perm = !exp->growable && !exp->writable; in fuse_do_truncate()
463 return -EPERM; in fuse_do_truncate()
466 blk_get_perm(exp->common.blk, &blk_perm, &blk_shared_perm); in fuse_do_truncate()
468 ret = blk_set_perm(exp->common.blk, blk_perm | BLK_PERM_RESIZE, in fuse_do_truncate()
475 ret = blk_truncate(exp->common.blk, size, true, prealloc, in fuse_do_truncate()
480 ret_check = blk_set_perm(exp->common.blk, blk_perm, in fuse_do_truncate()
492 * permit access: Read-only exports cannot be given +w, and exports
494 * they cannot be given non-owner access.
504 if (exp->allow_other) { in fuse_setattr()
516 * Without allow_other, non-owners can never access the export, so do in fuse_setattr()
519 if (!exp->allow_other && in fuse_setattr()
520 (statbuf->st_mode & (S_IRWXG | S_IRWXO)) != 0) in fuse_setattr()
526 /* +w for read-only exports makes no sense, disallow it */ in fuse_setattr()
527 if (!exp->writable && in fuse_setattr()
528 (statbuf->st_mode & (S_IWUSR | S_IWGRP | S_IWOTH)) != 0) in fuse_setattr()
536 if (!exp->writable) { in fuse_setattr()
541 ret = fuse_do_truncate(exp, statbuf->st_size, true, PREALLOC_MODE_OFF); in fuse_setattr()
543 fuse_reply_err(req, -ret); in fuse_setattr()
549 /* Ignore FUSE-supplied file type, only change the mode */ in fuse_setattr()
550 exp->st_mode = (statbuf->st_mode & 07777) | S_IFREG; in fuse_setattr()
554 exp->st_uid = statbuf->st_uid; in fuse_setattr()
558 exp->st_gid = statbuf->st_gid; in fuse_setattr()
580 int64_t length; in fuse_read() local
592 * offset+size to the image length. in fuse_read()
594 length = blk_getlength(exp->common.blk); in fuse_read()
595 if (length < 0) { in fuse_read()
596 fuse_reply_err(req, -length); in fuse_read()
600 if (offset + size > length) { in fuse_read()
601 size = length - offset; in fuse_read()
604 buf = qemu_try_blockalign(blk_bs(exp->common.blk), size); in fuse_read()
610 ret = blk_pread(exp->common.blk, offset, size, buf, 0); in fuse_read()
614 fuse_reply_err(req, -ret); in fuse_read()
627 int64_t length; in fuse_write() local
636 if (!exp->writable) { in fuse_write()
643 * offset+size to the image length. in fuse_write()
645 length = blk_getlength(exp->common.blk); in fuse_write()
646 if (length < 0) { in fuse_write()
647 fuse_reply_err(req, -length); in fuse_write()
651 if (offset + size > length) { in fuse_write()
652 if (exp->growable) { in fuse_write()
655 fuse_reply_err(req, -ret); in fuse_write()
659 size = length - offset; in fuse_write()
663 ret = blk_pwrite(exp->common.blk, offset, size, buf, 0); in fuse_write()
667 fuse_reply_err(req, -ret); in fuse_write()
675 off_t offset, off_t length, in fuse_fallocate() argument
682 if (!exp->writable) { in fuse_fallocate()
687 blk_len = blk_getlength(exp->common.blk); in fuse_fallocate()
689 fuse_reply_err(req, -blk_len); in fuse_fallocate()
695 length = MIN(length, blk_len - offset); in fuse_fallocate()
710 fuse_reply_err(req, -ret); in fuse_fallocate()
715 ret = fuse_do_truncate(exp, offset + length, true, in fuse_fallocate()
726 int size = MIN(length, BDRV_REQUEST_MAX_BYTES); in fuse_fallocate()
728 ret = blk_pwrite_zeroes(exp->common.blk, offset, size, in fuse_fallocate()
730 if (ret == -ENOTSUP) { in fuse_fallocate()
735 ret = -EOPNOTSUPP; in fuse_fallocate()
739 length -= size; in fuse_fallocate()
740 } while (ret == 0 && length > 0); in fuse_fallocate()
745 if (!(mode & FALLOC_FL_KEEP_SIZE) && offset + length > blk_len) { in fuse_fallocate()
747 ret = fuse_do_truncate(exp, offset + length, false, in fuse_fallocate()
750 fuse_reply_err(req, -ret); in fuse_fallocate()
756 int size = MIN(length, BDRV_REQUEST_MAX_BYTES); in fuse_fallocate()
758 ret = blk_pwrite_zeroes(exp->common.blk, in fuse_fallocate()
761 length -= size; in fuse_fallocate()
762 } while (ret == 0 && length > 0); in fuse_fallocate()
766 ret = -EOPNOTSUPP; in fuse_fallocate()
769 fuse_reply_err(req, ret < 0 ? -ret : 0); in fuse_fallocate()
781 ret = blk_flush(exp->common.blk); in fuse_fsync()
782 fuse_reply_err(req, ret < 0 ? -ret : 0); in fuse_fsync()
787 * notes this to be a way to return last-minute errors.)
813 ret = bdrv_block_status_above(blk_bs(exp->common.blk), NULL, in fuse_lseek()
816 fuse_reply_err(req, -ret); in fuse_lseek()
825 * export length will be rounded, too. However, in fuse_lseek()
829 * and @blk_len (the client-visible EOF). in fuse_lseek()
832 blk_len = blk_getlength(exp->common.blk); in fuse_lseek()
834 fuse_reply_err(req, -blk_len); in fuse_lseek()