• David Howells's avatar
    vfs: syscall: Add fsopen() to prepare for superblock creation · 24dcb3d9
    David Howells authored
    Provide an fsopen() system call that starts the process of preparing to
    create a superblock that will then be mountable, using an fd as a context
    handle.  fsopen() is given the name of the filesystem that will be used:
    
    	int mfd = fsopen(const char *fsname, unsigned int flags);
    
    where flags can be 0 or FSOPEN_CLOEXEC.
    
    For example:
    
    	sfd = fsopen("ext4", FSOPEN_CLOEXEC);
    	fsconfig(sfd, FSCONFIG_SET_PATH, "source", "/dev/sda1", AT_FDCWD);
    	fsconfig(sfd, FSCONFIG_SET_FLAG, "noatime", NULL, 0);
    	fsconfig(sfd, FSCONFIG_SET_FLAG, "acl", NULL, 0);
    	fsconfig(sfd, FSCONFIG_SET_FLAG, "user_xattr", NULL, 0);
    	fsconfig(sfd, FSCONFIG_SET_STRING, "sb", "1", 0);
    	fsconfig(sfd, FSCONFIG_CMD_CREATE, NULL, NULL, 0);
    	fsinfo(sfd, NULL, ...); // query new superblock attributes
    	mfd = fsmount(sfd, FSMOUNT_CLOEXEC, MS_RELATIME);
    	move_mount(mfd, "", sfd, AT_FDCWD, "/mnt", MOVE_MOUNT_F_EMPTY_PATH);
    
    	sfd = fsopen("afs", -1);
    	fsconfig(fd, FSCONFIG_SET_STRING, "source",
    		 "#grand.central.org:root.cell", 0);
    	fsconfig(fd, FSCONFIG_CMD_CREATE, NULL, NULL, 0);
    	mfd = fsmount(sfd, 0, MS_NODEV);
    	move_mount(mfd, "", sfd, AT_FDCWD, "/mnt", MOVE_MOUNT_F_EMPTY_PATH);
    
    If an error is reported at any step, an error message may be available to be
    read() back (ENODATA will be reported if there isn't an error available) in
    the form:
    
    	"e <subsys>:<problem>"
    	"e SELinux:Mount on mountpoint not permitted"
    
    Once fsmount() has been called, further fsconfig() calls will incur EBUSY,
    even if the fsmount() fails.  read() is still possible to retrieve error
    information.
    
    The fsopen() syscall creates a mount context and hangs it of the fd that it
    returns.
    
    Netlink is not used because it is optional and would make the core VFS
    dependent on the networking layer and also potentially add network
    namespace issues.
    
    Note that, for the moment, the caller must have SYS_CAP_ADMIN to use
    fsopen().
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    cc: linux-api@vger.kernel.org
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    24dcb3d9
syscall_32.tbl 24.3 KB