vfs: add format function in vfs api

This commit is contained in:
Vincent Dupont 2018-01-02 15:15:53 +01:00
parent bba457290e
commit 2eca6d25fd
2 changed files with 68 additions and 2 deletions

View File

@ -426,6 +426,16 @@ struct vfs_dir_ops {
* Similar, but not equal, to struct super_operations in Linux * Similar, but not equal, to struct super_operations in Linux
*/ */
struct vfs_file_system_ops { struct vfs_file_system_ops {
/**
* @brief Format the file system on the given mount point
*
* @param[in] mountp file system to format
*
* @return 0 on success
* @return <0 on error
*/
int (*format) (vfs_mount_t *mountp);
/** /**
* @brief Perform any extra processing needed after mounting a file system * @brief Perform any extra processing needed after mounting a file system
* *
@ -695,6 +705,21 @@ int vfs_readdir(vfs_DIR *dirp, vfs_dirent_t *entry);
*/ */
int vfs_closedir(vfs_DIR *dirp); int vfs_closedir(vfs_DIR *dirp);
/**
* @brief Format a file system
*
* @p mountp should have been populated in advance with a file system driver,
* a mount point, and private_data (if the file system driver uses one).
*
* @pre @p mountp must not be mounted
*
* @param[in] mountp pointer to the mount structure of the filesystem to format
*
* @return 0 on success
* @return <0 on error
*/
int vfs_format(vfs_mount_t *mountp);
/** /**
* @brief Mount a file system * @brief Mount a file system
* *

View File

@ -407,9 +407,18 @@ int vfs_closedir(vfs_DIR *dirp)
return res; return res;
} }
int vfs_mount(vfs_mount_t *mountp) /**
* @brief Check if the given mount point is mounted
*
* If the mount point is not mounted, _mount_mutex will be locked by this function
*
* @param mountp mount point to check
* @return 0 on success (mount point is valid and not mounted)
* @return -EINVAL if mountp is invalid
* @return -EBUSY if mountp is already mounted
*/
static int check_mount(vfs_mount_t *mountp)
{ {
DEBUG("vfs_mount: %p\n", (void *)mountp);
if ((mountp == NULL) || (mountp->fs == NULL) || (mountp->mount_point == NULL)) { if ((mountp == NULL) || (mountp->fs == NULL) || (mountp->mount_point == NULL)) {
return -EINVAL; return -EINVAL;
} }
@ -429,11 +438,43 @@ int vfs_mount(vfs_mount_t *mountp)
DEBUG("vfs_mount: Already mounted\n"); DEBUG("vfs_mount: Already mounted\n");
return -EBUSY; return -EBUSY;
} }
return 0;
}
int vfs_format(vfs_mount_t *mountp)
{
DEBUG("vfs_format: %p\n", (void *)mountp);
int ret = check_mount(mountp);
if (ret < 0) {
return ret;
}
mutex_unlock(&_mount_mutex);
if (mountp->fs->fs_op != NULL) {
if (mountp->fs->fs_op->format != NULL) {
return mountp->fs->fs_op->format(mountp);
}
}
/* Format operation not supported */
return -ENOTSUP;
}
int vfs_mount(vfs_mount_t *mountp)
{
DEBUG("vfs_mount: %p\n", (void *)mountp);
int ret = check_mount(mountp);
if (ret < 0) {
return ret;
}
if (mountp->fs->fs_op != NULL) { if (mountp->fs->fs_op != NULL) {
if (mountp->fs->fs_op->mount != NULL) { if (mountp->fs->fs_op->mount != NULL) {
/* yes, a file system driver does not need to implement mount/umount */ /* yes, a file system driver does not need to implement mount/umount */
int res = mountp->fs->fs_op->mount(mountp); int res = mountp->fs->fs_op->mount(mountp);
if (res < 0) { if (res < 0) {
DEBUG("vfs_mount: error %d\n", res);
mutex_unlock(&_mount_mutex); mutex_unlock(&_mount_mutex);
return res; return res;
} }