X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ffid%2Ffid_handler.c;h=e85d0efa37379d9f0e60569d03b46fd24b99e885;hb=90dfed8469d46f4b79ebdff8121eb109b5db6746;hp=5af9343fe2132c1c6c722cf447db50a9812b0e3c;hpb=4201416b775b14d6e4cd89b7c68bb1c1bc950144;p=fs%2Flustre-release.git diff --git a/lustre/fid/fid_handler.c b/lustre/fid/fid_handler.c index 5af9343..e85d0ef 100644 --- a/lustre/fid/fid_handler.c +++ b/lustre/fid/fid_handler.c @@ -74,7 +74,7 @@ int seq_server_set_cli(struct lu_server_seq *seq, * Ask client for new range, assign that range to ->seq_space and write * seq state to backing store should be atomic. */ - down(&seq->lss_sem); + cfs_down(&seq->lss_sem); if (cli == NULL) { CDEBUG(D_INFO, "%s: Detached sequence client %s\n", @@ -96,7 +96,7 @@ int seq_server_set_cli(struct lu_server_seq *seq, cli->lcs_space.lsr_mdt = seq->lss_site->ms_node_id; EXIT; out_up: - up(&seq->lss_sem); + cfs_up(&seq->lss_sem); return rc; } EXPORT_SYMBOL(seq_server_set_cli); @@ -185,9 +185,9 @@ int seq_server_alloc_super(struct lu_server_seq *seq, int rc; ENTRY; - down(&seq->lss_sem); + cfs_down(&seq->lss_sem); rc = __seq_server_alloc_super(seq, in, out, env); - up(&seq->lss_sem); + cfs_up(&seq->lss_sem); RETURN(rc); } @@ -213,14 +213,12 @@ static int __seq_server_alloc_meta(struct lu_server_seq *seq, CDEBUG(D_INFO, "%s: Input seq range: " DRANGE"\n", seq->lss_name, PRANGE(in)); - if (range_is_exhausted(space)) { + if (in->lsr_end <= space->lsr_start) { /* - * Server cannot send empty range to client, this is why - * we check here that range from client is "newer" than - * exhausted super. + * Client is replaying a fairly old range, server + * don't need to do any allocation. */ - LASSERT(in->lsr_end > space->lsr_start); - + } else if (range_is_exhausted(space)) { /* * Start is set to end of last allocated, because it * *is* already allocated so we take that into account @@ -258,8 +256,21 @@ static int __seq_server_alloc_meta(struct lu_server_seq *seq, * Update super start by end from client's range. Super * end should not be changed if range was not exhausted. */ - if (in->lsr_end > space->lsr_start) - space->lsr_start = in->lsr_end; + space->lsr_start = in->lsr_end; + } + + /* sending replay_super to update fld as only super sequence + * server can update fld. + * we are sending meta sequence to fld rather than super + * sequence, but fld server can handle range merging. */ + + in->lsr_mdt = space->lsr_mdt; + rc = seq_client_replay_super(seq->lss_cli, in, env); + + if (rc) { + CERROR("%s: Can't replay super-sequence, " + "rc %d\n", seq->lss_name, rc); + RETURN(rc); } *out = *in; @@ -320,9 +331,9 @@ int seq_server_alloc_meta(struct lu_server_seq *seq, int rc; ENTRY; - down(&seq->lss_sem); + cfs_down(&seq->lss_sem); rc = __seq_server_alloc_meta(seq, in, out, env); - up(&seq->lss_sem); + cfs_up(&seq->lss_sem); RETURN(rc); } @@ -392,7 +403,12 @@ static int seq_req_handle(struct ptlrpc_request *req, if (lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY) { in = tmp; - LASSERT(!range_is_zero(in) && range_is_sane(in)); + + if (range_is_zero(in) || !range_is_sane(in)) { + CERROR("Replayed seq range is invalid: " + DRANGE"\n", PRANGE(in)); + RETURN(err_serious(-EINVAL)); + } } /* seq client passed mdt id, we need to pass that using out * range parameter */ @@ -524,7 +540,7 @@ int seq_server_init(struct lu_server_seq *seq, seq->lss_type = type; seq->lss_site = ms; range_init(&seq->lss_space); - sema_init(&seq->lss_sem, 1); + cfs_sema_init(&seq->lss_sem, 1); seq->lss_width = is_srv ? LUSTRE_SEQ_META_WIDTH : LUSTRE_SEQ_SUPER_WIDTH;