949 Commits

Author SHA1 Message Date
Gleb Chesnokov
45f9f12bb3 iscsi-scst: Remove cm_listen conftest
Remove cm_listen conftest because iscsi-scst doesn't use ib_cm_listen API.
2022-10-27 12:31:00 +03:00
Gleb Chesnokov
4f1003104f iscsi-scst: Fix a typo in SCSTTarget RA
Extraneous space in "status" breaks resource monitoring:

    <action name="status " timeout="10" interval="10" depth="0" />

Fixes: https://github.com/SCST-project/scst/issues/80
2022-09-01 12:42:52 +03:00
Gleb Chesnokov
46ad98f072 scst: Remove else after a break or return
Remove the else because the if statement has a break or return statement.

This patch fixes the following checkpatch warnings:

    WARNING:UNNECESSARY_ELSE: else is not generally useful after a break
    or return.
2022-08-09 19:38:00 +03:00
Gleb Chesnokov
ebae8bd223 scst: Remove unnecessary null check
kmem_cache_destroy() can handle NULL pointer correctly, so there is no need
to check NULL pointer before calling kmem_cache_destroy().

For kernel versions before v4.3 there is a backport of
kmem_cache_destroy() that checks for a null pointer.

This patch fixes the following checkpatch warnings:

    WARNING:NEEDLESS_IF: kmem_cache_destroy(NULL) is safe and this check
    is probably not required
2022-08-09 19:38:00 +03:00
Gleb Chesnokov
1e168e6676 iscsi-scst: Fix spelling mistake in comment
Change 'compability' to 'compatibility'.

This patch fixes the following checkpatch warning:

    WARNING: 'compability' may be misspelled - perhaps 'compatibility'?
2022-08-09 19:38:00 +03:00
Gleb Chesnokov
90485f0c97 iscsi-scst: Fix up the error handling to avoid crash
This patch should fix the following bug:

iscsi-scst: ***ERROR***: Sending data failed: initiator ..., write_size 0, write_state 1, res 0
iscsi-scst: ***CRITICAL ERROR***: 0 6 31
 ------------[ cut here ]------------
