Skip to content

Commit

Permalink
Remove vn_set_fs_pwd()/vn_set_pwd() (no need to be at / during insmod)
Browse files Browse the repository at this point in the history
Per suggestion from @behlendorf in openzfs#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 <[email protected]>
Reviewed-by: Tony Hutter <[email protected]>
Signed-off-by: Tomohiro Kusumi <[email protected]>
Closes openzfs#8826
  • Loading branch information
kusumi authored and tonyhutter committed Sep 17, 2019
1 parent 5217ace commit a52dbd6
Show file tree
Hide file tree
Showing 6 changed files with 1 addition and 93 deletions.
24 changes: 0 additions & 24 deletions config/kernel-spinlock.m4

This file was deleted.

1 change: 0 additions & 1 deletion config/kernel.m4
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 0 additions & 1 deletion include/spl/sys/vnode.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
58 changes: 0 additions & 58 deletions module/spl/spl-vnode.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down
3 changes: 1 addition & 2 deletions module/zfs/spa_config.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
7 changes: 0 additions & 7 deletions module/zfs/zfs_ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down

0 comments on commit a52dbd6

Please sign in to comment.