aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/dst/dcore.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/dst/dcore.c')
-rw-r--r--drivers/staging/dst/dcore.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/staging/dst/dcore.c b/drivers/staging/dst/dcore.c
index a72181f86e3a..fad25b753042 100644
--- a/drivers/staging/dst/dcore.c
+++ b/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;
}
/*