kernel BUG at /usr/src/packages/BUILD/scst-3.7.0.8695/iscsi-scst/kernel/nthread.c:1517!
invalid opcode: 0000 [#1] SMP NOPTI
CPU: 12 PID: 997595 Comm: iscsiwr0_14 ...
...
RIP: 0010:iscsi_send+0x877/0x8b0 [iscsi_scst]
Call Trace:
 istwr+0x123/0x3b0 [iscsi_scst]
 kthread+0x120/0x136
 ret_from_fork+0x24/0x36
 -------------------------------------

What happens:

 - istwr() calls scst_do_job_wr().

 - scst_do_job_wr() calls iscsi_send().

 - iscsi_send() sets the 'res' variable to 0 during error
   in one of three possible places:
   iscsi_do_send(), tx_padding(), tx_ddigest().

 - All of these functions call exit_tx() which sets conn->write_state to TX_END.

 - After iscsi_send() has completed for the current iteration, the next time
   it processes iscsi_conn with conn->write_state == TX_END,
   which will call BUG() in the switch default case.

Therefore, remove the res == 0 check in iscsi_send() to handle TX_END state.

Fixes: https://github.com/SCST-project/scst/issues/12
2022-06-28 18:46:30 +03:00
Gleb Chesnokov
276aeeb211 iscsi-scst: Make exit_tx() return void
exit_tx() doesn't change the return variable res, so make it return
void.

This patch doesn't change any functionality.
2022-06-28 18:46:30 +03:00
Gleb Chesnokov
33861d0a6d iscsi-scst: Suppress a Coverity taint complaint
Suppress the following (false positive) Coverity complaint:

    CID 271578 (#1 of 1): Dereference after null check (FORWARD_NULL)
    var_deref_model: Passing null pointer (*ref_cmd).scst_cmd to
    scst_set_delivery_status, which dereferences it

(*ref_cmd).scst_aen is set when (*ref_cmd).scst_state == ISCSI_CMD_STATE_AEN
and vice versa, so the Coverity complaint is a false positive. Hence rewrite
the code to suppress this complaint and make the code cleaner.
2022-06-27 14:14:52 +03:00
Gleb Chesnokov
828940842a iscsi-scst/usr/iscsi_adm.c: Fix use of uninitialized struct field
This patch fixes the following Coverity complaint:

    CID 271601 (#1 of 1): Uninitialized scalar variable (UNINIT)
    uninit_use_in_call: Using uninitialized value req.
    Field req.cid is uninitialized when calling iscsid_request.
2022-06-27 14:14:52 +03:00
Gleb Chesnokov
d9442eaa18 iscsi-scst: Fix use of uninitialized struct field
This patch fixes the following Coverity complaint:

    CID 271606 (#1 of 1): Uninitialized scalar variable (UNINIT)
    uninit_use_in_call: Using uninitialized value event.
    Field event.target_name is uninitialized when calling __event_send.
2022-06-27 14:14:52 +03:00
Gleb Chesnokov
5e9f44d7ce iscsi-scst: Port to Linux kernel v5.18 2022-04-03 14:44:17 +03:00
Gleb Chesnokov
a1ded333e8 scst: Replace zero-length arrays with flexible-array members
There is a regular need in the kernel to provide a way to declare
having a dynamically sized set of trailing elements in a structure.
Kernel code should always use “flexible array members”[1] for these
cases. The older style of one-element or zero-length arrays should
no longer be used[2].

This code was transformed with the help of Coccinelle:
($ spatch --jobs $(getconf _NPROCESSORS_ONLN) --sp-file script.cocci --include-headers --dir . > output.patch)

@@
identifier S, member, array;
type T1, T2;
@@

struct S {
  ...
  T1 member;
  T2 array[
- 0
  ];
};

[1] https://en.wikipedia.org/wiki/Flexible_array_member
[2] https://www.kernel.org/doc/html/v5.16/process/deprecated.html#zero-length-and-one-element-arrays

Link: https://github.com/KSPP/linux/issues/78
2022-04-03 14:44:17 +03:00
Gleb Chesnokov
84f48fe6a6 iscsi-scstd: Allow to specify multiple addresses the server should listen on
Add the opportunity to globally specify multiple addresses, which
iSCSI/iSER portal will listen on.

There is a way to specify the addresses for a target, on which
portals it will be available, using the allowed_portal parameter.

There is also a way to set this globally via the iscsi-scstd
--address parameter. The problem is that the last option allows
you to specify only one local address. So extend this functionality
to specify more then one address.

Also increase the maximum number of listening addresses to 32.

Signed-off-by: Aleksandr Dyadyushkin <alextalker@ya.ru>
2022-03-01 19:54:53 +03:00
Chesnokov Gleb
41943ed156 iscsi-scst: Remove support for kernel versions before 3.10
The SCST has dropped support for kernels older than 3.10.0 (RHEL 7 / Centos 7) since SCST v3.6.
2022-01-13 17:26:37 +03:00
Chesnokov Gleb
64a8485fe7 Bump the version number to 3.7.0-pre
These changes have been generated by running the following command:

$ scripts/update-version 3 7 0-pre
2022-01-11 16:37:34 +03:00
Bart Van Assche
9c5406664a Bump the version number to 3.6.0
These changes have been generated by running the following command:

$ scripts/update-version 3 6 0
2021-12-29 19:19:14 -08:00
Chesnokov Gleb
50d607a336 isert-scst: Enable copying to user space from isert_cmnd_cache
This patch fixes warning with call trace that occurs during
copy_to_user() from isert_read():

usercopy: Kernel memory exposure attempt detected from SLUB object 'sgv-clust-64K' (offset 200, size 48)!
------------[ cut here ]------------
kernel BUG at mm/usercopy.c:99!
...
RIP: 0010:usercopy_abort+0x7b/0x7d
Call Trace:
 __check_heap_object+0xdf/0x110
 __check_object_size.part.0+0x128/0x150
 __check_object_size+0x1c/0x20
 isert_read+0x10b/0x380 [isert_scst]
 ? security_file_permission+0x96/0x160
 vfs_read+0x9f/0x190
 ksys_read+0x67/0xe0
 __x64_sys_read+0x19/0x20
 do_syscall_64+0x61/0xb0
 ? __x64_sys_sendto+0x24/0x30
 ? do_syscall_64+0x6e/0xb0
 ? exit_to_user_mode_prepare+0x37/0xb0
 ? syscall_exit_to_user_mode+0x27/0x50
 ? do_syscall_64+0x6e/0xb0
 ? asm_exc_page_fault+0x8/0x30
 entry_SYSCALL_64_after_hwframe+0x44/0xae

Signed-off-by: Morozov Ilia <morozov.i@raidix.com>
2021-12-16 00:43:44 +03:00
Bart Van Assche
573e4f21f3 isert-scst: Enclose complex values in parentheses
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9574 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2021-09-08 02:47:22 +00:00
Bart Van Assche
3a1763bc73 isert-scst: Fix typo in the PRINT_INFO statement for sockaddr output
Fixes: 5d808c54 ("isert-scst: Introduce the function isert_setup_id()")
Signed-off-by: Chesnokov Gleb <Chesnokov.G@raidix.com>


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9497 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2021-08-31 02:00:40 +00:00
Bart Van Assche
d6a342b373 isert-scst: Call isert_portal_list_add() after portal initialization
This patch fixes the following hang:

SysRq : Show Blocked State
  task                        PC stack   pid father
iscsi-scstd   D 0000000000000007     0  7981      1 0x00000084
 ffff88007ad87ae8 0000000000000046 0000000000000000 0000000000000010
 0000000000000246 ffff88007ad87a48 0000002483e71851 0000000000000246
 00000000fffdd081 0000000000000c83 ffff880078e8b068 ffff88007ad87fd8
Call Trace:
 [<ffffffffa050667d>] isert_wait_for_portal_release+0x6d/0xc0 [isert_scst]
 [<ffffffffa04fd5cd>] isert_close_all_portals+0x3d/0x50 [isert_scst]
 [<ffffffffa04deeca>] target_del_all+0x9a/0x2b0 [iscsi_scst]
 [<ffffffffa04d7688>] iscsi_release+0x48/0xe0 [iscsi_scst]
 [<ffffffff811a46c8>] __fput+0xf8/0x220
 [<ffffffff811a4815>] fput+0x25/0x30
 [<ffffffff8119f8d0>] filp_close+0x60/0x90
 [<ffffffff81084ccf>] put_files_struct+0x7f/0xf0
 [<ffffffff81084d93>] exit_files+0x53/0x70
 [<ffffffff81086ecd>] do_exit+0x18d/0x860
 [<ffffffff810875f8>] do_group_exit+0x58/0xd0
 [<ffffffff8109d576>] get_signal_to_deliver+0x1f6/0x470
 [<ffffffff8100a375>] do_signal+0x75/0x8d0
 [<ffffffff8100ac60>] do_notify_resume+0x90/0xc0
 [<ffffffff8156672f>] int_signal+0x12/0x17

Fixes: 5d808c54 ("isert-scst: Introduce the function isert_setup_id()")
Signed-off-by: Chesnokov Gleb <Chesnokov.G@raidix.com>
[ bvanassche: added call stack ]


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9487 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2021-07-13 14:03:15 +00:00
Bart Van Assche
53559bae31 isert-scst: Move a statement that reports an error message
Move PRINT_ERROR to the body of RDMA_CM_EVENT_CONNECT_REQUET because only
it can return an error and not log information about it.

Signed-off-by: Chesnokov Gleb <Chesnokov.G@raidix.com>
[bvanassche: modified patch title]


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9486 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2021-07-13 04:52:18 +00:00
Bart Van Assche
6abef3d29c isert-scst: Fix handling of RDMA_CV_EVENT_ADDR_CHANGE
During processing RDMA_CM_EVENT_ADDR_CHANGE event rdma_bind_addr in isert_setup_id function from isert_cm_evt_listener_handler returns error -98 [EADDRINUSE].
In principle, it is logical, because at that time the socket address was still bound to the old cma_id which will be destroyed via rdma_destroy_id only after processing the RDMA_CM_EVENT_ADDR_CHANGE event.

Move the creation of the cma_id in workqueue context and delete old cma_id directly, not through returning the error code to the upper level.

Signed-off-by: Chesnokov Gleb <Chesnokov.G@raidix.com>


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9484 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2021-07-12 03:12:48 +00:00
Bart Van Assche
7517bd6b22 isert-scst: Add support for handling RDMA_CV_EVENT_ADDR_CHANGE
Re-create the portal RDMA CM ID if the address of that port changes.

Signed-off-by: Chesnokov Gleb <Chesnokov.G@raidix.com>
[ bvanassche: edited patch description ]


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9483 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2021-07-12 03:11:18 +00:00
Bart Van Assche
c67a1535dc isert-scst: Remove isert_portal_listen()
Remove this function since it is no longer used.

Signed-off-by: Chesnokov Gleb <Chesnokov.G@raidix.com>
[ bvanassche: edited patch description ]


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9482 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2021-07-12 03:09:07 +00:00
Bart Van Assche
5d808c5432 isert-scst: Introduce the function isert_setup_id()
Introduce the function isert_setup_id(). This function creates and sets up
an RDMA CM ID. Move the isert_portal_listen() call into isert_portal_create().

Signed-off-by: Chesnokov Gleb <Chesnokov.G@raidix.com>
[ bvanassche: edited patch description and dropped support for older kernel
  versions in the PRINT_INFO() statement ]


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9481 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2021-07-12 03:06:25 +00:00
Bart Van Assche
6cfbb697fd isert-scst: Properly release resources on DEVICE_REMOVAL
When the low level driver exercises the hot unplug they would call
rdma_cm cma_remove_one which would fire DEVICE_REMOVAL event to all cma
consumers. Now, if consumer doesn't make sure they destroy all IB
objects created on that IB device instance prior to finalizing all
processing of DEVICE_REMOVAL callback, rdma_cm will let the lld to
de-register with IB core and destroy the IB device instance. And if the
consumer calls (say) ib_dereg_mr(), it will crash since that dev object
is NULL.

In the current implementation, iser-target just initiates the cleanup
and returns from DEVICE_REMOVAL callback. This deferred work creates a
race between iser-target cleaning IB objects(say MR) and lld destroying
IB device instance.

This patch includes the following fixes
  -> make sure that consumer frees all IB objects associated with device
     instance
  -> return non-zero from the callback to destroy the rdma_cm id

Signed-off-by: Raju Rangoju <rajur@chelsio.com>
Acked-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Doug Ledford <dledford@redhat.com>

See also upstream commit 63b268d232b8 ("IB/isert: Properly release
resources on DEVICE_REMOVAL")

Signed-off-by: Chesnokov Gleb <Chesnokov.G@raidix.com>
[ bvanassche: edited patch description and moved a break statement into a code
  block ]


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9480 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2021-07-12 02:41:47 +00:00
Bart Van Assche
4ab077523a isert-scst: Rename multiple functions and one structure member
Minimize the diffs with the upstream code base by performing the following
renames:
isert_conn_free()         --> isert_put_conn()
isert_conn_free_do_work() --> isert_release_work()
isert_kref_free()         --> isert_release_kref()
isert_conn->free_work     --> isert_conn->release_work

Signed-off-by: Chesnokov Gleb <Chesnokov.G@raidix.com>
[ bvanassche: edited patch description ]


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9479 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2021-07-12 02:36:36 +00:00
Bart Van Assche
5aac2b4602 isert-scst: Introduce isert_conn_init()
Minimize the diffs with the upstream code base by introducing the function
isert_conn_init().

Signed-off-by: Chesnokov Gleb <Chesnokov.G@raidix.com>
[ bvanassche: edited patch description ]


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9478 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2021-07-12 02:21:59 +00:00
Bart Van Assche
5af1ed474b isert-scst: Rename struct isert_connection into struct isert_conn
Minimize the diffs with upstream.

Signed-off-by: Chesnokov Gleb <Chesnokov.G@raidix.com>


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9477 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2021-07-12 02:20:32 +00:00
Bart Van Assche
1a329a7a8c isert-scst: Fix the CentOS 7 build
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9476 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2021-07-09 04:33:13 +00:00
Bart Van Assche
f4208c44be isert-scst: Use rdma_event_msg() if it is available
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9475 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2021-07-09 04:01:11 +00:00
Bart Van Assche
8019c8cd3d isert-scst: Simplify the code that reports that a connection has been accepted
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9474 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2021-07-09 03:30:28 +00:00
Bart Van Assche
5b4f387943 isert-scst: Minimize diffs with upstream
Move the isert_cm_disconnect_handler() definition, pass the event type to
isert_cm_evt_listener_handler() instead of the struct rdma_cm_event pointer
and change the return value of isert_cm_evt_listener_handler() from 0 /
-EINVAL into -1.

Signed-off-by: Chesnokov Gleb <Chesnokov.G@raidix.com>
[ bvanassche: made the patch description more detailed ]


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9473 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2021-07-09 03:15:30 +00:00
Bart Van Assche
af9504a0f5 iscsi-scst/usr/Makefile: Use -Werror when testing a compiler option
This is necessary for clang.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9430 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2021-05-29 01:16:42 +00:00
Bart Van Assche
c5e515b702 Address checkpatch complaints about duplicated words
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9383 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2021-04-29 03:15:01 +00:00
Bart Van Assche
095d255719 iscsi-scst: Fix a kernel-doc header
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9379 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2021-04-14 20:29:52 +00:00
Bart Van Assche
c0151f6cda Bump the version number to 3.6.0
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9310 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2021-01-02 23:16:59 +00:00
Bart Van Assche
d3c92ea7aa Bump the version number to 3.5.0
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9231 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2020-12-22 03:38:21 +00:00
Bart Van Assche
d10a7bf5d5 Restore support for building with clang
The previous commit removed support for building with clang. Restore support
for building with clang without breaking cross-compilation support.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9209 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2020-12-05 21:23:17 +00:00
Bart Van Assche
8eb850acce Revert "Make it possible to build SCST with clang"
Since commit ecea60a694 breaks cross-compilation, revert it.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9208 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2020-12-05 18:39:38 +00:00
Bart Van Assche
a673470ce3 scst, iscsi-scst: Use struct kvec instead of struct iovec for kernel data
This patch does not change any functionality but removes multiple __force
__user casts.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9197 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2020-11-27 03:45:16 +00:00
Bart Van Assche
fd5b318880 iscsi-scst: Port to Linux kernel v5.10
mm_segment_t, get_fs() and set_fs() have been removed from Linux kernel
v5.10. Instead of adding more #ifdef / #endif directives, provide backports
for this typedef and these functions in iscsi_scst.h.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9189 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2020-11-23 15:58:00 +00:00
Bart Van Assche
a4ea5c02e1 iscsi-scst: Fix SHA-1 algorithm number
According to
https://www.iana.org/assignments/ppp-numbers/ppp-numbers.xml#ppp-numbers-9
the value of the SHA-1 algorithm is 6 and not 7, as it is now in
iscsi-scst/usr/chap.c. If on a client side node.session.auth.chap_algs is
SHA1, login fails.

Signed-off-by: Lev Vainblat <lev@zadarastorage.com>


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9171 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2020-10-14 02:15:33 +00:00
Bart Van Assche
59f38038ab iscsi-scst: Remove an obsolete comment
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9168 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2020-09-19 17:01:31 +00:00
Bart Van Assche
186798cec4 Use the fallthrough macro instead of a comment
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9166 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2020-09-16 14:28:36 +00:00
Bart Van Assche
bd3aa5d4a5 iscsi-scst: Port to Linux kernel v5.9
In Linux kernel v5.9 use of the KERNEL_SOCKPTR() function is mandatory
when calling setsockopt(). Implement that function for kernels before v5.9.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9149 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2020-08-29 21:16:47 +00:00
Bart Van Assche
f872ffa8a9 iscsi-scst/kernel/isert-scst/Kbuild: Fix the isert-scst build
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9140 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2020-08-29 15:52:09 +00:00
Bart Van Assche
c22a2d11b1 iscsi-scst: Fix the CONFIG_IPV6=n build
See also https://github.com/bvanassche/scst/issues/23.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9095 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2020-08-02 22:54:39 +00:00
Bart Van Assche
1b5e2eb482 isert-scst: Fail login if max_sge is too small
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9090 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2020-08-02 21:21:38 +00:00
Bart Van Assche
ecea60a694 Make it possible to build SCST with clang
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9089 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2020-08-02 21:19:24 +00:00