|
@@ -337,16 +337,23 @@ more:
|
|
|
ceph_mdsc_put_request(req);
|
|
|
return err;
|
|
|
}
|
|
|
- req->r_inode = inode;
|
|
|
- ihold(inode);
|
|
|
- req->r_dentry = dget(file->f_path.dentry);
|
|
|
/* hints to request -> mds selection code */
|
|
|
req->r_direct_mode = USE_AUTH_MDS;
|
|
|
req->r_direct_hash = ceph_frag_value(frag);
|
|
|
req->r_direct_is_hash = true;
|
|
|
- req->r_path2 = kstrdup(fi->last_name, GFP_NOFS);
|
|
|
+ if (fi->last_name) {
|
|
|
+ req->r_path2 = kstrdup(fi->last_name, GFP_NOFS);
|
|
|
+ if (!req->r_path2) {
|
|
|
+ ceph_mdsc_put_request(req);
|
|
|
+ return -ENOMEM;
|
|
|
+ }
|
|
|
+ }
|
|
|
req->r_readdir_offset = fi->next_offset;
|
|
|
req->r_args.readdir.frag = cpu_to_le32(frag);
|
|
|
+
|
|
|
+ req->r_inode = inode;
|
|
|
+ ihold(inode);
|
|
|
+ req->r_dentry = dget(file->f_path.dentry);
|
|
|
err = ceph_mdsc_do_request(mdsc, NULL, req);
|
|
|
if (err < 0) {
|
|
|
ceph_mdsc_put_request(req);
|
|
@@ -757,10 +764,15 @@ static int ceph_symlink(struct inode *dir, struct dentry *dentry,
|
|
|
err = PTR_ERR(req);
|
|
|
goto out;
|
|
|
}
|
|
|
- req->r_dentry = dget(dentry);
|
|
|
- req->r_num_caps = 2;
|
|
|
req->r_path2 = kstrdup(dest, GFP_NOFS);
|
|
|
+ if (!req->r_path2) {
|
|
|
+ err = -ENOMEM;
|
|
|
+ ceph_mdsc_put_request(req);
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
req->r_locked_dir = dir;
|
|
|
+ req->r_dentry = dget(dentry);
|
|
|
+ req->r_num_caps = 2;
|
|
|
req->r_dentry_drop = CEPH_CAP_FILE_SHARED;
|
|
|
req->r_dentry_unless = CEPH_CAP_FILE_EXCL;
|
|
|
err = ceph_mdsc_do_request(mdsc, dir, req);
|