seq_client_flush modifies the lu_client_seq.lcs_space by holding the
lu_client_seq.lcs_sem, but seq_client_alloc_fid uses lcs_update to
exclude other concurrent modification.
Change-Id: Ibc3335841b9a045360283e15aab9b6c36b7a39af
Signed-off-by: Hongchao Zhang <hongchao.zhang@whamcloud.com>
Reviewed-on: http://review.whamcloud.com/1364
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: Hudson
Reviewed-by: Fan Yong <yong.fan@whamcloud.com>
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
*/
void seq_client_flush(struct lu_client_seq *seq)
{
+ cfs_waitlink_t link;
+
LASSERT(seq != NULL);
+ cfs_waitlink_init(&link);
cfs_down(&seq->lcs_sem);
+
+ while (seq->lcs_update) {
+ cfs_waitq_add(&seq->lcs_waitq, &link);
+ cfs_set_current_state(CFS_TASK_UNINT);
+ cfs_up(&seq->lcs_sem);
+
+ cfs_waitq_wait(&link, CFS_TASK_UNINT);
+
+ cfs_down(&seq->lcs_sem);
+ cfs_waitq_del(&seq->lcs_waitq, &link);
+ cfs_set_current_state(CFS_TASK_RUNNING);
+ }
+
fid_zero(&seq->lcs_fid);
/**
* this id shld not be used for seq range allocation.
cfs_down(&seq->lcs_sem);
rc = lprocfs_write_helper(buffer, count, &val);
- if (rc)
+ if (rc) {
+ cfs_up(&seq->lcs_sem);
RETURN(rc);
+ }
if (val <= LUSTRE_SEQ_MAX_WIDTH && val > 0) {
seq->lcs_width = val;