Lines Matching refs:ofs
217 static void ovl_free_fs(struct ovl_fs *ofs) in ovl_free_fs() argument
222 iput(ofs->workbasedir_trap); in ovl_free_fs()
223 iput(ofs->indexdir_trap); in ovl_free_fs()
224 iput(ofs->workdir_trap); in ovl_free_fs()
225 dput(ofs->whiteout); in ovl_free_fs()
226 dput(ofs->indexdir); in ovl_free_fs()
227 dput(ofs->workdir); in ovl_free_fs()
228 if (ofs->workdir_locked) in ovl_free_fs()
229 ovl_inuse_unlock(ofs->workbasedir); in ovl_free_fs()
230 dput(ofs->workbasedir); in ovl_free_fs()
231 if (ofs->upperdir_locked) in ovl_free_fs()
232 ovl_inuse_unlock(ovl_upper_mnt(ofs)->mnt_root); in ovl_free_fs()
235 mounts = (struct vfsmount **) ofs->layers; in ovl_free_fs()
236 for (i = 0; i < ofs->numlayer; i++) { in ovl_free_fs()
237 iput(ofs->layers[i].trap); in ovl_free_fs()
238 mounts[i] = ofs->layers[i].mnt; in ovl_free_fs()
240 kern_unmount_array(mounts, ofs->numlayer); in ovl_free_fs()
241 kfree(ofs->layers); in ovl_free_fs()
242 for (i = 0; i < ofs->numfs; i++) in ovl_free_fs()
243 free_anon_bdev(ofs->fs[i].pseudo_dev); in ovl_free_fs()
244 kfree(ofs->fs); in ovl_free_fs()
246 kfree(ofs->config.lowerdir); in ovl_free_fs()
247 kfree(ofs->config.upperdir); in ovl_free_fs()
248 kfree(ofs->config.workdir); in ovl_free_fs()
249 kfree(ofs->config.redirect_mode); in ovl_free_fs()
250 if (ofs->creator_cred) in ovl_free_fs()
251 put_cred(ofs->creator_cred); in ovl_free_fs()
252 kfree(ofs); in ovl_free_fs()
257 struct ovl_fs *ofs = sb->s_fs_info; in ovl_put_super() local
259 ovl_free_fs(ofs); in ovl_put_super()
265 struct ovl_fs *ofs = sb->s_fs_info; in ovl_sync_fs() local
269 ret = ovl_sync_status(ofs); in ovl_sync_fs()
294 upper_sb = ovl_upper_mnt(ofs)->mnt_sb; in ovl_sync_fs()
313 struct ovl_fs *ofs = dentry->d_sb->s_fs_info; in ovl_statfs() local
322 buf->f_namelen = ofs->namelen; in ovl_statfs()
330 static bool ovl_force_readonly(struct ovl_fs *ofs) in ovl_force_readonly() argument
332 return (!ovl_upper_mnt(ofs) || !ofs->workdir); in ovl_force_readonly()
362 struct ovl_fs *ofs = sb->s_fs_info; in ovl_show_options() local
364 seq_show_option(m, "lowerdir", ofs->config.lowerdir); in ovl_show_options()
365 if (ofs->config.upperdir) { in ovl_show_options()
366 seq_show_option(m, "upperdir", ofs->config.upperdir); in ovl_show_options()
367 seq_show_option(m, "workdir", ofs->config.workdir); in ovl_show_options()
369 if (ofs->config.default_permissions) in ovl_show_options()
371 if (strcmp(ofs->config.redirect_mode, ovl_redirect_mode_def()) != 0) in ovl_show_options()
372 seq_printf(m, ",redirect_dir=%s", ofs->config.redirect_mode); in ovl_show_options()
373 if (ofs->config.index != ovl_index_def) in ovl_show_options()
374 seq_printf(m, ",index=%s", ofs->config.index ? "on" : "off"); in ovl_show_options()
375 if (!ofs->config.uuid) in ovl_show_options()
377 if (ofs->config.nfs_export != ovl_nfs_export_def) in ovl_show_options()
378 seq_printf(m, ",nfs_export=%s", ofs->config.nfs_export ? in ovl_show_options()
380 if (ofs->config.xino != ovl_xino_def() && !ovl_same_fs(sb)) in ovl_show_options()
381 seq_printf(m, ",xino=%s", ovl_xino_str[ofs->config.xino]); in ovl_show_options()
382 if (ofs->config.metacopy != ovl_metacopy_def) in ovl_show_options()
384 ofs->config.metacopy ? "on" : "off"); in ovl_show_options()
385 if (ofs->config.ovl_volatile) in ovl_show_options()
387 if (ofs->config.userxattr) in ovl_show_options()
394 struct ovl_fs *ofs = sb->s_fs_info; in ovl_remount() local
398 if (!(*flags & SB_RDONLY) && ovl_force_readonly(ofs)) in ovl_remount()
402 upper_sb = ovl_upper_mnt(ofs)->mnt_sb; in ovl_remount()
403 if (ovl_should_sync(ofs)) { in ovl_remount()
757 static struct dentry *ovl_workdir_create(struct ovl_fs *ofs, in ovl_workdir_create() argument
760 struct inode *dir = ofs->workbasedir->d_inode; in ovl_workdir_create()
761 struct vfsmount *mnt = ovl_upper_mnt(ofs); in ovl_workdir_create()
768 work = ovl_lookup_upper(ofs, name, ofs->workbasedir, strlen(name)); in ovl_workdir_create()
785 err = ovl_workdir_cleanup(ofs, dir, mnt, work, 0); in ovl_workdir_create()
794 err = ovl_mkdir_real(ofs, dir, &work, attr.ia_mode); in ovl_workdir_create()
816 err = ovl_do_removexattr(ofs, work, in ovl_workdir_create()
821 err = ovl_do_removexattr(ofs, work, in ovl_workdir_create()
828 err = ovl_do_notify_change(ofs, work, &attr); in ovl_workdir_create()
844 ofs->config.workdir, name, -err); in ovl_workdir_create()
912 static int ovl_check_namelen(const struct path *path, struct ovl_fs *ofs, in ovl_check_namelen() argument
921 ofs->namelen = max(ofs->namelen, statfs.f_namelen); in ovl_check_namelen()
927 struct ovl_fs *ofs, int *stack_depth) in ovl_lower_dir() argument
936 err = ovl_check_namelen(path, ofs, name); in ovl_lower_dir()
947 if ((ofs->config.nfs_export || in ovl_lower_dir()
948 (ofs->config.index && ofs->config.upperdir)) && !fh_type) { in ovl_lower_dir()
949 ofs->config.index = false; in ovl_lower_dir()
950 ofs->config.nfs_export = false; in ovl_lower_dir()
958 if (ofs->config.xino == OVL_XINO_AUTO && in ovl_lower_dir()
959 ofs->config.upperdir && !fh_type) { in ovl_lower_dir()
960 ofs->config.xino = OVL_XINO_OFF; in ovl_lower_dir()
967 ofs->xino_mode = -1; in ovl_lower_dir()
1191 static int ovl_report_in_use(struct ovl_fs *ofs, const char *name) in ovl_report_in_use() argument
1193 if (ofs->config.index) { in ovl_report_in_use()
1204 static int ovl_get_upper(struct super_block *sb, struct ovl_fs *ofs, in ovl_get_upper() argument
1210 err = ovl_mount_dir(ofs->config.upperdir, upperpath); in ovl_get_upper()
1221 err = ovl_check_namelen(upperpath, ofs, ofs->config.upperdir); in ovl_get_upper()
1255 if (ovl_inuse_trylock(ovl_upper_mnt(ofs)->mnt_root)) { in ovl_get_upper()
1256 ofs->upperdir_locked = true; in ovl_get_upper()
1258 err = ovl_report_in_use(ofs, "upperdir"); in ovl_get_upper()
1272 static int ovl_check_rename_whiteout(struct ovl_fs *ofs) in ovl_check_rename_whiteout() argument
1274 struct dentry *workdir = ofs->workdir; in ovl_check_rename_whiteout()
1284 temp = ovl_create_temp(ofs, workdir, OVL_CATTR(S_IFREG | 0)); in ovl_check_rename_whiteout()
1289 dest = ovl_lookup_temp(ofs, workdir); in ovl_check_rename_whiteout()
1298 err = ovl_do_rename(ofs, dir, temp, dir, dest, RENAME_WHITEOUT); in ovl_check_rename_whiteout()
1305 whiteout = ovl_lookup_upper(ofs, name.name.name, workdir, name.name.len); in ovl_check_rename_whiteout()
1314 ovl_cleanup(ofs, dir, whiteout); in ovl_check_rename_whiteout()
1318 ovl_cleanup(ofs, dir, temp); in ovl_check_rename_whiteout()
1329 static struct dentry *ovl_lookup_or_create(struct ovl_fs *ofs, in ovl_lookup_or_create() argument
1337 child = ovl_lookup_upper(ofs, name, parent, len); in ovl_lookup_or_create()
1339 child = ovl_create_real(ofs, parent->d_inode, child, in ovl_lookup_or_create()
1351 static int ovl_create_volatile_dirty(struct ovl_fs *ofs) in ovl_create_volatile_dirty() argument
1354 struct dentry *d = dget(ofs->workbasedir); in ovl_create_volatile_dirty()
1361 d = ovl_lookup_or_create(ofs, d, *name, ctr > 1 ? S_IFDIR : S_IFREG); in ovl_create_volatile_dirty()
1369 static int ovl_make_workdir(struct super_block *sb, struct ovl_fs *ofs, in ovl_make_workdir() argument
1372 struct vfsmount *mnt = ovl_upper_mnt(ofs); in ovl_make_workdir()
1384 workdir = ovl_workdir_create(ofs, OVL_WORKDIR_NAME, false); in ovl_make_workdir()
1389 ofs->workdir = workdir; in ovl_make_workdir()
1391 err = ovl_setup_trap(sb, ofs->workdir, &ofs->workdir_trap, "workdir"); in ovl_make_workdir()
1410 tmpfile = ovl_do_tmpfile(ofs, ofs->workdir, S_IFREG | 0); in ovl_make_workdir()
1411 ofs->tmpfile = !IS_ERR(tmpfile); in ovl_make_workdir()
1412 if (ofs->tmpfile) in ovl_make_workdir()
1419 err = ovl_check_rename_whiteout(ofs); in ovl_make_workdir()
1430 err = ovl_setxattr(ofs, ofs->workdir, OVL_XATTR_OPAQUE, "0", 1); in ovl_make_workdir()
1433 ofs->noxattr = true; in ovl_make_workdir()
1434 if (ofs->config.index || ofs->config.metacopy) { in ovl_make_workdir()
1435 ofs->config.index = false; in ovl_make_workdir()
1436 ofs->config.metacopy = false; in ovl_make_workdir()
1443 if (ofs->config.xino == OVL_XINO_AUTO) { in ovl_make_workdir()
1444 ofs->config.xino = OVL_XINO_OFF; in ovl_make_workdir()
1447 if (err == -EPERM && !ofs->config.userxattr) in ovl_make_workdir()
1451 ovl_removexattr(ofs, ofs->workdir, OVL_XATTR_OPAQUE); in ovl_make_workdir()
1459 if (ovl_dentry_remote(ofs->workdir) && in ovl_make_workdir()
1460 (!d_type || !rename_whiteout || ofs->noxattr)) { in ovl_make_workdir()
1470 if (ofs->config.ovl_volatile) { in ovl_make_workdir()
1471 err = ovl_create_volatile_dirty(ofs); in ovl_make_workdir()
1479 fh_type = ovl_can_decode_fh(ofs->workdir->d_sb); in ovl_make_workdir()
1480 if (ofs->config.index && !fh_type) { in ovl_make_workdir()
1481 ofs->config.index = false; in ovl_make_workdir()
1487 ofs->xino_mode = -1; in ovl_make_workdir()
1490 if (ofs->config.nfs_export && !ofs->config.index) { in ovl_make_workdir()
1492 ofs->config.nfs_export = false; in ovl_make_workdir()
1499 static int ovl_get_workdir(struct super_block *sb, struct ovl_fs *ofs, in ovl_get_workdir() argument
1505 err = ovl_mount_dir(ofs->config.workdir, &workpath); in ovl_get_workdir()
1519 ofs->workbasedir = dget(workpath.dentry); in ovl_get_workdir()
1521 if (ovl_inuse_trylock(ofs->workbasedir)) { in ovl_get_workdir()
1522 ofs->workdir_locked = true; in ovl_get_workdir()
1524 err = ovl_report_in_use(ofs, "workdir"); in ovl_get_workdir()
1529 err = ovl_setup_trap(sb, ofs->workbasedir, &ofs->workbasedir_trap, in ovl_get_workdir()
1534 err = ovl_make_workdir(sb, ofs, &workpath); in ovl_get_workdir()
1542 static int ovl_get_indexdir(struct super_block *sb, struct ovl_fs *ofs, in ovl_get_indexdir() argument
1545 struct vfsmount *mnt = ovl_upper_mnt(ofs); in ovl_get_indexdir()
1554 err = ovl_verify_origin(ofs, upperpath->dentry, in ovl_get_indexdir()
1562 iput(ofs->workdir_trap); in ovl_get_indexdir()
1563 ofs->workdir_trap = NULL; in ovl_get_indexdir()
1564 dput(ofs->workdir); in ovl_get_indexdir()
1565 ofs->workdir = NULL; in ovl_get_indexdir()
1566 indexdir = ovl_workdir_create(ofs, OVL_INDEXDIR_NAME, true); in ovl_get_indexdir()
1570 ofs->indexdir = indexdir; in ovl_get_indexdir()
1571 ofs->workdir = dget(indexdir); in ovl_get_indexdir()
1573 err = ovl_setup_trap(sb, ofs->indexdir, &ofs->indexdir_trap, in ovl_get_indexdir()
1586 if (ovl_check_origin_xattr(ofs, ofs->indexdir)) { in ovl_get_indexdir()
1587 err = ovl_verify_set_fh(ofs, ofs->indexdir, in ovl_get_indexdir()
1593 err = ovl_verify_upper(ofs, ofs->indexdir, upperpath->dentry, in ovl_get_indexdir()
1600 err = ovl_indexdir_cleanup(ofs); in ovl_get_indexdir()
1602 if (err || !ofs->indexdir) in ovl_get_indexdir()
1610 static bool ovl_lower_uuid_ok(struct ovl_fs *ofs, const uuid_t *uuid) in ovl_lower_uuid_ok() argument
1614 if (!ofs->config.nfs_export && !ovl_upper_mnt(ofs)) in ovl_lower_uuid_ok()
1625 if (ovl_allow_offline_changes(ofs) && uuid_is_null(uuid)) in ovl_lower_uuid_ok()
1628 for (i = 0; i < ofs->numfs; i++) { in ovl_lower_uuid_ok()
1636 if (ofs->fs[i].is_lower && in ovl_lower_uuid_ok()
1637 uuid_equal(&ofs->fs[i].sb->s_uuid, uuid)) { in ovl_lower_uuid_ok()
1638 ofs->fs[i].bad_uuid = true; in ovl_lower_uuid_ok()
1646 static int ovl_get_fsid(struct ovl_fs *ofs, const struct path *path) in ovl_get_fsid() argument
1655 for (i = 0; i < ofs->numfs; i++) { in ovl_get_fsid()
1656 if (ofs->fs[i].sb == sb) in ovl_get_fsid()
1660 if (!ovl_lower_uuid_ok(ofs, &sb->s_uuid)) { in ovl_get_fsid()
1662 if (ofs->config.xino == OVL_XINO_AUTO) { in ovl_get_fsid()
1663 ofs->config.xino = OVL_XINO_OFF; in ovl_get_fsid()
1666 if (ofs->config.index || ofs->config.nfs_export) { in ovl_get_fsid()
1667 ofs->config.index = false; in ovl_get_fsid()
1668 ofs->config.nfs_export = false; in ovl_get_fsid()
1675 path->dentry, ovl_xino_str[ofs->config.xino]); in ovl_get_fsid()
1685 ofs->fs[ofs->numfs].sb = sb; in ovl_get_fsid()
1686 ofs->fs[ofs->numfs].pseudo_dev = dev; in ovl_get_fsid()
1687 ofs->fs[ofs->numfs].bad_uuid = bad_uuid; in ovl_get_fsid()
1689 return ofs->numfs++; in ovl_get_fsid()
1692 static int ovl_get_layers(struct super_block *sb, struct ovl_fs *ofs, in ovl_get_layers() argument
1700 ofs->fs = kcalloc(numlower + 1, sizeof(struct ovl_sb), GFP_KERNEL); in ovl_get_layers()
1701 if (ofs->fs == NULL) in ovl_get_layers()
1705 ofs->numfs++; in ovl_get_layers()
1713 err = get_anon_bdev(&ofs->fs[0].pseudo_dev); in ovl_get_layers()
1719 if (ovl_upper_mnt(ofs)) { in ovl_get_layers()
1720 ofs->fs[0].sb = ovl_upper_mnt(ofs)->mnt_sb; in ovl_get_layers()
1721 ofs->fs[0].is_lower = false; in ovl_get_layers()
1729 err = fsid = ovl_get_fsid(ofs, &stack[i]); in ovl_get_layers()
1745 err = ovl_report_in_use(ofs, "lowerdir"); in ovl_get_layers()
1766 layers[ofs->numlayer].trap = trap; in ovl_get_layers()
1767 layers[ofs->numlayer].mnt = mnt; in ovl_get_layers()
1768 layers[ofs->numlayer].idx = ofs->numlayer; in ovl_get_layers()
1769 layers[ofs->numlayer].fsid = fsid; in ovl_get_layers()
1770 layers[ofs->numlayer].fs = &ofs->fs[fsid]; in ovl_get_layers()
1771 ofs->numlayer++; in ovl_get_layers()
1772 ofs->fs[fsid].is_lower = true; in ovl_get_layers()
1784 if (ofs->numfs - !ovl_upper_mnt(ofs) == 1) { in ovl_get_layers()
1785 if (ofs->config.xino == OVL_XINO_ON) in ovl_get_layers()
1787 ofs->xino_mode = 0; in ovl_get_layers()
1788 } else if (ofs->config.xino == OVL_XINO_OFF) { in ovl_get_layers()
1789 ofs->xino_mode = -1; in ovl_get_layers()
1790 } else if (ofs->xino_mode < 0) { in ovl_get_layers()
1799 ofs->xino_mode = ilog2(ofs->numfs - 1) + 2; in ovl_get_layers()
1802 if (ofs->xino_mode > 0) { in ovl_get_layers()
1804 ofs->xino_mode); in ovl_get_layers()
1814 struct ovl_fs *ofs, struct ovl_layer *layers) in ovl_get_lowerstack() argument
1821 if (!ofs->config.upperdir && numlower == 1) { in ovl_get_lowerstack()
1832 err = ovl_lower_dir(lower, &stack[i], ofs, &sb->s_stack_depth); in ovl_get_lowerstack()
1846 err = ovl_get_layers(sb, ofs, stack, numlower, layers); in ovl_get_lowerstack()
1857 oe->lowerstack[i].layer = &ofs->layers[i+1]; in ovl_get_lowerstack()
1877 static int ovl_check_layer(struct super_block *sb, struct ovl_fs *ofs, in ovl_check_layer() argument
1895 err = ovl_report_in_use(ofs, name); in ovl_check_layer()
1911 struct ovl_fs *ofs) in ovl_check_overlapping_layers() argument
1915 if (ovl_upper_mnt(ofs)) { in ovl_check_overlapping_layers()
1916 err = ovl_check_layer(sb, ofs, ovl_upper_mnt(ofs)->mnt_root, in ovl_check_overlapping_layers()
1928 err = ovl_check_layer(sb, ofs, ofs->workbasedir, "workdir", in ovl_check_overlapping_layers()
1934 for (i = 1; i < ofs->numlayer; i++) { in ovl_check_overlapping_layers()
1935 err = ovl_check_layer(sb, ofs, in ovl_check_overlapping_layers()
1936 ofs->layers[i].mnt->mnt_root, in ovl_check_overlapping_layers()
1988 struct ovl_fs *ofs; in ovl_fill_super() local
2002 ofs = kzalloc(sizeof(struct ovl_fs), GFP_KERNEL); in ovl_fill_super()
2003 if (!ofs) in ovl_fill_super()
2007 ofs->creator_cred = cred = prepare_creds(); in ovl_fill_super()
2012 ofs->share_whiteout = true; in ovl_fill_super()
2014 ofs->config.index = ovl_index_def; in ovl_fill_super()
2015 ofs->config.uuid = true; in ovl_fill_super()
2016 ofs->config.nfs_export = ovl_nfs_export_def; in ovl_fill_super()
2017 ofs->config.xino = ovl_xino_def(); in ovl_fill_super()
2018 ofs->config.metacopy = ovl_metacopy_def; in ovl_fill_super()
2019 err = ovl_parse_opt((char *) data, &ofs->config); in ovl_fill_super()
2024 if (!ofs->config.lowerdir) { in ovl_fill_super()
2031 splitlower = kstrdup(ofs->config.lowerdir, GFP_KERNEL); in ovl_fill_super()
2048 ofs->layers = layers; in ovl_fill_super()
2050 ofs->numlayer = 1; in ovl_fill_super()
2054 atomic_long_set(&ofs->last_ino, 1); in ovl_fill_super()
2056 if (ofs->config.xino != OVL_XINO_OFF) { in ovl_fill_super()
2057 ofs->xino_mode = BITS_PER_LONG - 32; in ovl_fill_super()
2058 if (!ofs->xino_mode) { in ovl_fill_super()
2060 ofs->config.xino = OVL_XINO_OFF; in ovl_fill_super()
2067 if (ofs->config.upperdir) { in ovl_fill_super()
2071 if (!ofs->config.workdir) { in ovl_fill_super()
2076 err = ovl_get_upper(sb, ofs, &layers[0], &upperpath); in ovl_fill_super()
2080 upper_sb = ovl_upper_mnt(ofs)->mnt_sb; in ovl_fill_super()
2081 if (!ovl_should_sync(ofs)) { in ovl_fill_super()
2082 ofs->errseq = errseq_sample(&upper_sb->s_wb_err); in ovl_fill_super()
2083 if (errseq_check(&upper_sb->s_wb_err, ofs->errseq)) { in ovl_fill_super()
2090 err = ovl_get_workdir(sb, ofs, &upperpath); in ovl_fill_super()
2094 if (!ofs->workdir) in ovl_fill_super()
2100 oe = ovl_get_lowerstack(sb, splitlower, numlower, ofs, layers); in ovl_fill_super()
2106 if (!ovl_upper_mnt(ofs)) in ovl_fill_super()
2109 if (!ofs->config.uuid && ofs->numfs > 1) { in ovl_fill_super()
2111 ofs->config.uuid = true; in ovl_fill_super()
2114 if (!ovl_force_readonly(ofs) && ofs->config.index) { in ovl_fill_super()
2115 err = ovl_get_indexdir(sb, ofs, oe, &upperpath); in ovl_fill_super()
2120 if (!ofs->indexdir) in ovl_fill_super()
2124 err = ovl_check_overlapping_layers(sb, ofs); in ovl_fill_super()
2129 if (!ofs->indexdir) { in ovl_fill_super()
2130 ofs->config.index = false; in ovl_fill_super()
2131 if (ovl_upper_mnt(ofs) && ofs->config.nfs_export) { in ovl_fill_super()
2133 ofs->config.nfs_export = false; in ovl_fill_super()
2137 if (ofs->config.metacopy && ofs->config.nfs_export) { in ovl_fill_super()
2139 ofs->config.nfs_export = false; in ovl_fill_super()
2142 if (ofs->config.nfs_export) in ovl_fill_super()
2149 sb->s_xattr = ofs->config.userxattr ? ovl_user_xattr_handlers : in ovl_fill_super()
2151 sb->s_fs_info = ofs; in ovl_fill_super()
2173 ovl_free_fs(ofs); in ovl_fill_super()