|
@@ -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;
|
|
|
}
|
|
|
|
|
|
/*
|