Re: [PATCH 6/8] SCSI: implement sd_unlock_native_capacity()

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Tejun Heo
Date: Sunday, May 16, 2010 - 10:00 am

Hello, James.

On 05/16/2010 06:00 PM, James Bottomley wrote:

Yeap.


Yeah, it can be made to work via a queue callback but I'm afraid that
would be a genuine layering violation (although going through SCSI is
extra layering, it isn't really a layering violation).

These are request_queue methods.

	request_fn_proc		*request_fn;
	make_request_fn		*make_request_fn;
	prep_rq_fn		*prep_rq_fn;
	unplug_fn		*unplug_fn;
	merge_bvec_fn		*merge_bvec_fn;
	prepare_flush_fn	*prepare_flush_fn;
	softirq_done_fn		*softirq_done_fn;
	rq_timed_out_fn		*rq_timed_out_fn;
	dma_drain_needed_fn	*dma_drain_needed;
	lld_busy_fn		*lld_busy_fn;

These are gendisk methods.

	int (*open) (struct block_device *, fmode_t);
	int (*release) (struct gendisk *, fmode_t);
	int (*locked_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
	int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
	int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
	int (*direct_access) (struct block_device *, sector_t,
						void **, unsigned long *);
	int (*media_changed) (struct gendisk *);
	void (*unlock_native_capacity) (struct gendisk *);
	int (*revalidate_disk) (struct gendisk *);
	int (*getgeo)(struct block_device *, struct hd_geometry *);

request_queue is (or at least supposed to be) oblivious about genhd
and its attributes including capacity.  After all, request_queue can
exist w/o genhd associated, so it would be quite odd to have capacity
related method living in request_queue.

Another thing is that there is no generic way to reach the associated
genhd from request_queue and I can't think of a clean way to map
request_queue to the associated ata device w/o in-flight requests (can
you even do that from SCSI?).

Unfortunately, libata is still properly layered below SCSI, so I'm
afraid threading through sd is clumsy yet the cleanest way to do it.

Thanks.

-- 
tejun
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
Re: [PATCH 3/8] block,ide: simplify bdops->set_capacity() ..., Bartlomiej Zolnierki ..., (Sat May 15, 11:48 am)
Re: [PATCH 8/8] libata: implement on-demand HPA unlocking, David Miller, (Sun May 16, 12:19 am)
Re: [PATCH 6/8] SCSI: implement sd_unlock_native_capacity(), James Bottomley, (Sun May 16, 6:39 am)
Re: [PATCH 6/8] SCSI: implement sd_unlock_native_capacity(), James Bottomley, (Sun May 16, 9:00 am)
Re: [PATCH 6/8] SCSI: implement sd_unlock_native_capacity(), Tejun Heo, (Sun May 16, 10:00 am)
Re: [PATCH 6/8] SCSI: implement sd_unlock_native_capacity(), James Bottomley, (Sun May 16, 12:23 pm)