Whamcloud - gitweb
LU-13983 llite: rmdir releases inode on client
[fs/lustre-release.git] / lustre / llite / namei.c
index b84dfd7..4d0babd 100644 (file)
@@ -1692,13 +1692,25 @@ static int ll_rmdir(struct inode *dir, struct dentry *dchild)
        op_data->op_fid2 = op_data->op_fid3;
        rc = md_unlink(ll_i2sbi(dir)->ll_md_exp, op_data, &request);
        ll_finish_md_op_data(op_data);
-       if (!rc)
-               ll_update_times(request, dir);
+       if (!rc) {
+               struct mdt_body *body;
 
-       ptlrpc_req_finished(request);
-       if (!rc)
+               ll_update_times(request, dir);
                ll_stats_ops_tally(ll_i2sbi(dir), LPROC_LL_RMDIR,
                                   ktime_us_delta(ktime_get(), kstart));
+
+               /*
+                * The server puts attributes in on the last unlink, use them
+                * to update the link count so the inode can be freed
+                * immediately.
+                */
+               body = req_capsule_server_get(&request->rq_pill, &RMF_MDT_BODY);
+               if (body->mbo_valid & OBD_MD_FLNLINK)
+                       set_nlink(dchild->d_inode, body->mbo_nlink);
+       }
+
+       ptlrpc_req_finished(request);
+
        RETURN(rc);
 }