mirror of https://gitee.com/openkylin/linux.git
drbd: attach on connected diskless peer must not shrink a consistent device
If we would reject a new handshake, if the peer had attached first, and then connected, we should force disconnect if the peer first connects, and only then attaches. Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
4ef2a4f43f
commit
ad6e897902
|
@ -4014,12 +4014,13 @@ static int receive_sizes(struct drbd_connection *connection, struct packet_info
|
|||
if (device->state.conn == C_WF_REPORT_PARAMS)
|
||||
p_usize = min_not_zero(my_usize, p_usize);
|
||||
|
||||
/* Never shrink a device with usable data during connect.
|
||||
But allow online shrinking if we are connected. */
|
||||
/* Never shrink a device with usable data during connect,
|
||||
* or "attach" on the peer.
|
||||
* But allow online shrinking if we are connected. */
|
||||
new_size = drbd_new_dev_size(device, device->ldev, p_usize, 0);
|
||||
if (new_size < cur_size &&
|
||||
device->state.disk >= D_OUTDATED &&
|
||||
device->state.conn < C_CONNECTED) {
|
||||
(device->state.conn < C_CONNECTED || device->state.pdsk == D_DISKLESS)) {
|
||||
drbd_err(device, "The peer's disk size is too small! (%llu < %llu sectors)\n",
|
||||
(unsigned long long)new_size, (unsigned long long)cur_size);
|
||||
conn_request_state(peer_device->connection, NS(conn, C_DISCONNECTING), CS_HARD);
|
||||
|
@ -4047,8 +4048,8 @@ static int receive_sizes(struct drbd_connection *connection, struct packet_info
|
|||
synchronize_rcu();
|
||||
kfree(old_disk_conf);
|
||||
|
||||
drbd_info(device, "Peer sets u_size to %lu sectors\n",
|
||||
(unsigned long)my_usize);
|
||||
drbd_info(device, "Peer sets u_size to %lu sectors (old: %lu)\n",
|
||||
(unsigned long)p_usize, (unsigned long)my_usize);
|
||||
}
|
||||
|
||||
put_ldev(device);
|
||||
|
|
Loading…
Reference in New Issue