/* * Handling of filesystem drivers list. * Rules: * Inclusion to/removals from/scanning of list are protected by spinlock. * During the unload module must call unregister_filesystem(). * We can access the fields of list element if: * 1) spinlock is held or * 2) we hold the reference to the module. * The latter can be guaranteed by call of try_module_get(); if it * returned 0 we must skip the element, otherwise we got the reference. * Once the reference is obtained we can drop the spinlock.
*/
/* WARNING: This can be used only if we _already_ own a reference */ struct file_system_type *get_filesystem(struct file_system_type *fs)
{
__module_get(fs->owner); return fs;
}
staticstruct file_system_type **find_filesystem(constchar *name, unsigned len)
{ struct file_system_type **p; for (p = &file_systems; *p; p = &(*p)->next) if (strncmp((*p)->name, name, len) == 0 &&
!(*p)->name[len]) break; return p;
}
/** * register_filesystem - register a new filesystem * @fs: the file system structure * * Adds the file system passed to the list of file systems the kernel * is aware of for mount and other syscalls. Returns 0 on success, * or a negative errno code on an error. * * The &struct file_system_type that is passed is linked into the kernel * structures and must not be freed until the file system has been * unregistered.
*/
int register_filesystem(struct file_system_type * fs)
{ int res = 0; struct file_system_type ** p;
if (fs->parameters &&
!fs_validate_description(fs->name, fs->parameters)) return -EINVAL;
BUG_ON(strchr(fs->name, '.')); if (fs->next) return -EBUSY;
write_lock(&file_systems_lock);
p = find_filesystem(fs->name, strlen(fs->name)); if (*p)
res = -EBUSY; else
*p = fs;
write_unlock(&file_systems_lock); return res;
}
EXPORT_SYMBOL(register_filesystem);
/** * unregister_filesystem - unregister a file system * @fs: filesystem to unregister * * Remove a file system that was previously successfully registered * with the kernel. An error is returned if the file system is not found. * Zero is returned on a success. * * Once this function has returned the &struct file_system_type structure * may be freed or reused.
*/
int unregister_filesystem(struct file_system_type * fs)
{ struct file_system_type ** tmp;
staticint fs_name(unsignedint index, char __user * buf)
{ struct file_system_type * tmp; int len, res = -EINVAL;
read_lock(&file_systems_lock); for (tmp = file_systems; tmp; tmp = tmp->next, index--) { if (index == 0) { if (try_module_get(tmp->owner))
res = 0; break;
}
}
read_unlock(&file_systems_lock); if (res) return res;
/* OK, we got the reference, so we can safely block */
len = strlen(tmp->name) + 1;
res = copy_to_user(buf, tmp->name, len) ? -EFAULT : 0;
put_filesystem(tmp); return res;
}
staticint fs_maxindex(void)
{ struct file_system_type * tmp; int index;
read_lock(&file_systems_lock); for (tmp = file_systems, index = 0 ; tmp ; tmp = tmp->next, index++)
;
read_unlock(&file_systems_lock); return index;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.