Whamcloud - gitweb
git://git.whamcloud.com
/
fs
/
lustre-release.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
| inline |
side by side
LU-3544 fid: do open-by-fid by default
[fs/lustre-release.git]
/
lustre
/
mdc
/
mdc_lib.c
diff --git
a/lustre/mdc/mdc_lib.c
b/lustre/mdc/mdc_lib.c
index
2d8a09d
..
b3a2769
100644
(file)
--- a/
lustre/mdc/mdc_lib.c
+++ b/
lustre/mdc/mdc_lib.c
@@
-58,12
+58,12
@@
static void __mdc_pack_body(struct mdt_body *b, __u32 suppgid)
{
LASSERT (b != NULL);
- b->suppgid = suppgid;
- b->uid = from_kuid(&init_user_ns, current_uid());
- b->gid = from_kgid(&init_user_ns, current_gid());
- b->fsuid = from_kuid(&init_user_ns, current_fsuid());
- b->fsgid = from_kgid(&init_user_ns, current_fsgid());
- b->capability = cfs_curproc_cap_pack();
+ b->
mbo_
suppgid = suppgid;
+ b->
mbo_
uid = from_kuid(&init_user_ns, current_uid());
+ b->
mbo_
gid = from_kgid(&init_user_ns, current_gid());
+ b->
mbo_
fsuid = from_kuid(&init_user_ns, current_fsuid());
+ b->
mbo_
fsgid = from_kgid(&init_user_ns, current_fsgid());
+ b->
mbo_
capability = cfs_curproc_cap_pack();
}
void mdc_pack_capa(struct ptlrpc_request *req, const struct req_msg_field *field,
@@
-83,21
+83,6
@@
void mdc_pack_capa(struct ptlrpc_request *req, const struct req_msg_field *field
DEBUG_CAPA(D_SEC, c, "pack");
}
-void mdc_is_subdir_pack(struct ptlrpc_request *req, const struct lu_fid *pfid,
- const struct lu_fid *cfid, int flags)
-{
- struct mdt_body *b = req_capsule_client_get(&req->rq_pill,
- &RMF_MDT_BODY);
-
- if (pfid) {
- b->fid1 = *pfid;
- b->valid = OBD_MD_FLID;
- }
- if (cfid)
- b->fid2 = *cfid;
- b->flags = flags;
-}
-
void mdc_swap_layouts_pack(struct ptlrpc_request *req,
struct md_op_data *op_data)
{
@@
-105,30
+90,62
@@
void mdc_swap_layouts_pack(struct ptlrpc_request *req,
&RMF_MDT_BODY);
__mdc_pack_body(b, op_data->op_suppgids[0]);
- b->fid1 = op_data->op_fid1;
- b->fid2 = op_data->op_fid2;
- b->valid |= OBD_MD_FLID;
+ b->
mbo_
fid1 = op_data->op_fid1;
+ b->
mbo_
fid2 = op_data->op_fid2;
+ b->
mbo_
valid |= OBD_MD_FLID;
mdc_pack_capa(req, &RMF_CAPA1, op_data->op_capa1);
mdc_pack_capa(req, &RMF_CAPA2, op_data->op_capa2);
}
void mdc_pack_body(struct ptlrpc_request *req,
-
const struct lu_fid *fid, struct obd_capa *oc,
-
__u64 valid, int ea_size, __u32 suppgid, int flags)
+ const struct lu_fid *fid, struct obd_capa *oc,
+ __u64 valid, int ea_size, __u32 suppgid, int flags)
{
- struct mdt_body *b = req_capsule_client_get(&req->rq_pill,
- &RMF_MDT_BODY);
- LASSERT(b != NULL);
- b->valid = valid;
- b->eadatasize = ea_size;
- b->flags = flags;
- __mdc_pack_body(b, suppgid);
- if (fid) {
- b->fid1 = *fid;
- b->valid |= OBD_MD_FLID;
- mdc_pack_capa(req, &RMF_CAPA1, oc);
- }
+ struct mdt_body *b = req_capsule_client_get(&req->rq_pill,
+ &RMF_MDT_BODY);
+ LASSERT(b != NULL);
+ b->mbo_valid = valid;
+ b->mbo_eadatasize = ea_size;
+ b->mbo_flags = flags;
+ __mdc_pack_body(b, suppgid);
+ if (fid) {
+ b->mbo_fid1 = *fid;
+ b->mbo_valid |= OBD_MD_FLID;
+ mdc_pack_capa(req, &RMF_CAPA1, oc);
+ }
+}
+
+/**
+ * Pack a name (path component) into a request
+ *
+ * \param[in] req request
+ * \param[in] field request field (usually RMF_NAME)
+ * \param[in] name path component
+ * \param[in] name_len length of path component
+ *
+ * \a field must be present in \a req and of size \a name_len + 1.
+ *
+ * \a name must be '\0' terminated of length \a name_len and represent
+ * a single path component (not contain '/').
+ */
+static void mdc_pack_name(struct ptlrpc_request *req,
+ const struct req_msg_field *field,
+ const char *name, size_t name_len)
+{
+ char *buf;
+ size_t buf_size;
+ size_t cpy_len;
+
+ buf = req_capsule_client_get(&req->rq_pill, field);
+ buf_size = req_capsule_get_size(&req->rq_pill, field, RCL_CLIENT);
+
+ LASSERT(name != NULL && name_len != 0 &&
+ buf != NULL && buf_size == name_len + 1);
+
+ cpy_len = strlcpy(buf, name, buf_size);
+
+ LASSERT(cpy_len == name_len && lu_name_is_valid_2(buf, cpy_len));
}
void mdc_readdir_pack(struct ptlrpc_request *req, __u64 pgoff,
@@
-136,14
+153,14
@@
void mdc_readdir_pack(struct ptlrpc_request *req, __u64 pgoff,
{
struct mdt_body *b = req_capsule_client_get(&req->rq_pill,
&RMF_MDT_BODY);
-
b->
fid1 = *fid;
-
b->
valid |= OBD_MD_FLID;
-
b->size = pgoff;
/* !! */
-
b->nlink = size;
/* !! */
-
__mdc_pack_body(b, -1);
-
b->
mode = LUDA_FID | LUDA_TYPE;
-
-
mdc_pack_capa(req, &RMF_CAPA1, oc);
+
b->mbo_
fid1 = *fid;
+
b->mbo_
valid |= OBD_MD_FLID;
+
b->mbo_size = pgoff;
/* !! */
+
b->mbo_nlink = size;
/* !! */
+ __mdc_pack_body(b, -1);
+
b->mbo_
mode = LUDA_FID | LUDA_TYPE;
+
+ mdc_pack_capa(req, &RMF_CAPA1, oc);
}
/* packing of MDS records */
@@
-179,9
+196,7
@@
void mdc_create_pack(struct ptlrpc_request *req, struct md_op_data *op_data,
mdc_pack_capa(req, &RMF_CAPA1, op_data->op_capa1);
- tmp = req_capsule_client_get(&req->rq_pill, &RMF_NAME);
- LOGL0(op_data->op_name, op_data->op_namelen, tmp);
-
+ mdc_pack_name(req, &RMF_NAME, op_data->op_name, op_data->op_namelen);
if (data) {
tmp = req_capsule_client_get(&req->rq_pill, &RMF_EADATA);
memcpy(tmp, data, datalen);
@@
-191,10
+206,8
@@
void mdc_create_pack(struct ptlrpc_request *req, struct md_op_data *op_data,
static __u64 mds_pack_open_flags(__u64 flags, __u32 mode)
{
__u64 cr_flags = (flags & (FMODE_READ | FMODE_WRITE |
- MDS_OPEN_HAS_EA | MDS_OPEN_HAS_OBJS |
- MDS_OPEN_OWNEROVERRIDE | MDS_OPEN_LOCK |
- MDS_OPEN_BY_FID | MDS_OPEN_LEASE |
- MDS_OPEN_RELEASE));
+ MDS_OPEN_FL_INTERNAL));
+
if (flags & O_CREAT)
cr_flags |= MDS_OPEN_CREAT;
if (flags & O_EXCL)
@@
-255,8
+268,9
@@
void mdc_open_pack(struct ptlrpc_request *req, struct md_op_data *op_data,
* will be packed from the data in reply message. */
if (op_data->op_name) {
- tmp = req_capsule_client_get(&req->rq_pill, &RMF_NAME);
- LOGL0(op_data->op_name, op_data->op_namelen, tmp);
+ mdc_pack_name(req, &RMF_NAME, op_data->op_name,
+ op_data->op_namelen);
+
if (op_data->op_bias & MDS_CREATE_VOLATILE)
cr_flags |= MDS_OPEN_VOLATILE;
}
@@
-395,7
+409,6
@@
void mdc_setattr_pack(struct ptlrpc_request *req, struct md_op_data *op_data,
void mdc_unlink_pack(struct ptlrpc_request *req, struct md_op_data *op_data)
{
struct mdt_rec_unlink *rec;
- char *tmp;
CLASSERT(sizeof(struct mdt_rec_reint) == sizeof(struct mdt_rec_unlink));
rec = req_capsule_client_get(&req->rq_pill, &RMF_REC_REINT);
@@
-416,15
+429,12
@@
void mdc_unlink_pack(struct ptlrpc_request *req, struct md_op_data *op_data)
mdc_pack_capa(req, &RMF_CAPA1, op_data->op_capa1);
- tmp = req_capsule_client_get(&req->rq_pill, &RMF_NAME);
- LASSERT(tmp != NULL);
- LOGL0(op_data->op_name, op_data->op_namelen, tmp);
+ mdc_pack_name(req, &RMF_NAME, op_data->op_name, op_data->op_namelen);
}
void mdc_link_pack(struct ptlrpc_request *req, struct md_op_data *op_data)
{
struct mdt_rec_link *rec;
- char *tmp;
CLASSERT(sizeof(struct mdt_rec_reint) == sizeof(struct mdt_rec_link));
rec = req_capsule_client_get(&req->rq_pill, &RMF_REC_REINT);
@@
-444,15
+454,13
@@
void mdc_link_pack(struct ptlrpc_request *req, struct md_op_data *op_data)
mdc_pack_capa(req, &RMF_CAPA1, op_data->op_capa1);
mdc_pack_capa(req, &RMF_CAPA2, op_data->op_capa2);
- tmp = req_capsule_client_get(&req->rq_pill, &RMF_NAME);
- LOGL0(op_data->op_name, op_data->op_namelen, tmp);
+ mdc_pack_name(req, &RMF_NAME, op_data->op_name, op_data->op_namelen);
}
void mdc_rename_pack(struct ptlrpc_request *req, struct md_op_data *op_data,
const char *old, int oldlen, const char *new, int newlen)
{
struct mdt_rec_rename *rec;
- char *tmp;
CLASSERT(sizeof(struct mdt_rec_reint) == sizeof(struct mdt_rec_rename));
rec = req_capsule_client_get(&req->rq_pill, &RMF_REC_REINT);
@@
-474,13
+482,10
@@
void mdc_rename_pack(struct ptlrpc_request *req, struct md_op_data *op_data,
mdc_pack_capa(req, &RMF_CAPA1, op_data->op_capa1);
mdc_pack_capa(req, &RMF_CAPA2, op_data->op_capa2);
- tmp = req_capsule_client_get(&req->rq_pill, &RMF_NAME);
- LOGL0(old, oldlen, tmp);
+ mdc_pack_name(req, &RMF_NAME, old, oldlen);
- if (new) {
- tmp = req_capsule_client_get(&req->rq_pill, &RMF_SYMTGT);
- LOGL0(new, newlen, tmp);
- }
+ if (new != NULL)
+ mdc_pack_name(req, &RMF_SYMTGT, new, newlen);
}
void mdc_getattr_pack(struct ptlrpc_request *req, __u64 valid, int flags,
@@
-489,26
+494,24
@@
void mdc_getattr_pack(struct ptlrpc_request *req, __u64 valid, int flags,
struct mdt_body *b = req_capsule_client_get(&req->rq_pill,
&RMF_MDT_BODY);
-
b->
valid = valid;
-
if (op_data->op_bias & MDS_CHECK_SPLIT)
-
b->
valid |= OBD_MD_FLCKSPLIT;
-
if (op_data->op_bias & MDS_CROSS_REF)
-
b->
valid |= OBD_MD_FLCROSSREF;
-
b->
eadatasize = ea_size;
-
b->
flags = flags;
-
__mdc_pack_body(b, op_data->op_suppgids[0]);
+
b->mbo_
valid = valid;
+ if (op_data->op_bias & MDS_CHECK_SPLIT)
+
b->mbo_
valid |= OBD_MD_FLCKSPLIT;
+ if (op_data->op_bias & MDS_CROSS_REF)
+
b->mbo_
valid |= OBD_MD_FLCROSSREF;
+
b->mbo_
eadatasize = ea_size;
+
b->mbo_
flags = flags;
+ __mdc_pack_body(b, op_data->op_suppgids[0]);
-
b->
fid1 = op_data->op_fid1;
-
b->
fid2 = op_data->op_fid2;
-
b->
valid |= OBD_MD_FLID;
+
b->mbo_
fid1 = op_data->op_fid1;
+
b->mbo_
fid2 = op_data->op_fid2;
+
b->mbo_
valid |= OBD_MD_FLID;
mdc_pack_capa(req, &RMF_CAPA1, op_data->op_capa1);
- if (op_data->op_name) {
- char *tmp = req_capsule_client_get(&req->rq_pill, &RMF_NAME);
- LOGL0(op_data->op_name, op_data->op_namelen, tmp);
-
- }
+ if (op_data->op_name != NULL)
+ mdc_pack_name(req, &RMF_NAME, op_data->op_name,
+ op_data->op_namelen);
}
static void mdc_hsm_release_pack(struct ptlrpc_request *req,
@@
-546,65
+549,3
@@
void mdc_close_pack(struct ptlrpc_request *req, struct md_op_data *op_data)
mdc_ioepoch_pack(epoch, op_data);
mdc_hsm_release_pack(req, op_data);
}
-
-static int mdc_req_avail(struct client_obd *cli, struct mdc_cache_waiter *mcw)
-{
- int rc;
- ENTRY;
- client_obd_list_lock(&cli->cl_loi_list_lock);
- rc = cfs_list_empty(&mcw->mcw_entry);
- client_obd_list_unlock(&cli->cl_loi_list_lock);
- RETURN(rc);
-};
-
-/* We record requests in flight in cli->cl_r_in_flight here.
- * There is only one write rpc possible in mdc anyway. If this to change
- * in the future - the code may need to be revisited. */
-int mdc_enter_request(struct client_obd *cli)
-{
- int rc = 0;
- struct mdc_cache_waiter mcw;
- struct l_wait_info lwi = LWI_INTR(LWI_ON_SIGNAL_NOOP, NULL);
-
- client_obd_list_lock(&cli->cl_loi_list_lock);
- if (cli->cl_r_in_flight >= cli->cl_max_rpcs_in_flight) {
- cfs_list_add_tail(&mcw.mcw_entry, &cli->cl_cache_waiters);
- init_waitqueue_head(&mcw.mcw_waitq);
- client_obd_list_unlock(&cli->cl_loi_list_lock);
- rc = l_wait_event(mcw.mcw_waitq, mdc_req_avail(cli, &mcw), &lwi);
- if (rc) {
- client_obd_list_lock(&cli->cl_loi_list_lock);
- if (cfs_list_empty(&mcw.mcw_entry))
- cli->cl_r_in_flight--;
- cfs_list_del_init(&mcw.mcw_entry);
- client_obd_list_unlock(&cli->cl_loi_list_lock);
- }
- } else {
- cli->cl_r_in_flight++;
- client_obd_list_unlock(&cli->cl_loi_list_lock);
- }
- return rc;
-}
-
-void mdc_exit_request(struct client_obd *cli)
-{
- cfs_list_t *l, *tmp;
- struct mdc_cache_waiter *mcw;
-
- client_obd_list_lock(&cli->cl_loi_list_lock);
- cli->cl_r_in_flight--;
- cfs_list_for_each_safe(l, tmp, &cli->cl_cache_waiters) {
- if (cli->cl_r_in_flight >= cli->cl_max_rpcs_in_flight) {
- /* No free request slots anymore */
- break;
- }
-
- mcw = cfs_list_entry(l, struct mdc_cache_waiter, mcw_entry);
- cfs_list_del_init(&mcw->mcw_entry);
- cli->cl_r_in_flight++;
- wake_up(&mcw->mcw_waitq);
- }
- /* Empty waiting list? Decrease reqs in-flight number */
-
- client_obd_list_unlock(&cli->cl_loi_list_lock);
-}