Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 31 Oct 2007 17:06:20 +0200
From:      Kostik Belousov <kostikbel@gmail.com>
To:        freebsd-arch@freebsd.org
Subject:   fdclone KPI
Message-ID:  <20071031150620.GT37471@deviant.kiev.zoral.com.ua>

next in thread | raw e-mail | index | archive | help

--dLXnlYbDJNCwF3YM
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

Dear arch@ readers,
with the important help from Peter Holm I have implemented the KPI that
provides the ability for the driver to implement cloning on the open(2).
This is another (IMHO, more UNIXy) way to provide per-fd private data
for the driver. It seems that at least /dev/apm, /dev/drm and /dev/sg
could immediately benefit from the fdclone() KPI.

The patch is at
http://people.freebsd.org/~kib/misc/fdclone.9.patch
Sample dumb driver that uses the KPI is at
http://people.freebsd.org/~kib/fclone

The driver that uses the fdclone() shall provide cdevsw for master device,
and cdevsw for clones. Master shall have d_fdopen() method that could call
int fdclone(struct cdevsw *_csw, struct file *_fp, int _fmode,
    struct cdev **_clone, void *si_drv1, struct thread *td);
to replace the reference in the _fp with newly created cdev.

After successfull fdclone() call, all further calls on the _fp
are dispatched to the clone _csw instead of master one. si_drv1 of the
new cdev is set to respective argument, allowing the clone to find the
master.

The cloned cdev is not accessible for lookup through the devfs, and is
destroyed automatically on the final close of the last filedescriptor that
references the vnode.

Please, review. Your feedback is welcome !

--dLXnlYbDJNCwF3YM
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.4 (FreeBSD)

iD8DBQFHKJnrC3+MBN1Mb4gRAt8PAJ0W4QLnP644wDgrWJ4XLqYg9iPyxgCdFbo3
EtzhD11yGt+MgtJWLOzQarE=
=nACF
-----END PGP SIGNATURE-----

--dLXnlYbDJNCwF3YM--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20071031150620.GT37471>