From zbr@ioremap.net Wed Jan 21 09:07:24 2009 From: Evgeniy Polyakov Date: Mon, 19 Jan 2009 20:20:37 +0300 Subject: Staging: DST: Do not allow empty barriers. To: greg@kroah.com Message-ID: <1232385638-13643-3-git-send-email-zbr@ioremap.net> Do not allow empty barriers or generic_make_request() -> scsi_setup_fs_cmnd() will explode Signed-off-by: Evgeniy Polyakov Signed-off-by: Greg Kroah-Hartman --- drivers/staging/dst/dcore.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) --- a/drivers/staging/dst/dcore.c +++ b/drivers/staging/dst/dcore.c @@ -100,10 +100,33 @@ static void dst_node_set_size(struct dst 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; } /*