ceph: send LSSNAP request to auth mds of directory inode
Snapdir inode has no capability. __choose_mds() should choose mds base on capabilities of snapdir's parent inode. Signed-off-by: "Yan, Zheng" <zyan@redhat.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
This commit is contained in:
parent
8d45b911a9
commit
5d37ca1480
|
@ -377,8 +377,10 @@ more:
|
|||
}
|
||||
/* hints to request -> mds selection code */
|
||||
req->r_direct_mode = USE_AUTH_MDS;
|
||||
req->r_direct_hash = ceph_frag_value(frag);
|
||||
__set_bit(CEPH_MDS_R_DIRECT_IS_HASH, &req->r_req_flags);
|
||||
if (op == CEPH_MDS_OP_READDIR) {
|
||||
req->r_direct_hash = ceph_frag_value(frag);
|
||||
__set_bit(CEPH_MDS_R_DIRECT_IS_HASH, &req->r_req_flags);
|
||||
}
|
||||
if (fi->last_name) {
|
||||
req->r_path2 = kstrdup(fi->last_name, GFP_KERNEL);
|
||||
if (!req->r_path2) {
|
||||
|
|
|
@ -731,9 +731,16 @@ static int __choose_mds(struct ceph_mds_client *mdsc,
|
|||
|
||||
inode = NULL;
|
||||
if (req->r_inode) {
|
||||
inode = req->r_inode;
|
||||
ihold(inode);
|
||||
} else if (req->r_dentry) {
|
||||
if (ceph_snap(req->r_inode) != CEPH_SNAPDIR) {
|
||||
inode = req->r_inode;
|
||||
ihold(inode);
|
||||
} else {
|
||||
/* req->r_dentry is non-null for LSSNAP request.
|
||||
* fall-thru */
|
||||
WARN_ON_ONCE(!req->r_dentry);
|
||||
}
|
||||
}
|
||||
if (!inode && req->r_dentry) {
|
||||
/* ignore race with rename; old or new d_parent is okay */
|
||||
struct dentry *parent;
|
||||
struct inode *dir;
|
||||
|
|
Loading…
Reference in New Issue