* Apply obtained attributes for the 1st case, wipe out the on-disk SOM
* cache otherwise.
*/
-int mdt_som_au_close(struct mdt_thread_info *info, struct mdt_object *o)
+static int mdt_som_au_close(struct mdt_thread_info *info, struct mdt_object *o)
{
struct ptlrpc_request *req = mdt_info_req(info);
__u64 ioepoch = 0;
/**
* prep ma_lmm/ma_lmv for md_attr from reply
*/
-void mdt_prep_ma_buf_from_rep(struct mdt_thread_info *info,
- struct mdt_object *obj,
- struct md_attr *ma)
+static void mdt_prep_ma_buf_from_rep(struct mdt_thread_info *info,
+ struct mdt_object *obj,
+ struct md_attr *ma)
{
LASSERT(ma->ma_lmv == NULL && ma->ma_lmm == NULL);
if (S_ISDIR(obj->mot_header.loh_attr)) {
rc = mo_open(info->mti_env, mdt_object_child(o),
created ? flags | MDS_OPEN_CREATED : flags);
- if (rc)
- GOTO(err_out, rc);
+ if (rc != 0) {
+ /* If we allow the client to chgrp (CFS_SETGRP_PERM), but the
+ * client does not know which suppgid should be sent to the MDS,
+ * or some other(s) changed the target file's GID after this RPC
+ * sent to the MDS with the suppgid as the original GID, then we
+ * give the client another chance to send the right suppgid. */
+ if (rc == -EACCES &&
+ allow_client_chgrp(info, lu_ucred(info->mti_env)))
+ mdt_set_disposition(info, rep, DISP_OPEN_DENY);
+
+ GOTO(err_out, rc);
+ }
mfd = mdt_mfd_new(med);
if (mfd == NULL)
return rc;
}
-int mdt_finish_open(struct mdt_thread_info *info,
- struct mdt_object *p, struct mdt_object *o,
- __u64 flags, int created, struct ldlm_reply *rep)
+static int mdt_finish_open(struct mdt_thread_info *info,
+ struct mdt_object *p, struct mdt_object *o,
+ __u64 flags, int created, struct ldlm_reply *rep)
{
struct ptlrpc_request *req = mdt_info_req(info);
struct obd_export *exp = req->rq_export;
RETURN(rc);
}
-extern void mdt_req_from_lcd(struct ptlrpc_request *req,
- struct lsd_client_data *lcd);
-
void mdt_reconstruct_open(struct mdt_thread_info *info,
struct mdt_lock_handle *lhc)
{
LASSERT(ergo(rc < 0, lustre_msg_get_transno(req->rq_repmsg) == 0));
}
-int mdt_open_by_fid(struct mdt_thread_info *info, struct ldlm_reply *rep)
+static int mdt_open_by_fid(struct mdt_thread_info *info, struct ldlm_reply *rep)
{
__u64 flags = info->mti_spec.sp_cr_flags;
struct mdt_reint_record *rr = &info->mti_rr;
return true;
}
-int mdt_open_by_fid_lock(struct mdt_thread_info *info, struct ldlm_reply *rep,
- struct mdt_lock_handle *lhc)
+static int mdt_open_by_fid_lock(struct mdt_thread_info *info,
+ struct ldlm_reply *rep,
+ struct mdt_lock_handle *lhc)
{
const struct lu_env *env = info->mti_env;
struct mdt_device *mdt = info->mti_mdt;