X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fmdc%2Fmdc_lib.c;h=56d3f7371ed2664e6cf89809b0835c213a0536b7;hb=50dd2cc62cf86f172f515480e7a6b1f0cdfc1768;hp=1e4bc75a6dfb27a95f60e3bccdebdfd7087b005d;hpb=f95393b0d0a59cf3dc2f29cffc35dcc4cc9d7728;p=fs%2Flustre-release.git diff --git a/lustre/mdc/mdc_lib.c b/lustre/mdc/mdc_lib.c index 1e4bc75..56d3f73 100644 --- a/lustre/mdc/mdc_lib.c +++ b/lustre/mdc/mdc_lib.c @@ -150,7 +150,7 @@ void mdc_create_pack(struct ptlrpc_request *req, struct md_op_data *op_data, rec->cr_time = op_data->op_mod_time; rec->cr_suppgid1 = op_data->op_suppgids[0]; rec->cr_suppgid2 = op_data->op_suppgids[1]; - rec->cr_flags = op_data->op_flags & MF_SOM_LOCAL_FLAGS; + set_mrc_cr_flags(rec, op_data->op_flags & MF_SOM_LOCAL_FLAGS); rec->cr_bias = op_data->op_bias; mdc_pack_capa(req, &RMF_CAPA1, op_data->op_capa1); @@ -164,9 +164,9 @@ void mdc_create_pack(struct ptlrpc_request *req, struct md_op_data *op_data, } } -static __u32 mds_pack_open_flags(__u32 flags, __u32 mode) +static __u64 mds_pack_open_flags(__u32 flags, __u32 mode) { - __u32 cr_flags = (flags & (FMODE_READ | FMODE_WRITE | + __u64 cr_flags = (flags & (FMODE_READ | FMODE_WRITE | MDS_OPEN_HAS_EA | MDS_OPEN_HAS_OBJS | MDS_OPEN_OWNEROVERRIDE | MDS_OPEN_LOCK)); if (flags & O_CREAT) @@ -188,6 +188,9 @@ static __u32 mds_pack_open_flags(__u32 flags, __u32 mode) if (flags & O_LOV_DELAY_CREATE) cr_flags |= MDS_OPEN_DELAY_CREATE; + if ((flags & O_NOACCESS) || (flags & O_NONBLOCK)) + cr_flags |= MDS_OPEN_NORESTORE; + return cr_flags; } @@ -198,6 +201,7 @@ void mdc_open_pack(struct ptlrpc_request *req, struct md_op_data *op_data, { struct mdt_rec_create *rec; char *tmp; + __u64 cr_flags; CLASSERT(sizeof(struct mdt_rec_reint) == sizeof(struct mdt_rec_create)); rec = req_capsule_client_get(&req->rq_pill, &RMF_REC_REINT); @@ -212,7 +216,7 @@ void mdc_open_pack(struct ptlrpc_request *req, struct md_op_data *op_data, rec->cr_fid2 = op_data->op_fid2; } rec->cr_mode = mode; - rec->cr_flags = mds_pack_open_flags(flags, mode); + cr_flags = mds_pack_open_flags(flags, mode); rec->cr_rdev = rdev; rec->cr_time = op_data->op_mod_time; rec->cr_suppgid1 = op_data->op_suppgids[0]; @@ -229,7 +233,7 @@ void mdc_open_pack(struct ptlrpc_request *req, struct md_op_data *op_data, } if (lmm) { - rec->cr_flags |= MDS_OPEN_HAS_EA; + cr_flags |= MDS_OPEN_HAS_EA; #ifndef __KERNEL__ /*XXX a hack for liblustre to set EA (LL_IOC_LOV_SETSTRIPE) */ rec->cr_fid2 = op_data->op_fid2; @@ -237,6 +241,7 @@ void mdc_open_pack(struct ptlrpc_request *req, struct md_op_data *op_data, tmp = req_capsule_client_get(&req->rq_pill, &RMF_EADATA); memcpy (tmp, lmm, lmmlen); } + set_mrc_cr_flags(rec, cr_flags); } static inline __u64 attr_pack(unsigned int ia_valid) { @@ -443,21 +448,19 @@ void mdc_rename_pack(struct ptlrpc_request *req, struct md_op_data *op_data, } void mdc_getattr_pack(struct ptlrpc_request *req, __u64 valid, int flags, - struct md_op_data *op_data) + struct md_op_data *op_data, int ea_size) { struct mdt_body *b = req_capsule_client_get(&req->rq_pill, &RMF_MDT_BODY); - b->fsuid = cfs_curproc_fsuid(); - b->fsgid = cfs_curproc_fsgid(); - b->capability = cfs_curproc_cap_pack(); 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; - b->suppgid = op_data->op_suppgids[0]; + __mdc_pack_body(b, op_data->op_suppgids[0]); b->fid1 = op_data->op_fid1; b->fid2 = op_data->op_fid2; @@ -498,21 +501,30 @@ static int mdc_req_avail(struct client_obd *cli, struct mdc_cache_waiter *mcw) /* 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. */ -void mdc_enter_request(struct client_obd *cli) +int mdc_enter_request(struct client_obd *cli) { + int rc = 0; struct mdc_cache_waiter mcw; - struct l_wait_info lwi = { 0 }; + 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); cfs_waitq_init(&mcw.mcw_waitq); client_obd_list_unlock(&cli->cl_loi_list_lock); - l_wait_event(mcw.mcw_waitq, mdc_req_avail(cli, &mcw), &lwi); + 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) @@ -523,7 +535,6 @@ void mdc_exit_request(struct client_obd *cli) 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; @@ -535,6 +546,6 @@ void mdc_exit_request(struct client_obd *cli) cfs_waitq_signal(&mcw->mcw_waitq); } /* Empty waiting list? Decrease reqs in-flight number */ - + client_obd_list_unlock(&cli->cl_loi_list_lock); }