diff --git a/[refs] b/[refs] index 900d7c506ef3..b0f6f1b89df2 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e55b689268391a3b0a0d20c951b60b2d88a5e105 +refs/heads/master: 30c7c1c63079e97582a592c176bebbfd38285480 diff --git a/trunk/drivers/staging/dst/dcore.c b/trunk/drivers/staging/dst/dcore.c index a72181f86e3a..fad25b753042 100644 --- a/trunk/drivers/staging/dst/dcore.c +++ b/trunk/drivers/staging/dst/dcore.c @@ -100,10 +100,33 @@ static void dst_node_set_size(struct dst_node *n) static int dst_request(struct request_queue *q, struct bio *bio) { struct dst_node *n = q->queuedata; + int err = -EIO; + + if (bio_empty_barrier(bio) && !q->prepare_discard_fn) { + /* + * This is a dirty^Wnice hack, but if we complete this + * operation with -EOPNOTSUPP like intended, XFS + * will stuck and freeze the machine. This may be + * not particulary XFS problem though, but it is the + * only FS which sends empty barrier at umount time + * I worked with. + * + * Empty barriers are not allowed anyway, see 51fd77bd9f512 + * for example, although later it was changed to bio_discard() + * only, which does not work in this case. + */ + //err = -EOPNOTSUPP; + err = 0; + goto end_io; + } bio_get(bio); return dst_process_bio(n, bio); + +end_io: + bio_endio(bio, err); + return err; } /*