aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ceph/dir.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ceph/dir.c')
-rw-r--r--fs/ceph/dir.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c
index d486f2a5a88d..98c71e895e81 100644
--- a/fs/ceph/dir.c
+++ b/fs/ceph/dir.c
@@ -337,16 +337,23 @@ more:
337 ceph_mdsc_put_request(req); 337 ceph_mdsc_put_request(req);
338 return err; 338 return err;
339 } 339 }
340 req->r_inode = inode;
341 ihold(inode);
342 req->r_dentry = dget(file->f_path.dentry);
343 /* hints to request -> mds selection code */ 340 /* hints to request -> mds selection code */
344 req->r_direct_mode = USE_AUTH_MDS; 341 req->r_direct_mode = USE_AUTH_MDS;
345 req->r_direct_hash = ceph_frag_value(frag); 342 req->r_direct_hash = ceph_frag_value(frag);
346 req->r_direct_is_hash = true; 343 req->r_direct_is_hash = true;
347 req->r_path2 = kstrdup(fi->last_name, GFP_NOFS); 344 if (fi->last_name) {
345 req->r_path2 = kstrdup(fi->last_name, GFP_NOFS);
346 if (!req->r_path2) {
347 ceph_mdsc_put_request(req);
348 return -ENOMEM;
349 }
350 }
348 req->r_readdir_offset = fi->next_offset; 351 req->r_readdir_offset = fi->next_offset;
349 req->r_args.readdir.frag = cpu_to_le32(frag); 352 req->r_args.readdir.frag = cpu_to_le32(frag);
353
354 req->r_inode = inode;
355 ihold(inode);
356 req->r_dentry = dget(file->f_path.dentry);
350 err = ceph_mdsc_do_request(mdsc, NULL, req); 357 err = ceph_mdsc_do_request(mdsc, NULL, req);
351 if (err < 0) { 358 if (err < 0) {
352 ceph_mdsc_put_request(req); 359 ceph_mdsc_put_request(req);
@@ -757,10 +764,15 @@ static int ceph_symlink(struct inode *dir, struct dentry *dentry,
757 err = PTR_ERR(req); 764 err = PTR_ERR(req);
758 goto out; 765 goto out;
759 } 766 }
760 req->r_dentry = dget(dentry);
761 req->r_num_caps = 2;
762 req->r_path2 = kstrdup(dest, GFP_NOFS); 767 req->r_path2 = kstrdup(dest, GFP_NOFS);
768 if (!req->r_path2) {
769 err = -ENOMEM;
770 ceph_mdsc_put_request(req);
771 goto out;
772 }
763 req->r_locked_dir = dir; 773 req->r_locked_dir = dir;
774 req->r_dentry = dget(dentry);
775 req->r_num_caps = 2;
764 req->r_dentry_drop = CEPH_CAP_FILE_SHARED; 776 req->r_dentry_drop = CEPH_CAP_FILE_SHARED;
765 req->r_dentry_unless = CEPH_CAP_FILE_EXCL; 777 req->r_dentry_unless = CEPH_CAP_FILE_EXCL;
766 err = ceph_mdsc_do_request(mdsc, dir, req); 778 err = ceph_mdsc_do_request(mdsc, dir, req);