Lines Matching refs:ofs

211 static void ovl_free_fs(struct ovl_fs *ofs)  in ovl_free_fs()  argument
215 iput(ofs->workbasedir_trap); in ovl_free_fs()
216 iput(ofs->indexdir_trap); in ovl_free_fs()
217 iput(ofs->workdir_trap); in ovl_free_fs()
218 iput(ofs->upperdir_trap); in ovl_free_fs()
219 dput(ofs->indexdir); in ovl_free_fs()
220 dput(ofs->workdir); in ovl_free_fs()
221 if (ofs->workdir_locked) in ovl_free_fs()
222 ovl_inuse_unlock(ofs->workbasedir); in ovl_free_fs()
223 dput(ofs->workbasedir); in ovl_free_fs()
224 if (ofs->upperdir_locked) in ovl_free_fs()
225 ovl_inuse_unlock(ofs->upper_mnt->mnt_root); in ovl_free_fs()
226 mntput(ofs->upper_mnt); in ovl_free_fs()
227 for (i = 0; i < ofs->numlower; i++) { in ovl_free_fs()
228 iput(ofs->lower_layers[i].trap); in ovl_free_fs()
229 mntput(ofs->lower_layers[i].mnt); in ovl_free_fs()
231 for (i = 0; i < ofs->numlowerfs; i++) in ovl_free_fs()
232 free_anon_bdev(ofs->lower_fs[i].pseudo_dev); in ovl_free_fs()
233 kfree(ofs->lower_layers); in ovl_free_fs()
234 kfree(ofs->lower_fs); in ovl_free_fs()
236 kfree(ofs->config.lowerdir); in ovl_free_fs()
237 kfree(ofs->config.upperdir); in ovl_free_fs()
238 kfree(ofs->config.workdir); in ovl_free_fs()
239 kfree(ofs->config.redirect_mode); in ovl_free_fs()
240 if (ofs->creator_cred) in ovl_free_fs()
241 put_cred(ofs->creator_cred); in ovl_free_fs()
242 kfree(ofs); in ovl_free_fs()
247 struct ovl_fs *ofs = sb->s_fs_info; in ovl_put_super() local
249 ovl_free_fs(ofs); in ovl_put_super()
255 struct ovl_fs *ofs = sb->s_fs_info; in ovl_sync_fs() local
259 if (!ofs->upper_mnt) in ovl_sync_fs()
273 upper_sb = ofs->upper_mnt->mnt_sb; in ovl_sync_fs()
292 struct ovl_fs *ofs = dentry->d_sb->s_fs_info; in ovl_statfs() local
301 buf->f_namelen = ofs->namelen; in ovl_statfs()
309 static bool ovl_force_readonly(struct ovl_fs *ofs) in ovl_force_readonly() argument
311 return (!ofs->upper_mnt || !ofs->workdir); in ovl_force_readonly()
345 struct ovl_fs *ofs = sb->s_fs_info; in ovl_show_options() local
347 seq_show_option(m, "lowerdir", ofs->config.lowerdir); in ovl_show_options()
348 if (ofs->config.upperdir) { in ovl_show_options()
349 seq_show_option(m, "upperdir", ofs->config.upperdir); in ovl_show_options()
350 seq_show_option(m, "workdir", ofs->config.workdir); in ovl_show_options()
352 if (ofs->config.default_permissions) in ovl_show_options()
354 if (strcmp(ofs->config.redirect_mode, ovl_redirect_mode_def()) != 0) in ovl_show_options()
355 seq_printf(m, ",redirect_dir=%s", ofs->config.redirect_mode); in ovl_show_options()
356 if (ofs->config.index != ovl_index_def) in ovl_show_options()
357 seq_printf(m, ",index=%s", ofs->config.index ? "on" : "off"); in ovl_show_options()
358 if (ofs->config.nfs_export != ovl_nfs_export_def) in ovl_show_options()
359 seq_printf(m, ",nfs_export=%s", ofs->config.nfs_export ? in ovl_show_options()
361 if (ofs->config.xino != ovl_xino_def()) in ovl_show_options()
362 seq_printf(m, ",xino=%s", ovl_xino_str[ofs->config.xino]); in ovl_show_options()
363 if (ofs->config.metacopy != ovl_metacopy_def) in ovl_show_options()
365 ofs->config.metacopy ? "on" : "off"); in ovl_show_options()
371 struct ovl_fs *ofs = sb->s_fs_info; in ovl_remount() local
373 if (!(*flags & SB_RDONLY) && ovl_force_readonly(ofs)) in ovl_remount()
614 static struct dentry *ovl_workdir_create(struct ovl_fs *ofs, in ovl_workdir_create() argument
617 struct inode *dir = ofs->workbasedir->d_inode; in ovl_workdir_create()
618 struct vfsmount *mnt = ofs->upper_mnt; in ovl_workdir_create()
628 work = lookup_one_len(name, ofs->workbasedir, strlen(name)); in ovl_workdir_create()
696 ofs->config.workdir, name, -err); in ovl_workdir_create()
765 static int ovl_check_namelen(struct path *path, struct ovl_fs *ofs, in ovl_check_namelen() argument
774 ofs->namelen = max(ofs->namelen, statfs.f_namelen); in ovl_check_namelen()
780 struct ovl_fs *ofs, int *stack_depth, bool *remote) in ovl_lower_dir() argument
789 err = ovl_check_namelen(path, ofs, name); in ovl_lower_dir()
803 if ((ofs->config.nfs_export || in ovl_lower_dir()
804 (ofs->config.index && ofs->config.upperdir)) && !fh_type) { in ovl_lower_dir()
805 ofs->config.index = false; in ovl_lower_dir()
806 ofs->config.nfs_export = false; in ovl_lower_dir()
813 ofs->xino_bits = 0; in ovl_lower_dir()
1013 static int ovl_report_in_use(struct ovl_fs *ofs, const char *name) in ovl_report_in_use() argument
1015 if (ofs->config.index) { in ovl_report_in_use()
1026 static int ovl_get_upper(struct super_block *sb, struct ovl_fs *ofs, in ovl_get_upper() argument
1032 err = ovl_mount_dir(ofs->config.upperdir, upperpath); in ovl_get_upper()
1043 err = ovl_check_namelen(upperpath, ofs, ofs->config.upperdir); in ovl_get_upper()
1047 err = ovl_setup_trap(sb, upperpath->dentry, &ofs->upperdir_trap, in ovl_get_upper()
1061 ofs->upper_mnt = upper_mnt; in ovl_get_upper()
1063 if (ovl_inuse_trylock(ofs->upper_mnt->mnt_root)) { in ovl_get_upper()
1064 ofs->upperdir_locked = true; in ovl_get_upper()
1066 err = ovl_report_in_use(ofs, "upperdir"); in ovl_get_upper()
1076 static int ovl_make_workdir(struct super_block *sb, struct ovl_fs *ofs, in ovl_make_workdir() argument
1079 struct vfsmount *mnt = ofs->upper_mnt; in ovl_make_workdir()
1088 ofs->workdir = ovl_workdir_create(ofs, OVL_WORKDIR_NAME, false); in ovl_make_workdir()
1089 if (!ofs->workdir) in ovl_make_workdir()
1092 err = ovl_setup_trap(sb, ofs->workdir, &ofs->workdir_trap, "workdir"); in ovl_make_workdir()
1114 temp = ovl_do_tmpfile(ofs->workdir, S_IFREG | 0); in ovl_make_workdir()
1115 ofs->tmpfile = !IS_ERR(temp); in ovl_make_workdir()
1116 if (ofs->tmpfile) in ovl_make_workdir()
1124 err = ovl_do_setxattr(ofs->workdir, OVL_XATTR_OPAQUE, "0", 1, 0); in ovl_make_workdir()
1126 ofs->noxattr = true; in ovl_make_workdir()
1127 ofs->config.index = false; in ovl_make_workdir()
1128 ofs->config.metacopy = false; in ovl_make_workdir()
1132 vfs_removexattr(ofs->workdir, OVL_XATTR_OPAQUE); in ovl_make_workdir()
1136 fh_type = ovl_can_decode_fh(ofs->workdir->d_sb); in ovl_make_workdir()
1137 if (ofs->config.index && !fh_type) { in ovl_make_workdir()
1138 ofs->config.index = false; in ovl_make_workdir()
1144 ofs->xino_bits = 0; in ovl_make_workdir()
1147 if (ofs->config.nfs_export && !ofs->config.index) { in ovl_make_workdir()
1149 ofs->config.nfs_export = false; in ovl_make_workdir()
1156 static int ovl_get_workdir(struct super_block *sb, struct ovl_fs *ofs, in ovl_get_workdir() argument
1162 err = ovl_mount_dir(ofs->config.workdir, &workpath); in ovl_get_workdir()
1176 ofs->workbasedir = dget(workpath.dentry); in ovl_get_workdir()
1178 if (ovl_inuse_trylock(ofs->workbasedir)) { in ovl_get_workdir()
1179 ofs->workdir_locked = true; in ovl_get_workdir()
1181 err = ovl_report_in_use(ofs, "workdir"); in ovl_get_workdir()
1186 err = ovl_setup_trap(sb, ofs->workbasedir, &ofs->workbasedir_trap, in ovl_get_workdir()
1191 err = ovl_make_workdir(sb, ofs, &workpath); in ovl_get_workdir()
1199 static int ovl_get_indexdir(struct super_block *sb, struct ovl_fs *ofs, in ovl_get_indexdir() argument
1202 struct vfsmount *mnt = ofs->upper_mnt; in ovl_get_indexdir()
1217 ofs->indexdir = ovl_workdir_create(ofs, OVL_INDEXDIR_NAME, true); in ovl_get_indexdir()
1218 if (ofs->indexdir) { in ovl_get_indexdir()
1219 err = ovl_setup_trap(sb, ofs->indexdir, &ofs->indexdir_trap, in ovl_get_indexdir()
1232 if (ovl_check_origin_xattr(ofs->indexdir)) { in ovl_get_indexdir()
1233 err = ovl_verify_set_fh(ofs->indexdir, OVL_XATTR_ORIGIN, in ovl_get_indexdir()
1238 err = ovl_verify_upper(ofs->indexdir, upperpath->dentry, true); in ovl_get_indexdir()
1244 err = ovl_indexdir_cleanup(ofs); in ovl_get_indexdir()
1246 if (err || !ofs->indexdir) in ovl_get_indexdir()
1254 static bool ovl_lower_uuid_ok(struct ovl_fs *ofs, const uuid_t *uuid) in ovl_lower_uuid_ok() argument
1258 if (!ofs->config.nfs_export && !(ofs->config.index && ofs->upper_mnt)) in ovl_lower_uuid_ok()
1261 for (i = 0; i < ofs->numlowerfs; i++) { in ovl_lower_uuid_ok()
1267 if (uuid_equal(&ofs->lower_fs[i].sb->s_uuid, uuid)) in ovl_lower_uuid_ok()
1274 static int ovl_get_fsid(struct ovl_fs *ofs, const struct path *path) in ovl_get_fsid() argument
1282 if (ofs->upper_mnt && ofs->upper_mnt->mnt_sb == sb) in ovl_get_fsid()
1285 for (i = 0; i < ofs->numlowerfs; i++) { in ovl_get_fsid()
1286 if (ofs->lower_fs[i].sb == sb) in ovl_get_fsid()
1290 if (!ovl_lower_uuid_ok(ofs, &sb->s_uuid)) { in ovl_get_fsid()
1291 ofs->config.index = false; in ovl_get_fsid()
1292 ofs->config.nfs_export = false; in ovl_get_fsid()
1304 ofs->lower_fs[ofs->numlowerfs].sb = sb; in ovl_get_fsid()
1305 ofs->lower_fs[ofs->numlowerfs].pseudo_dev = dev; in ovl_get_fsid()
1306 ofs->numlowerfs++; in ovl_get_fsid()
1308 return ofs->numlowerfs; in ovl_get_fsid()
1311 static int ovl_get_lower_layers(struct super_block *sb, struct ovl_fs *ofs, in ovl_get_lower_layers() argument
1318 ofs->lower_layers = kcalloc(numlower, sizeof(struct ovl_layer), in ovl_get_lower_layers()
1320 if (ofs->lower_layers == NULL) in ovl_get_lower_layers()
1323 ofs->lower_fs = kcalloc(numlower, sizeof(struct ovl_sb), in ovl_get_lower_layers()
1325 if (ofs->lower_fs == NULL) in ovl_get_lower_layers()
1333 err = fsid = ovl_get_fsid(ofs, &stack[i]); in ovl_get_lower_layers()
1342 err = ovl_report_in_use(ofs, "lowerdir"); in ovl_get_lower_layers()
1361 ofs->lower_layers[ofs->numlower].trap = trap; in ovl_get_lower_layers()
1362 ofs->lower_layers[ofs->numlower].mnt = mnt; in ovl_get_lower_layers()
1363 ofs->lower_layers[ofs->numlower].idx = i + 1; in ovl_get_lower_layers()
1364 ofs->lower_layers[ofs->numlower].fsid = fsid; in ovl_get_lower_layers()
1366 ofs->lower_layers[ofs->numlower].fs = in ovl_get_lower_layers()
1367 &ofs->lower_fs[fsid - 1]; in ovl_get_lower_layers()
1369 ofs->numlower++; in ovl_get_lower_layers()
1380 if (!ofs->numlowerfs || (ofs->numlowerfs == 1 && !ofs->upper_mnt)) { in ovl_get_lower_layers()
1381 ofs->xino_bits = 0; in ovl_get_lower_layers()
1382 ofs->config.xino = OVL_XINO_OFF; in ovl_get_lower_layers()
1383 } else if (ofs->config.xino == OVL_XINO_ON && !ofs->xino_bits) { in ovl_get_lower_layers()
1390 ofs->xino_bits = ilog2(ofs->numlowerfs) + 1; in ovl_get_lower_layers()
1393 if (ofs->xino_bits) { in ovl_get_lower_layers()
1395 ofs->xino_bits); in ovl_get_lower_layers()
1404 struct ovl_fs *ofs) in ovl_get_lowerstack() argument
1414 lowertmp = kstrdup(ofs->config.lowerdir, GFP_KERNEL); in ovl_get_lowerstack()
1424 } else if (!ofs->config.upperdir && stacklen == 1) { in ovl_get_lowerstack()
1427 } else if (!ofs->config.upperdir && ofs->config.nfs_export && in ovl_get_lowerstack()
1428 ofs->config.redirect_follow) { in ovl_get_lowerstack()
1430 ofs->config.nfs_export = false; in ovl_get_lowerstack()
1441 err = ovl_lower_dir(lower, &stack[numlower], ofs, in ovl_get_lowerstack()
1456 err = ovl_get_lower_layers(sb, ofs, stack, numlower); in ovl_get_lowerstack()
1467 oe->lowerstack[i].layer = &ofs->lower_layers[i]; in ovl_get_lowerstack()
1493 static int ovl_check_layer(struct super_block *sb, struct ovl_fs *ofs, in ovl_check_layer() argument
1510 err = ovl_report_in_use(ofs, name); in ovl_check_layer()
1526 struct ovl_fs *ofs) in ovl_check_overlapping_layers() argument
1530 if (ofs->upper_mnt) { in ovl_check_overlapping_layers()
1531 err = ovl_check_layer(sb, ofs, ofs->upper_mnt->mnt_root, in ovl_check_overlapping_layers()
1543 err = ovl_check_layer(sb, ofs, ofs->workbasedir, "workdir"); in ovl_check_overlapping_layers()
1548 for (i = 0; i < ofs->numlower; i++) { in ovl_check_overlapping_layers()
1549 err = ovl_check_layer(sb, ofs, in ovl_check_overlapping_layers()
1550 ofs->lower_layers[i].mnt->mnt_root, in ovl_check_overlapping_layers()
1564 struct ovl_fs *ofs; in ovl_fill_super() local
1569 ofs = kzalloc(sizeof(struct ovl_fs), GFP_KERNEL); in ovl_fill_super()
1570 if (!ofs) in ovl_fill_super()
1573 ofs->creator_cred = cred = prepare_creds(); in ovl_fill_super()
1577 ofs->config.index = ovl_index_def; in ovl_fill_super()
1578 ofs->config.nfs_export = ovl_nfs_export_def; in ovl_fill_super()
1579 ofs->config.xino = ovl_xino_def(); in ovl_fill_super()
1580 ofs->config.metacopy = ovl_metacopy_def; in ovl_fill_super()
1581 err = ovl_parse_opt((char *) data, &ofs->config); in ovl_fill_super()
1586 if (!ofs->config.lowerdir) { in ovl_fill_super()
1595 if (ofs->config.xino != OVL_XINO_OFF) in ovl_fill_super()
1596 ofs->xino_bits = BITS_PER_LONG - 32; in ovl_fill_super()
1601 if (ofs->config.upperdir) { in ovl_fill_super()
1602 if (!ofs->config.workdir) { in ovl_fill_super()
1607 err = ovl_get_upper(sb, ofs, &upperpath); in ovl_fill_super()
1611 err = ovl_get_workdir(sb, ofs, &upperpath); in ovl_fill_super()
1615 if (!ofs->workdir) in ovl_fill_super()
1618 sb->s_stack_depth = ofs->upper_mnt->mnt_sb->s_stack_depth; in ovl_fill_super()
1619 sb->s_time_gran = ofs->upper_mnt->mnt_sb->s_time_gran; in ovl_fill_super()
1622 oe = ovl_get_lowerstack(sb, ofs); in ovl_fill_super()
1628 if (!ofs->upper_mnt) in ovl_fill_super()
1631 if (!(ovl_force_readonly(ofs)) && ofs->config.index) { in ovl_fill_super()
1632 err = ovl_get_indexdir(sb, ofs, oe, &upperpath); in ovl_fill_super()
1637 if (!ofs->indexdir) { in ovl_fill_super()
1638 dput(ofs->workdir); in ovl_fill_super()
1639 ofs->workdir = NULL; in ovl_fill_super()
1645 err = ovl_check_overlapping_layers(sb, ofs); in ovl_fill_super()
1650 if (!ofs->indexdir) { in ovl_fill_super()
1651 ofs->config.index = false; in ovl_fill_super()
1652 if (ofs->upper_mnt && ofs->config.nfs_export) { in ovl_fill_super()
1654 ofs->config.nfs_export = false; in ovl_fill_super()
1658 if (ofs->config.metacopy && ofs->config.nfs_export) { in ovl_fill_super()
1660 ofs->config.nfs_export = false; in ovl_fill_super()
1663 if (ofs->config.nfs_export) in ovl_fill_super()
1671 sb->s_fs_info = ofs; in ovl_fill_super()
1704 ovl_free_fs(ofs); in ovl_fill_super()