aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ceph/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ceph/inode.c')
-rw-r--r--fs/ceph/inode.c40
1 files changed, 38 insertions, 2 deletions
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c
index d45895f4a04d..851814d951cd 100644
--- a/fs/ceph/inode.c
+++ b/fs/ceph/inode.c
@@ -1131,8 +1131,8 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req,
1131 req->r_request_started); 1131 req->r_request_started);
1132 dout(" final dn %p\n", dn); 1132 dout(" final dn %p\n", dn);
1133 i++; 1133 i++;
1134 } else if (req->r_op == CEPH_MDS_OP_LOOKUPSNAP || 1134 } else if ((req->r_op == CEPH_MDS_OP_LOOKUPSNAP ||
1135 req->r_op == CEPH_MDS_OP_MKSNAP) { 1135 req->r_op == CEPH_MDS_OP_MKSNAP) && !req->r_aborted) {
1136 struct dentry *dn = req->r_dentry; 1136 struct dentry *dn = req->r_dentry;
1137 1137
1138 /* fill out a snapdir LOOKUPSNAP dentry */ 1138 /* fill out a snapdir LOOKUPSNAP dentry */
@@ -1196,6 +1196,39 @@ done:
1196/* 1196/*
1197 * Prepopulate our cache with readdir results, leases, etc. 1197 * Prepopulate our cache with readdir results, leases, etc.
1198 */ 1198 */
1199static int readdir_prepopulate_inodes_only(struct ceph_mds_request *req,
1200 struct ceph_mds_session *session)
1201{
1202 struct ceph_mds_reply_info_parsed *rinfo = &req->r_reply_info;
1203 int i, err = 0;
1204
1205 for (i = 0; i < rinfo->dir_nr; i++) {
1206 struct ceph_vino vino;
1207 struct inode *in;
1208 int rc;
1209
1210 vino.ino = le64_to_cpu(rinfo->dir_in[i].in->ino);
1211 vino.snap = le64_to_cpu(rinfo->dir_in[i].in->snapid);
1212
1213 in = ceph_get_inode(req->r_dentry->d_sb, vino);
1214 if (IS_ERR(in)) {
1215 err = PTR_ERR(in);
1216 dout("new_inode badness got %d\n", err);
1217 continue;
1218 }
1219 rc = fill_inode(in, &rinfo->dir_in[i], NULL, session,
1220 req->r_request_started, -1,
1221 &req->r_caps_reservation);
1222 if (rc < 0) {
1223 pr_err("fill_inode badness on %p got %d\n", in, rc);
1224 err = rc;
1225 continue;
1226 }
1227 }
1228
1229 return err;
1230}
1231
1199int ceph_readdir_prepopulate(struct ceph_mds_request *req, 1232int ceph_readdir_prepopulate(struct ceph_mds_request *req,
1200 struct ceph_mds_session *session) 1233 struct ceph_mds_session *session)
1201{ 1234{
@@ -1210,6 +1243,9 @@ int ceph_readdir_prepopulate(struct ceph_mds_request *req,
1210 u64 frag = le32_to_cpu(rhead->args.readdir.frag); 1243 u64 frag = le32_to_cpu(rhead->args.readdir.frag);
1211 struct ceph_dentry_info *di; 1244 struct ceph_dentry_info *di;
1212 1245
1246 if (req->r_aborted)
1247 return readdir_prepopulate_inodes_only(req, session);
1248
1213 if (le32_to_cpu(rinfo->head->op) == CEPH_MDS_OP_LSSNAP) { 1249 if (le32_to_cpu(rinfo->head->op) == CEPH_MDS_OP_LSSNAP) {
1214 snapdir = ceph_get_snapdir(parent->d_inode); 1250 snapdir = ceph_get_snapdir(parent->d_inode);
1215 parent = d_find_alias(snapdir); 1251 parent = d_find_alias(snapdir);