Re: [Devel] [PATCH 1/3] fs/fuse kio: fix loss of FUSE_FSYNC/FUSE_FLUSH reqs

2018-12-03 Thread Pavel Butsykin
sorry, Not there XD

pls, don't ignore this.

On 03.12.2018 16:04, Pavel Butsykin wrote:
> pls ignore this.
> 
> On 03.12.2018 16:02, Pavel Butsykin wrote:
>> Fast-Path can loss fsync/flush requests, because PCS_REQ_T_SYNC 
>> request set up
>> PCS_MAP_FLUSHING flag, but never cleans it. Although initially 
>> PCS_MAP_FLUSHING
>> flag was created for sync timer, so PCS_REQ_T_SYNC request should ignore
>> everything related to PCS_REQ_T_SYNC flag.
>>
>> This patch adds timer_sync flag in prepare_map_flush_ireq() to ignore 
>> all sync
>> timer stuff on PCS_REQ_T_SYNC way.
>>
>> Signed-off-by: Pavel Butsykin 
>> ---
>>   fs/fuse/kio/pcs/pcs_map.c | 27 ---
>>   1 file changed, 16 insertions(+), 11 deletions(-)
>>
>> diff --git a/fs/fuse/kio/pcs/pcs_map.c b/fs/fuse/kio/pcs/pcs_map.c
>> index 459645417462..4bd18c5224ab 100644
>> --- a/fs/fuse/kio/pcs/pcs_map.c
>> +++ b/fs/fuse/kio/pcs/pcs_map.c
>> @@ -2959,20 +2959,24 @@ static void prepare_map_flush_msg(struct 
>> pcs_map_entry * m, struct pcs_int_reque
>>   msg->done = sync_done;
>>   }
>> -static bool valid_for_flush(struct pcs_map_entry *m)
>> +static bool valid_for_flush(struct pcs_map_entry *m, bool timer_sync)
>>   {
>> -    if (m->state & PCS_MAP_DEAD)
>> -    return false;
>> +    if (timer_sync) {
>> +    if (m->state & PCS_MAP_DEAD)
>> +    return false;
>> +    if (m->flags & PCS_MAP_FLUSHING)
>> +    return false;
>> +    }
>>   if (!(m->flags & PCS_MAP_DIRTY))
>>   return false;
>> -    if (m->flags & PCS_MAP_FLUSHING)
>> -    return false;
>>   return true;
>>   }
>> -static int prepare_map_flush_ireq(struct pcs_map_entry *m, struct 
>> pcs_int_request **sreqp)
>> +static int prepare_map_flush_ireq(struct pcs_map_entry *m,
>> +  struct pcs_int_request **sreqp,
>> +  bool timer_sync)
>>   {
>>   struct pcs_dentry_info *de;
>>   struct pcs_cs_list *cslist;
>> @@ -2980,7 +2984,7 @@ static int prepare_map_flush_ireq(struct 
>> pcs_map_entry *m, struct pcs_int_reques
>>   struct pcs_msg * msg;
>>   spin_lock(>lock);
>> -    if (!valid_for_flush(m)) {
>> +    if (!valid_for_flush(m, timer_sync)) {
>>   spin_unlock(>lock);
>>   return 0;
>>   }
>> @@ -3010,7 +3014,7 @@ static int prepare_map_flush_ireq(struct 
>> pcs_map_entry *m, struct pcs_int_reques
>>   /* All resources allocated, we need to recheck maps state again */
>>   spin_lock(>lock);
>>   cslist_put(cslist);
>> -    if (!valid_for_flush(m) || m->cs_list != cslist) {
>> +    if (!valid_for_flush(m, timer_sync) || m->cs_list != cslist) {
>>   spin_unlock(>lock);
>>   return 0;
>>   }
>> @@ -3025,7 +3029,8 @@ static int prepare_map_flush_ireq(struct 
>> pcs_map_entry *m, struct pcs_int_reques
>>   sreq->complete_cb = pcs_flushreq_complete;
>>   sreq->flushreq.msg = msg;
>>   FUSE_KTRACE(sreq->cc->fc, "timed FLUSH " MAP_FMT, MAP_ARGS(m));
>> -    m->flags |= PCS_MAP_FLUSHING;
>> +    if (timer_sync)
>> +    m->flags |= PCS_MAP_FLUSHING;
>>   __pcs_map_get(m);
>>   spin_unlock(>lock);
>>   *sreqp    = sreq;
>> @@ -3047,7 +3052,7 @@ static void sync_timer_work(struct work_struct *w)
>>   struct pcs_int_request * sreq = NULL;
>>   int err;
>> -    err = prepare_map_flush_ireq(m, );
>> +    err = prepare_map_flush_ireq(m, , true);
>>   if (err) {
>>   spin_lock(>lock);
>>   if (!(m->state & PCS_MAP_DEAD))
>> @@ -3125,7 +3130,7 @@ void map_inject_flush_req(struct pcs_int_request 
>> *ireq)
>>   break;
>>   if (!maps[i])
>>   continue;
>> -    err = prepare_map_flush_ireq(maps[i], );
>> +    err = prepare_map_flush_ireq(maps[i], , false);
>>   pcs_map_put(maps[i]);
>>   if (err) {
>>   pcs_set_local_error(>error, PCS_ERR_NOMEM);
>>

___
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel


Re: [Devel] [PATCH 1/3] fs/fuse kio: fix loss of FUSE_FSYNC/FUSE_FLUSH reqs

2018-12-03 Thread Pavel Butsykin
pls ignore this.

On 03.12.2018 16:02, Pavel Butsykin wrote:
> Fast-Path can loss fsync/flush requests, because PCS_REQ_T_SYNC request set up
> PCS_MAP_FLUSHING flag, but never cleans it. Although initially 
> PCS_MAP_FLUSHING
> flag was created for sync timer, so PCS_REQ_T_SYNC request should ignore
> everything related to PCS_REQ_T_SYNC flag.
> 
> This patch adds timer_sync flag in prepare_map_flush_ireq() to ignore all sync
> timer stuff on PCS_REQ_T_SYNC way.
> 
> Signed-off-by: Pavel Butsykin 
> ---
>   fs/fuse/kio/pcs/pcs_map.c | 27 ---
>   1 file changed, 16 insertions(+), 11 deletions(-)
> 
> diff --git a/fs/fuse/kio/pcs/pcs_map.c b/fs/fuse/kio/pcs/pcs_map.c
> index 459645417462..4bd18c5224ab 100644
> --- a/fs/fuse/kio/pcs/pcs_map.c
> +++ b/fs/fuse/kio/pcs/pcs_map.c
> @@ -2959,20 +2959,24 @@ static void prepare_map_flush_msg(struct 
> pcs_map_entry * m, struct pcs_int_reque
>   msg->done = sync_done;
>   }
>   
> -static bool valid_for_flush(struct pcs_map_entry *m)
> +static bool valid_for_flush(struct pcs_map_entry *m, bool timer_sync)
>   {
> - if (m->state & PCS_MAP_DEAD)
> - return false;
> + if (timer_sync) {
> + if (m->state & PCS_MAP_DEAD)
> + return false;
>   
> + if (m->flags & PCS_MAP_FLUSHING)
> + return false;
> + }
>   if (!(m->flags & PCS_MAP_DIRTY))
>   return false;
> - if (m->flags & PCS_MAP_FLUSHING)
> - return false;
>   
>   return true;
>   }
>   
> -static int prepare_map_flush_ireq(struct pcs_map_entry *m, struct 
> pcs_int_request **sreqp)
> +static int prepare_map_flush_ireq(struct pcs_map_entry *m,
> +   struct pcs_int_request **sreqp,
> +   bool timer_sync)
>   {
>   struct pcs_dentry_info *de;
>   struct pcs_cs_list *cslist;
> @@ -2980,7 +2984,7 @@ static int prepare_map_flush_ireq(struct pcs_map_entry 
> *m, struct pcs_int_reques
>   struct pcs_msg * msg;
>   
>   spin_lock(>lock);
> - if (!valid_for_flush(m)) {
> + if (!valid_for_flush(m, timer_sync)) {
>   spin_unlock(>lock);
>   return 0;
>   }
> @@ -3010,7 +3014,7 @@ static int prepare_map_flush_ireq(struct pcs_map_entry 
> *m, struct pcs_int_reques
>   /* All resources allocated, we need to recheck maps state again */
>   spin_lock(>lock);
>   cslist_put(cslist);
> - if (!valid_for_flush(m) || m->cs_list != cslist) {
> + if (!valid_for_flush(m, timer_sync) || m->cs_list != cslist) {
>   spin_unlock(>lock);
>   return 0;
>   }
> @@ -3025,7 +3029,8 @@ static int prepare_map_flush_ireq(struct pcs_map_entry 
> *m, struct pcs_int_reques
>   sreq->complete_cb = pcs_flushreq_complete;
>   sreq->flushreq.msg = msg;
>   FUSE_KTRACE(sreq->cc->fc, "timed FLUSH " MAP_FMT, MAP_ARGS(m));
> - m->flags |= PCS_MAP_FLUSHING;
> + if (timer_sync)
> + m->flags |= PCS_MAP_FLUSHING;
>   __pcs_map_get(m);
>   spin_unlock(>lock);
>   *sreqp  = sreq;
> @@ -3047,7 +3052,7 @@ static void sync_timer_work(struct work_struct *w)
>   struct pcs_int_request * sreq = NULL;
>   int err;
>   
> - err = prepare_map_flush_ireq(m, );
> + err = prepare_map_flush_ireq(m, , true);
>   if (err) {
>   spin_lock(>lock);
>   if (!(m->state & PCS_MAP_DEAD))
> @@ -3125,7 +3130,7 @@ void map_inject_flush_req(struct pcs_int_request *ireq)
>   break;
>   if (!maps[i])
>   continue;
> - err = prepare_map_flush_ireq(maps[i], );
> + err = prepare_map_flush_ireq(maps[i], , false);
>   pcs_map_put(maps[i]);
>   if (err) {
>   pcs_set_local_error(>error, 
> PCS_ERR_NOMEM);
> 

___
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel


[Devel] [PATCH 1/3] fs/fuse kio: fix loss of FUSE_FSYNC/FUSE_FLUSH reqs

2018-12-03 Thread Pavel Butsykin
Fast-Path can loss fsync/flush requests, because PCS_REQ_T_SYNC request set up
PCS_MAP_FLUSHING flag, but never cleans it. Although initially PCS_MAP_FLUSHING
flag was created for sync timer, so PCS_REQ_T_SYNC request should ignore
everything related to PCS_REQ_T_SYNC flag.

This patch adds timer_sync flag in prepare_map_flush_ireq() to ignore all sync
timer stuff on PCS_REQ_T_SYNC way.

Signed-off-by: Pavel Butsykin 
---
 fs/fuse/kio/pcs/pcs_map.c | 27 ---
 1 file changed, 16 insertions(+), 11 deletions(-)

diff --git a/fs/fuse/kio/pcs/pcs_map.c b/fs/fuse/kio/pcs/pcs_map.c
index 459645417462..4bd18c5224ab 100644
--- a/fs/fuse/kio/pcs/pcs_map.c
+++ b/fs/fuse/kio/pcs/pcs_map.c
@@ -2959,20 +2959,24 @@ static void prepare_map_flush_msg(struct pcs_map_entry 
* m, struct pcs_int_reque
msg->done = sync_done;
 }
 
-static bool valid_for_flush(struct pcs_map_entry *m)
+static bool valid_for_flush(struct pcs_map_entry *m, bool timer_sync)
 {
-   if (m->state & PCS_MAP_DEAD)
-   return false;
+   if (timer_sync) {
+   if (m->state & PCS_MAP_DEAD)
+   return false;
 
+   if (m->flags & PCS_MAP_FLUSHING)
+   return false;
+   }
if (!(m->flags & PCS_MAP_DIRTY))
return false;
-   if (m->flags & PCS_MAP_FLUSHING)
-   return false;
 
return true;
 }
 
-static int prepare_map_flush_ireq(struct pcs_map_entry *m, struct 
pcs_int_request **sreqp)
+static int prepare_map_flush_ireq(struct pcs_map_entry *m,
+ struct pcs_int_request **sreqp,
+ bool timer_sync)
 {
struct pcs_dentry_info *de;
struct pcs_cs_list *cslist;
@@ -2980,7 +2984,7 @@ static int prepare_map_flush_ireq(struct pcs_map_entry 
*m, struct pcs_int_reques
struct pcs_msg * msg;
 
spin_lock(>lock);
-   if (!valid_for_flush(m)) {
+   if (!valid_for_flush(m, timer_sync)) {
spin_unlock(>lock);
return 0;
}
@@ -3010,7 +3014,7 @@ static int prepare_map_flush_ireq(struct pcs_map_entry 
*m, struct pcs_int_reques
/* All resources allocated, we need to recheck maps state again */
spin_lock(>lock);
cslist_put(cslist);
-   if (!valid_for_flush(m) || m->cs_list != cslist) {
+   if (!valid_for_flush(m, timer_sync) || m->cs_list != cslist) {
spin_unlock(>lock);
return 0;
}
@@ -3025,7 +3029,8 @@ static int prepare_map_flush_ireq(struct pcs_map_entry 
*m, struct pcs_int_reques
sreq->complete_cb = pcs_flushreq_complete;
sreq->flushreq.msg = msg;
FUSE_KTRACE(sreq->cc->fc, "timed FLUSH " MAP_FMT, MAP_ARGS(m));
-   m->flags |= PCS_MAP_FLUSHING;
+   if (timer_sync)
+   m->flags |= PCS_MAP_FLUSHING;
__pcs_map_get(m);
spin_unlock(>lock);
*sreqp  = sreq;
@@ -3047,7 +3052,7 @@ static void sync_timer_work(struct work_struct *w)
struct pcs_int_request * sreq = NULL;
int err;
 
-   err = prepare_map_flush_ireq(m, );
+   err = prepare_map_flush_ireq(m, , true);
if (err) {
spin_lock(>lock);
if (!(m->state & PCS_MAP_DEAD))
@@ -3125,7 +3130,7 @@ void map_inject_flush_req(struct pcs_int_request *ireq)
break;
if (!maps[i])
continue;
-   err = prepare_map_flush_ireq(maps[i], );
+   err = prepare_map_flush_ireq(maps[i], , false);
pcs_map_put(maps[i]);
if (err) {
pcs_set_local_error(>error, 
PCS_ERR_NOMEM);
-- 
2.15.1

___
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel