Skip to content
Permalink
Browse files

Remove vn_set_fs_pwd()/vn_set_pwd() (no need to be at / during insmod)

Per suggestion from @behlendorf in #8777, remove vn_set_fs_pwd() and
vn_set_pwd() which are only used in zfs_ioctl.c:_init() while loading
zfs.ko.

The rest of initialization functions being called here after cwd set
to / don't depend on cwd of the process except for spa_config_load().
spa_config_load() uses a relative path ".//etc/zfs/zpool.cache" when
`rootdir` is non-NULL, which is "/etc/zfs/zpool.cache" given cwd is /,
so just unconditionally use the absolute path without "./", so that
`vn_set_pwd("/")` as well as the entire functions can be removed.
This is also what FreeBSD does.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Tony Hutter <hutter2@llnl.gov>
Signed-off-by: Tomohiro Kusumi <kusumi.tomohiro@osnexus.com>
Closes #8826
  • Loading branch information...
kusumi authored and tonyhutter committed May 29, 2019
1 parent 0dab99c commit 072fae31c8bdeb475ebab7270832a483f6b050f0
Showing with 1 addition and 93 deletions.
  1. +0 −24 config/kernel-spinlock.m4
  2. +0 −1 config/kernel.m4
  3. +0 −1 include/spl/sys/vnode.h
  4. +0 −58 module/spl/spl-vnode.c
  5. +1 −2 module/zfs/spa_config.c
  6. +0 −7 module/zfs/zfs_ioctl.c

This file was deleted.

@@ -12,7 +12,6 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
ZFS_AC_KERNEL_CTL_NAME
ZFS_AC_KERNEL_PDE_DATA
ZFS_AC_KERNEL_2ARGS_VFS_FSYNC
ZFS_AC_KERNEL_FS_STRUCT_SPINLOCK
ZFS_AC_KERNEL_KUIDGID_T
ZFS_AC_KERNEL_FALLOCATE
ZFS_AC_KERNEL_2ARGS_ZLIB_DEFLATE_WORKSPACESIZE
@@ -182,7 +182,6 @@ extern int vn_space(vnode_t *vp, int cmd, struct flock *bfp, int flag,
extern file_t *vn_getf(int fd);
extern void vn_releasef(int fd);
extern void vn_areleasef(int fd, uf_info_t *fip);
extern int vn_set_pwd(const char *filename);

int spl_vn_init(void);
void spl_vn_fini(void);
@@ -641,64 +641,6 @@ vn_areleasef(int fd, uf_info_t *fip)
} /* releasef() */
EXPORT_SYMBOL(areleasef);


static void
vn_set_fs_pwd(struct fs_struct *fs, struct path *path)
{
struct path old_pwd;

#ifdef HAVE_FS_STRUCT_SPINLOCK
spin_lock(&fs->lock);
old_pwd = fs->pwd;
fs->pwd = *path;
path_get(path);
spin_unlock(&fs->lock);
#else
write_lock(&fs->lock);
old_pwd = fs->pwd;
fs->pwd = *path;
path_get(path);
write_unlock(&fs->lock);
#endif /* HAVE_FS_STRUCT_SPINLOCK */

if (old_pwd.dentry)
path_put(&old_pwd);
}

int
vn_set_pwd(const char *filename)
{
struct path path;
mm_segment_t saved_fs;
int rc;

/*
* user_path_dir() and __user_walk() both expect 'filename' to be
* a user space address so we must briefly increase the data segment
* size to ensure strncpy_from_user() does not fail with -EFAULT.
*/
saved_fs = get_fs();
set_fs(KERNEL_DS);

rc = user_path_dir(filename, &path);
if (rc)
goto out;

rc = inode_permission(path.dentry->d_inode, MAY_EXEC | MAY_ACCESS);
if (rc)
goto dput_and_out;

vn_set_fs_pwd(current->fs, &path);

dput_and_out:
path_put(&path);
out:
set_fs(saved_fs);

return (-rc);
} /* vn_set_pwd() */
EXPORT_SYMBOL(vn_set_pwd);

static int
vn_cache_constructor(void *buf, void *cdrarg, int kmflags)
{
@@ -93,8 +93,7 @@ spa_config_load(void)
*/
pathname = kmem_alloc(MAXPATHLEN, KM_SLEEP);

(void) snprintf(pathname, MAXPATHLEN, "%s%s",
(rootdir != NULL) ? "./" : "", spa_config_path);
(void) snprintf(pathname, MAXPATHLEN, "%s", spa_config_path);

file = kobj_open_file(pathname);

@@ -7380,13 +7380,6 @@ _init(void)
{
int error;

error = -vn_set_pwd("/");
if (error) {
printk(KERN_NOTICE
"ZFS: Warning unable to set pwd to '/': %d\n", error);
return (error);
}

if ((error = -zvol_init()) != 0)
return (error);

0 comments on commit 072fae3

Please sign in to comment.
You can’t perform that action at this time.