diff options
Diffstat (limited to 'fs/ceph/mds_client.c')
-rw-r--r-- | fs/ceph/mds_client.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index 3ab79f6c4ce8..23332bc44515 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c | |||
@@ -1580,6 +1580,27 @@ static int __prepare_send_request(struct ceph_mds_client *mdsc, | |||
1580 | dout("prepare_send_request %p tid %lld %s (attempt %d)\n", req, | 1580 | dout("prepare_send_request %p tid %lld %s (attempt %d)\n", req, |
1581 | req->r_tid, ceph_mds_op_name(req->r_op), req->r_attempts); | 1581 | req->r_tid, ceph_mds_op_name(req->r_op), req->r_attempts); |
1582 | 1582 | ||
1583 | if (req->r_got_unsafe) { | ||
1584 | /* | ||
1585 | * Replay. Do not regenerate message (and rebuild | ||
1586 | * paths, etc.); just use the original message. | ||
1587 | * Rebuilding paths will break for renames because | ||
1588 | * d_move mangles the src name. | ||
1589 | */ | ||
1590 | msg = req->r_request; | ||
1591 | rhead = msg->front.iov_base; | ||
1592 | |||
1593 | flags = le32_to_cpu(rhead->flags); | ||
1594 | flags |= CEPH_MDS_FLAG_REPLAY; | ||
1595 | rhead->flags = cpu_to_le32(flags); | ||
1596 | |||
1597 | if (req->r_target_inode) | ||
1598 | rhead->ino = cpu_to_le64(ceph_ino(req->r_target_inode)); | ||
1599 | |||
1600 | rhead->num_retry = req->r_attempts - 1; | ||
1601 | return 0; | ||
1602 | } | ||
1603 | |||
1583 | if (req->r_request) { | 1604 | if (req->r_request) { |
1584 | ceph_msg_put(req->r_request); | 1605 | ceph_msg_put(req->r_request); |
1585 | req->r_request = NULL; | 1606 | req->r_request = NULL; |
@@ -1601,13 +1622,9 @@ static int __prepare_send_request(struct ceph_mds_client *mdsc, | |||
1601 | rhead->flags = cpu_to_le32(flags); | 1622 | rhead->flags = cpu_to_le32(flags); |
1602 | rhead->num_fwd = req->r_num_fwd; | 1623 | rhead->num_fwd = req->r_num_fwd; |
1603 | rhead->num_retry = req->r_attempts - 1; | 1624 | rhead->num_retry = req->r_attempts - 1; |
1625 | rhead->ino = 0; | ||
1604 | 1626 | ||
1605 | dout(" r_locked_dir = %p\n", req->r_locked_dir); | 1627 | dout(" r_locked_dir = %p\n", req->r_locked_dir); |
1606 | |||
1607 | if (req->r_target_inode && req->r_got_unsafe) | ||
1608 | rhead->ino = cpu_to_le64(ceph_ino(req->r_target_inode)); | ||
1609 | else | ||
1610 | rhead->ino = 0; | ||
1611 | return 0; | 1628 | return 0; |
1612 | } | 1629 | } |
1613 | 1630 | ||