#include <linux/kthread.h>
#include "ofd_internal.h"
+#include <lustre_nodemap.h>
struct ofd_inconsistency_item {
struct list_head oii_list;
struct niobuf_remote *rnb, int *nr_local,
struct niobuf_local *lnb, char *jobid)
{
- struct ofd_object *fo;
- int i, j, rc, tot_bytes = 0;
+ struct ofd_object *fo;
+ int i, j, rc, tot_bytes = 0;
+ enum dt_bufs_type dbt = DT_BUFS_TYPE_READ;
ENTRY;
LASSERT(env != NULL);
GOTO(unlock, rc);
}
- *nr_local = 0;
- for (i = 0, j = 0; i < niocount; i++) {
+ if (ptlrpc_connection_is_local(exp->exp_connection))
+ dbt |= DT_BUFS_TYPE_LOCAL;
+
+ for (*nr_local = 0, i = 0, j = 0; i < niocount; i++) {
rc = dt_bufs_get(env, ofd_object_child(fo), rnb + i,
- lnb + j, 0);
+ lnb + j, dbt);
if (unlikely(rc < 0))
GOTO(buf_put, rc);
LASSERT(rc <= PTLRPC_MAX_BRW_PAGES);
struct niobuf_remote *rnb, int *nr_local,
struct niobuf_local *lnb, char *jobid)
{
- struct ofd_object *fo;
- int i, j, k, rc = 0, tot_bytes = 0;
+ struct ofd_object *fo;
+ int i, j, k, rc = 0, tot_bytes = 0;
+ enum dt_bufs_type dbt = DT_BUFS_TYPE_WRITE;
ENTRY;
LASSERT(env != NULL);
/* Process incoming grant info, set OBD_BRW_GRANTED flag and grant some
* space back if possible */
- ofd_grant_prepare_write(env, exp, oa, rnb, obj->ioo_bufcnt);
+ tgt_grant_prepare_write(env, exp, oa, rnb, obj->ioo_bufcnt);
+
+ if (ptlrpc_connection_is_local(exp->exp_connection))
+ dbt |= DT_BUFS_TYPE_LOCAL;
/* parse remote buffers to local buffers and prepare the latter */
- *nr_local = 0;
- for (i = 0, j = 0; i < obj->ioo_bufcnt; i++) {
+ for (*nr_local = 0, i = 0, j = 0; i < obj->ioo_bufcnt; i++) {
rc = dt_bufs_get(env, ofd_object_child(fo),
- rnb + i, lnb + j, 1);
+ rnb + i, lnb + j, dbt);
if (unlikely(rc < 0))
GOTO(err, rc);
LASSERT(rc <= PTLRPC_MAX_BRW_PAGES);
dt_bufs_put(env, ofd_object_child(fo), lnb, *nr_local);
ofd_read_unlock(env, fo);
ofd_object_put(env, fo);
- /* ofd_grant_prepare_write() was called, so we must commit */
- ofd_grant_commit(exp, oa->o_grant_used, rc);
+ /* tgt_grant_prepare_write() was called, so we must commit */
+ tgt_grant_commit(exp, oa->o_grant_used, rc);
out:
/* let's still process incoming grant information packed in the oa,
* but without enforcing grant since we won't proceed with the write.
* Just like a read request actually. */
- ofd_grant_prepare_read(env, exp, oa);
+ tgt_grant_prepare_read(env, exp, oa);
return rc;
}
rc = ofd_preprw_write(env, exp, ofd, fid, &info->fti_attr, oa,
objcount, obj, rnb, nr_local, lnb, jobid);
} else if (cmd == OBD_BRW_READ) {
- ofd_grant_prepare_read(env, exp, oa);
+ tgt_grant_prepare_read(env, exp, oa);
rc = ofd_preprw_read(env, exp, ofd, fid, &info->fti_attr, oa,
obj->ioo_bufcnt, rnb, nr_local, lnb,
jobid);
if (rc)
GOTO(out_tx, rc);
- /* set uid/gid/pid */
+ /* set uid/gid/projid */
if (la->la_valid) {
rc = dt_attr_set(env, dt_obj, la, th);
if (rc)
}
if (rc == 0 && granted > 0) {
- if (ofd_grant_commit_cb_add(th, exp, granted) == 0)
+ if (tgt_grant_commit_cb_add(th, exp, granted) == 0)
granted = 0;
}
/* second put is pair to object_get in ofd_preprw_write */
ofd_object_put(env, fo);
if (granted > 0)
- ofd_grant_commit(exp, granted, old_rc);
+ tgt_grant_commit(exp, granted, old_rc);
RETURN(rc);
}
LASSERT(npages > 0);
if (cmd == OBD_BRW_WRITE) {
+ struct lu_nodemap *nodemap;
+
/* Don't update timestamps if this write is older than a
* setattr which modifies the timestamps. b=10150 */
oa->o_valid |= OBD_MD_FLFLAGS;
oa->o_valid |= OBD_MD_FLALLQUOTA;
}
+
+ /* Convert back to client IDs. LU-9671.
+ * nodemap_get_from_exp() may fail due to nodemap deactivated,
+ * server ID will be returned back to client in that case. */
+ nodemap = nodemap_get_from_exp(exp);
+ if (nodemap != NULL && !IS_ERR(nodemap)) {
+ oa->o_uid = nodemap_map_id(nodemap, NODEMAP_UID,
+ NODEMAP_FS_TO_CLIENT,
+ oa->o_uid);
+ oa->o_gid = nodemap_map_id(nodemap, NODEMAP_GID,
+ NODEMAP_FS_TO_CLIENT,
+ oa->o_gid);
+ nodemap_putref(nodemap);
+ }
} else if (cmd == OBD_BRW_READ) {
struct ldlm_namespace *ns = ofd->ofd_namespace;