Per-open file private data for the cdevs

Pawel Jakub Dawidek pjd at FreeBSD.org
Mon May 5 08:40:55 UTC 2008


On Sun, May 04, 2008 at 08:10:02PM +0300, Kostik Belousov wrote:
> Since the review for the clone-at-open patch (fdclone) posted some time ago
> mostly says that it would be better to implement per-file private data
> instead, I produced the patch along this line,
> 
> The patch does not change the cdevsw ABI, instead, three new functions
> nt	devfs_get_cdevpriv(void **datap);
> int	devfs_set_cdevpriv(void *priv, cdevpriv_dtr_t dtr);
> void	devfs_clear_cdevpriv(void);
> are provided for manipulation of the per-file private data.
> 
> devfs_set_cdevpriv assigns the priv as private data for the file descriptor
> which is used to initiate currently performed driver operation. dtr
> is the function that will be called when either the last refernce to
> the file goes away or devfs_clear_cdevpriv is called.
> 
> devfs_get_cdevpriv is the obvious accessor.
> 
> devfs_clear_cdevpriv allows to clear the private data for the still
> open file.
> 
> The synchronization of the cdev data and file private data is left
> to the driver code, I did not found any generic helper mechanism that
> could be useful there.
> 
> Patch:
> http://people.freebsd.org/~kib/misc/fdpriv.1.patch
> 
> Dumb driver that shows the basic usage of the proposed KPI:
> http://people.freebsd.org/~kib/misc/fpclone.c
> 
> Previous version of the patch was tested by Peter Holm.

Can you see if my OSD (Object-Specific-Data) KPI can be useful here?
I've it only in perforce for now, but I think it's what you are looking
for. I use it for jails and threads currently, but it is trivial to use
it for other objects. Take a look:

	http://perforce.freebsd.org/fileViewer.cgi?FSPC=//depot/user/pjd/zfs/sys/sys/osd.h&REV=3

When your code is loaded/initialized you call:

	static int slot;

	slot = osd_file_register(mod_destroy);

Where mod_destroy is a function which knows how to free your private
data. On unload:

	osd_file_deregister(slot);

Now, when you want to attach private data:

	error = osd_file_set(fp, slot, ptr_to_your_data);

You can get it with:

	ptr = osd_file_get(fp, slot);

-- 
Pawel Jakub Dawidek                       http://www.wheel.pl
pjd at FreeBSD.org                           http://www.FreeBSD.org
FreeBSD committer                         Am I Evil? Yes, I Am!
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-arch/attachments/20080505/401e626e/attachment.pgp


More information about the freebsd-arch mailing list