devfs: Add devfs_{get,put}_device()
devfs_get_device() returns the device for a given path (if any), also acquiring a reference to its vnode (thus ensuring the device won't go away). devfs_put_device() puts the device vnode's reference.
This commit is contained in:
@@ -2143,6 +2143,34 @@ devfs_unpublish_device(BaseDevice* device, bool disconnect)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*! Gets the device for a given devfs relative path.
|
||||||
|
If successful the call must be balanced with a call to devfs_put_device().
|
||||||
|
*/
|
||||||
|
status_t
|
||||||
|
devfs_get_device(const char* path, BaseDevice*& _device)
|
||||||
|
{
|
||||||
|
devfs_vnode* node;
|
||||||
|
status_t status = get_node_for_path(sDeviceFileSystem, path, &node);
|
||||||
|
if (status != B_OK)
|
||||||
|
return status;
|
||||||
|
|
||||||
|
if (!S_ISCHR(node->stream.type) || node->stream.u.dev.partition != NULL) {
|
||||||
|
put_vnode(sDeviceFileSystem->volume, node->id);
|
||||||
|
return B_BAD_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
_device = node->stream.u.dev.device;
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
devfs_put_device(BaseDevice* device)
|
||||||
|
{
|
||||||
|
put_vnode(sDeviceFileSystem->volume, device->ID());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
devfs_compute_geometry_size(device_geometry* geometry, uint64 blockCount,
|
devfs_compute_geometry_size(device_geometry* geometry, uint64 blockCount,
|
||||||
uint32 blockSize)
|
uint32 blockSize)
|
||||||
@@ -2175,5 +2203,3 @@ devfs_publish_device(const char* path, device_hooks* hooks)
|
|||||||
{
|
{
|
||||||
return legacy_driver_publish(path, hooks);
|
return legacy_driver_publish(path, hooks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -16,8 +16,10 @@ namespace BPrivate {
|
|||||||
using BPrivate::BaseDevice;
|
using BPrivate::BaseDevice;
|
||||||
|
|
||||||
|
|
||||||
status_t devfs_publish_device(const char* path, BaseDevice* device);
|
status_t devfs_publish_device(const char* path, BaseDevice* device);
|
||||||
status_t devfs_unpublish_device(BaseDevice* device, bool disconnect);
|
status_t devfs_unpublish_device(BaseDevice* device, bool disconnect);
|
||||||
status_t devfs_get_device(dev_t device, ino_t node, BaseDevice** _device);
|
|
||||||
|
status_t devfs_get_device(const char* path, BaseDevice*& _device);
|
||||||
|
void devfs_put_device(BaseDevice* device);
|
||||||
|
|
||||||
#endif /* DEVFS_PRIVATE_H */
|
#endif /* DEVFS_PRIVATE_H */
|
||||||
|
|||||||
Reference in New Issue
Block a user