blob: ec31711d48869cbcba7a9c156e36321e574c1c2c [file] [log] [blame]
Miklos Szeredie9be9d52014-10-24 00:14:38 +02001/*
2 *
3 * Copyright (C) 2011 Novell Inc.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 as published by
7 * the Free Software Foundation.
8 */
9
10#include <linux/fs.h>
11#include <linux/namei.h>
12#include <linux/xattr.h>
13#include <linux/security.h>
14#include <linux/mount.h>
15#include <linux/slab.h>
16#include <linux/parser.h>
17#include <linux/module.h>
18#include <linux/sched.h>
Andy Whitcroftcc259632014-10-24 00:14:38 +020019#include <linux/statfs.h>
Erez Zadokf45827e82014-10-24 00:14:38 +020020#include <linux/seq_file.h>
Miklos Szeredie9be9d52014-10-24 00:14:38 +020021#include "overlayfs.h"
22
23MODULE_AUTHOR("Miklos Szeredi <miklos@szeredi.hu>");
24MODULE_DESCRIPTION("Overlay filesystem");
25MODULE_LICENSE("GPL");
26
Erez Zadokf45827e82014-10-24 00:14:38 +020027struct ovl_config {
28 char *lowerdir;
29 char *upperdir;
30 char *workdir;
Miklos Szeredi8d3095f2015-10-12 17:11:44 +020031 bool default_permissions;
Erez Zadokf45827e82014-10-24 00:14:38 +020032};
33
Miklos Szeredie9be9d52014-10-24 00:14:38 +020034/* private information held for overlayfs's superblock */
35struct ovl_fs {
36 struct vfsmount *upper_mnt;
Miklos Szeredidd662662014-12-13 00:59:43 +010037 unsigned numlower;
38 struct vfsmount **lower_mnt;
Miklos Szeredie9be9d52014-10-24 00:14:38 +020039 struct dentry *workdir;
Andy Whitcroftcc259632014-10-24 00:14:38 +020040 long lower_namelen;
Erez Zadokf45827e82014-10-24 00:14:38 +020041 /* pathnames of lower and upper dirs, for show_options */
42 struct ovl_config config;
Miklos Szeredie9be9d52014-10-24 00:14:38 +020043};
44
45struct ovl_dir_cache;
46
47/* private information held for every overlayfs dentry */
48struct ovl_entry {
49 struct dentry *__upperdentry;
Miklos Szeredie9be9d52014-10-24 00:14:38 +020050 struct ovl_dir_cache *cache;
51 union {
52 struct {
53 u64 version;
54 bool opaque;
55 };
56 struct rcu_head rcu;
57 };
Miklos Szeredidd662662014-12-13 00:59:43 +010058 unsigned numlower;
59 struct path lowerstack[];
Miklos Szeredie9be9d52014-10-24 00:14:38 +020060};
61
Miklos Szeredia78d9f02014-12-13 00:59:52 +010062#define OVL_MAX_STACK 500
63
Miklos Szeredidd662662014-12-13 00:59:43 +010064static struct dentry *__ovl_dentry_lower(struct ovl_entry *oe)
65{
66 return oe->numlower ? oe->lowerstack[0].dentry : NULL;
67}
Miklos Szeredie9be9d52014-10-24 00:14:38 +020068
69enum ovl_path_type ovl_path_type(struct dentry *dentry)
70{
71 struct ovl_entry *oe = dentry->d_fsdata;
Miklos Szeredi1afaba12014-12-13 00:59:42 +010072 enum ovl_path_type type = 0;
Miklos Szeredie9be9d52014-10-24 00:14:38 +020073
74 if (oe->__upperdentry) {
Miklos Szeredi1afaba12014-12-13 00:59:42 +010075 type = __OVL_PATH_UPPER;
76
Miklos Szeredidd662662014-12-13 00:59:43 +010077 if (oe->numlower) {
Miklos Szeredie9be9d52014-10-24 00:14:38 +020078 if (S_ISDIR(dentry->d_inode->i_mode))
Miklos Szeredi1afaba12014-12-13 00:59:42 +010079 type |= __OVL_PATH_MERGE;
80 } else if (!oe->opaque) {
81 type |= __OVL_PATH_PURE;
Miklos Szeredie9be9d52014-10-24 00:14:38 +020082 }
Miklos Szeredi9d7459d2014-12-13 00:59:44 +010083 } else {
84 if (oe->numlower > 1)
85 type |= __OVL_PATH_MERGE;
Miklos Szeredie9be9d52014-10-24 00:14:38 +020086 }
Miklos Szeredi1afaba12014-12-13 00:59:42 +010087 return type;
Miklos Szeredie9be9d52014-10-24 00:14:38 +020088}
89
90static struct dentry *ovl_upperdentry_dereference(struct ovl_entry *oe)
91{
Miklos Szeredi71d50922014-11-20 16:40:01 +010092 return lockless_dereference(oe->__upperdentry);
Miklos Szeredie9be9d52014-10-24 00:14:38 +020093}
94
95void ovl_path_upper(struct dentry *dentry, struct path *path)
96{
97 struct ovl_fs *ofs = dentry->d_sb->s_fs_info;
98 struct ovl_entry *oe = dentry->d_fsdata;
99
100 path->mnt = ofs->upper_mnt;
101 path->dentry = ovl_upperdentry_dereference(oe);
102}
103
104enum ovl_path_type ovl_path_real(struct dentry *dentry, struct path *path)
105{
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200106 enum ovl_path_type type = ovl_path_type(dentry);
107
Miklos Szeredi1afaba12014-12-13 00:59:42 +0100108 if (!OVL_TYPE_UPPER(type))
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200109 ovl_path_lower(dentry, path);
110 else
111 ovl_path_upper(dentry, path);
112
113 return type;
114}
115
116struct dentry *ovl_dentry_upper(struct dentry *dentry)
117{
118 struct ovl_entry *oe = dentry->d_fsdata;
119
120 return ovl_upperdentry_dereference(oe);
121}
122
123struct dentry *ovl_dentry_lower(struct dentry *dentry)
124{
125 struct ovl_entry *oe = dentry->d_fsdata;
126
Miklos Szeredidd662662014-12-13 00:59:43 +0100127 return __ovl_dentry_lower(oe);
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200128}
129
130struct dentry *ovl_dentry_real(struct dentry *dentry)
131{
132 struct ovl_entry *oe = dentry->d_fsdata;
133 struct dentry *realdentry;
134
135 realdentry = ovl_upperdentry_dereference(oe);
136 if (!realdentry)
Miklos Szeredidd662662014-12-13 00:59:43 +0100137 realdentry = __ovl_dentry_lower(oe);
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200138
139 return realdentry;
140}
141
142struct dentry *ovl_entry_real(struct ovl_entry *oe, bool *is_upper)
143{
144 struct dentry *realdentry;
145
146 realdentry = ovl_upperdentry_dereference(oe);
147 if (realdentry) {
148 *is_upper = true;
149 } else {
Miklos Szeredidd662662014-12-13 00:59:43 +0100150 realdentry = __ovl_dentry_lower(oe);
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200151 *is_upper = false;
152 }
153 return realdentry;
154}
155
Miklos Szeredi8d3095f2015-10-12 17:11:44 +0200156struct vfsmount *ovl_entry_mnt_real(struct ovl_entry *oe, struct inode *inode,
157 bool is_upper)
158{
159 if (is_upper) {
160 struct ovl_fs *ofs = inode->i_sb->s_fs_info;
161
162 return ofs->upper_mnt;
163 } else {
164 return oe->numlower ? oe->lowerstack[0].mnt : NULL;
165 }
166}
167
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200168struct ovl_dir_cache *ovl_dir_cache(struct dentry *dentry)
169{
170 struct ovl_entry *oe = dentry->d_fsdata;
171
172 return oe->cache;
173}
174
Miklos Szeredi8d3095f2015-10-12 17:11:44 +0200175bool ovl_is_default_permissions(struct inode *inode)
176{
177 struct ovl_fs *ofs = inode->i_sb->s_fs_info;
178
179 return ofs->config.default_permissions;
180}
181
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200182void ovl_set_dir_cache(struct dentry *dentry, struct ovl_dir_cache *cache)
183{
184 struct ovl_entry *oe = dentry->d_fsdata;
185
186 oe->cache = cache;
187}
188
189void ovl_path_lower(struct dentry *dentry, struct path *path)
190{
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200191 struct ovl_entry *oe = dentry->d_fsdata;
192
Miklos Szeredidd662662014-12-13 00:59:43 +0100193 *path = oe->numlower ? oe->lowerstack[0] : (struct path) { NULL, NULL };
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200194}
195
196int ovl_want_write(struct dentry *dentry)
197{
198 struct ovl_fs *ofs = dentry->d_sb->s_fs_info;
199 return mnt_want_write(ofs->upper_mnt);
200}
201
202void ovl_drop_write(struct dentry *dentry)
203{
204 struct ovl_fs *ofs = dentry->d_sb->s_fs_info;
205 mnt_drop_write(ofs->upper_mnt);
206}
207
208struct dentry *ovl_workdir(struct dentry *dentry)
209{
210 struct ovl_fs *ofs = dentry->d_sb->s_fs_info;
211 return ofs->workdir;
212}
213
214bool ovl_dentry_is_opaque(struct dentry *dentry)
215{
216 struct ovl_entry *oe = dentry->d_fsdata;
217 return oe->opaque;
218}
219
220void ovl_dentry_set_opaque(struct dentry *dentry, bool opaque)
221{
222 struct ovl_entry *oe = dentry->d_fsdata;
223 oe->opaque = opaque;
224}
225
226void ovl_dentry_update(struct dentry *dentry, struct dentry *upperdentry)
227{
228 struct ovl_entry *oe = dentry->d_fsdata;
229
230 WARN_ON(!mutex_is_locked(&upperdentry->d_parent->d_inode->i_mutex));
231 WARN_ON(oe->__upperdentry);
232 BUG_ON(!upperdentry->d_inode);
233 /*
234 * Make sure upperdentry is consistent before making it visible to
235 * ovl_upperdentry_dereference().
236 */
237 smp_wmb();
238 oe->__upperdentry = upperdentry;
239}
240
241void ovl_dentry_version_inc(struct dentry *dentry)
242{
243 struct ovl_entry *oe = dentry->d_fsdata;
244
245 WARN_ON(!mutex_is_locked(&dentry->d_inode->i_mutex));
246 oe->version++;
247}
248
249u64 ovl_dentry_version_get(struct dentry *dentry)
250{
251 struct ovl_entry *oe = dentry->d_fsdata;
252
253 WARN_ON(!mutex_is_locked(&dentry->d_inode->i_mutex));
254 return oe->version;
255}
256
257bool ovl_is_whiteout(struct dentry *dentry)
258{
259 struct inode *inode = dentry->d_inode;
260
261 return inode && IS_WHITEOUT(inode);
262}
263
264static bool ovl_is_opaquedir(struct dentry *dentry)
265{
266 int res;
267 char val;
268 struct inode *inode = dentry->d_inode;
269
270 if (!S_ISDIR(inode->i_mode) || !inode->i_op->getxattr)
271 return false;
272
hujianyangcead89b2014-11-24 18:25:21 +0800273 res = inode->i_op->getxattr(dentry, OVL_XATTR_OPAQUE, &val, 1);
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200274 if (res == 1 && val == 'y')
275 return true;
276
277 return false;
278}
279
280static void ovl_dentry_release(struct dentry *dentry)
281{
282 struct ovl_entry *oe = dentry->d_fsdata;
283
284 if (oe) {
Miklos Szeredidd662662014-12-13 00:59:43 +0100285 unsigned int i;
286
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200287 dput(oe->__upperdentry);
Miklos Szeredidd662662014-12-13 00:59:43 +0100288 for (i = 0; i < oe->numlower; i++)
289 dput(oe->lowerstack[i].dentry);
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200290 kfree_rcu(oe, rcu);
291 }
292}
293
Miklos Szeredi7c03b5d2015-06-22 13:53:48 +0200294static int ovl_dentry_revalidate(struct dentry *dentry, unsigned int flags)
295{
296 struct ovl_entry *oe = dentry->d_fsdata;
297 unsigned int i;
298 int ret = 1;
299
300 for (i = 0; i < oe->numlower; i++) {
301 struct dentry *d = oe->lowerstack[i].dentry;
302
303 if (d->d_flags & DCACHE_OP_REVALIDATE) {
304 ret = d->d_op->d_revalidate(d, flags);
305 if (ret < 0)
306 return ret;
307 if (!ret) {
308 if (!(flags & LOOKUP_RCU))
309 d_invalidate(d);
310 return -ESTALE;
311 }
312 }
313 }
314 return 1;
315}
316
317static int ovl_dentry_weak_revalidate(struct dentry *dentry, unsigned int flags)
318{
319 struct ovl_entry *oe = dentry->d_fsdata;
320 unsigned int i;
321 int ret = 1;
322
323 for (i = 0; i < oe->numlower; i++) {
324 struct dentry *d = oe->lowerstack[i].dentry;
325
326 if (d->d_flags & DCACHE_OP_WEAK_REVALIDATE) {
327 ret = d->d_op->d_weak_revalidate(d, flags);
328 if (ret <= 0)
329 break;
330 }
331 }
332 return ret;
333}
334
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200335static const struct dentry_operations ovl_dentry_operations = {
336 .d_release = ovl_dentry_release,
David Howells4bacc9c2015-06-18 14:32:31 +0100337 .d_select_inode = ovl_d_select_inode,
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200338};
339
Miklos Szeredi7c03b5d2015-06-22 13:53:48 +0200340static const struct dentry_operations ovl_reval_dentry_operations = {
341 .d_release = ovl_dentry_release,
342 .d_revalidate = ovl_dentry_revalidate,
343 .d_weak_revalidate = ovl_dentry_weak_revalidate,
344};
345
Miklos Szeredidd662662014-12-13 00:59:43 +0100346static struct ovl_entry *ovl_alloc_entry(unsigned int numlower)
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200347{
Miklos Szeredidd662662014-12-13 00:59:43 +0100348 size_t size = offsetof(struct ovl_entry, lowerstack[numlower]);
349 struct ovl_entry *oe = kzalloc(size, GFP_KERNEL);
350
351 if (oe)
352 oe->numlower = numlower;
353
354 return oe;
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200355}
356
Miklos Szeredi7c03b5d2015-06-22 13:53:48 +0200357static bool ovl_dentry_remote(struct dentry *dentry)
358{
359 return dentry->d_flags &
360 (DCACHE_OP_REVALIDATE | DCACHE_OP_WEAK_REVALIDATE);
361}
362
363static bool ovl_dentry_weird(struct dentry *dentry)
364{
365 return dentry->d_flags & (DCACHE_NEED_AUTOMOUNT |
366 DCACHE_MANAGE_TRANSIT |
367 DCACHE_OP_HASH |
368 DCACHE_OP_COMPARE);
369}
370
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200371static inline struct dentry *ovl_lookup_real(struct dentry *dir,
372 struct qstr *name)
373{
374 struct dentry *dentry;
375
376 mutex_lock(&dir->d_inode->i_mutex);
377 dentry = lookup_one_len(name->name, dir, name->len);
378 mutex_unlock(&dir->d_inode->i_mutex);
379
380 if (IS_ERR(dentry)) {
381 if (PTR_ERR(dentry) == -ENOENT)
382 dentry = NULL;
383 } else if (!dentry->d_inode) {
384 dput(dentry);
385 dentry = NULL;
Miklos Szeredi7c03b5d2015-06-22 13:53:48 +0200386 } else if (ovl_dentry_weird(dentry)) {
Miklos Szeredia6f15d92015-06-22 13:53:48 +0200387 dput(dentry);
Miklos Szeredi7c03b5d2015-06-22 13:53:48 +0200388 /* Don't support traversing automounts and other weirdness */
Miklos Szeredia6f15d92015-06-22 13:53:48 +0200389 dentry = ERR_PTR(-EREMOTE);
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200390 }
391 return dentry;
392}
393
Miklos Szeredi5ef88da2014-12-13 00:59:43 +0100394/*
395 * Returns next layer in stack starting from top.
396 * Returns -1 if this is the last layer.
397 */
398int ovl_path_next(int idx, struct dentry *dentry, struct path *path)
399{
400 struct ovl_entry *oe = dentry->d_fsdata;
401
402 BUG_ON(idx < 0);
403 if (idx == 0) {
404 ovl_path_upper(dentry, path);
405 if (path->dentry)
406 return oe->numlower ? 1 : -1;
407 idx++;
408 }
409 BUG_ON(idx > oe->numlower);
410 *path = oe->lowerstack[idx - 1];
411
412 return (idx < oe->numlower) ? idx + 1 : -1;
413}
414
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200415struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
416 unsigned int flags)
417{
418 struct ovl_entry *oe;
Miklos Szeredi3d3c6b82014-12-13 00:59:44 +0100419 struct ovl_entry *poe = dentry->d_parent->d_fsdata;
420 struct path *stack = NULL;
421 struct dentry *upperdir, *upperdentry = NULL;
422 unsigned int ctr = 0;
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200423 struct inode *inode = NULL;
Miklos Szeredi3d3c6b82014-12-13 00:59:44 +0100424 bool upperopaque = false;
425 struct dentry *this, *prev = NULL;
426 unsigned int i;
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200427 int err;
428
Miklos Szeredi3d3c6b82014-12-13 00:59:44 +0100429 upperdir = ovl_upperdentry_dereference(poe);
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200430 if (upperdir) {
Miklos Szeredi3d3c6b82014-12-13 00:59:44 +0100431 this = ovl_lookup_real(upperdir, &dentry->d_name);
432 err = PTR_ERR(this);
433 if (IS_ERR(this))
434 goto out;
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200435
Miklos Szeredi3e01cee2014-12-13 00:59:45 +0100436 if (this) {
Miklos Szeredi7c03b5d2015-06-22 13:53:48 +0200437 if (unlikely(ovl_dentry_remote(this))) {
438 dput(this);
439 err = -EREMOTE;
440 goto out;
441 }
Miklos Szeredi3d3c6b82014-12-13 00:59:44 +0100442 if (ovl_is_whiteout(this)) {
443 dput(this);
444 this = NULL;
445 upperopaque = true;
Miklos Szeredi3e01cee2014-12-13 00:59:45 +0100446 } else if (poe->numlower && ovl_is_opaquedir(this)) {
Miklos Szeredi3d3c6b82014-12-13 00:59:44 +0100447 upperopaque = true;
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200448 }
449 }
Miklos Szeredi3d3c6b82014-12-13 00:59:44 +0100450 upperdentry = prev = this;
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200451 }
452
Miklos Szeredi3d3c6b82014-12-13 00:59:44 +0100453 if (!upperopaque && poe->numlower) {
454 err = -ENOMEM;
455 stack = kcalloc(poe->numlower, sizeof(struct path), GFP_KERNEL);
456 if (!stack)
457 goto out_put_upper;
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200458 }
459
Miklos Szeredi3d3c6b82014-12-13 00:59:44 +0100460 for (i = 0; !upperopaque && i < poe->numlower; i++) {
461 bool opaque = false;
462 struct path lowerpath = poe->lowerstack[i];
463
Miklos Szeredi3d3c6b82014-12-13 00:59:44 +0100464 this = ovl_lookup_real(lowerpath.dentry, &dentry->d_name);
465 err = PTR_ERR(this);
Miklos Szeredi09e10322014-12-13 00:59:45 +0100466 if (IS_ERR(this)) {
467 /*
468 * If it's positive, then treat ENAMETOOLONG as ENOENT.
469 */
470 if (err == -ENAMETOOLONG && (upperdentry || ctr))
471 continue;
Miklos Szeredi3d3c6b82014-12-13 00:59:44 +0100472 goto out_put;
Miklos Szeredi09e10322014-12-13 00:59:45 +0100473 }
Miklos Szeredi3d3c6b82014-12-13 00:59:44 +0100474 if (!this)
475 continue;
Miklos Szeredi3e01cee2014-12-13 00:59:45 +0100476 if (ovl_is_whiteout(this)) {
477 dput(this);
478 break;
Miklos Szeredi3d3c6b82014-12-13 00:59:44 +0100479 }
480 /*
Miklos Szeredi3e01cee2014-12-13 00:59:45 +0100481 * Only makes sense to check opaque dir if this is not the
482 * lowermost layer.
483 */
484 if (i < poe->numlower - 1 && ovl_is_opaquedir(this))
485 opaque = true;
hujianyanga425c032015-01-06 16:10:01 +0800486
487 if (prev && (!S_ISDIR(prev->d_inode->i_mode) ||
488 !S_ISDIR(this->d_inode->i_mode))) {
489 /*
490 * FIXME: check for upper-opaqueness maybe better done
491 * in remove code.
492 */
Miklos Szeredi3d3c6b82014-12-13 00:59:44 +0100493 if (prev == upperdentry)
494 upperopaque = true;
495 dput(this);
496 break;
497 }
hujianyanga425c032015-01-06 16:10:01 +0800498 /*
499 * If this is a non-directory then stop here.
500 */
501 if (!S_ISDIR(this->d_inode->i_mode))
502 opaque = true;
503
Miklos Szeredi3d3c6b82014-12-13 00:59:44 +0100504 stack[ctr].dentry = this;
505 stack[ctr].mnt = lowerpath.mnt;
506 ctr++;
507 prev = this;
508 if (opaque)
509 break;
510 }
511
512 oe = ovl_alloc_entry(ctr);
513 err = -ENOMEM;
514 if (!oe)
515 goto out_put;
516
517 if (upperdentry || ctr) {
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200518 struct dentry *realdentry;
519
Miklos Szeredi3d3c6b82014-12-13 00:59:44 +0100520 realdentry = upperdentry ? upperdentry : stack[0].dentry;
521
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200522 err = -ENOMEM;
523 inode = ovl_new_inode(dentry->d_sb, realdentry->d_inode->i_mode,
524 oe);
525 if (!inode)
Miklos Szeredi3d3c6b82014-12-13 00:59:44 +0100526 goto out_free_oe;
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200527 ovl_copyattr(realdentry->d_inode, inode);
528 }
529
Miklos Szeredi3d3c6b82014-12-13 00:59:44 +0100530 oe->opaque = upperopaque;
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200531 oe->__upperdentry = upperdentry;
Miklos Szeredi3d3c6b82014-12-13 00:59:44 +0100532 memcpy(oe->lowerstack, stack, sizeof(struct path) * ctr);
533 kfree(stack);
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200534 dentry->d_fsdata = oe;
535 d_add(dentry, inode);
536
537 return NULL;
538
Miklos Szeredi3d3c6b82014-12-13 00:59:44 +0100539out_free_oe:
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200540 kfree(oe);
Miklos Szeredi3d3c6b82014-12-13 00:59:44 +0100541out_put:
542 for (i = 0; i < ctr; i++)
543 dput(stack[i].dentry);
544 kfree(stack);
545out_put_upper:
546 dput(upperdentry);
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200547out:
548 return ERR_PTR(err);
549}
550
551struct file *ovl_path_open(struct path *path, int flags)
552{
553 return dentry_open(path, flags, current_cred());
554}
555
556static void ovl_put_super(struct super_block *sb)
557{
558 struct ovl_fs *ufs = sb->s_fs_info;
Miklos Szeredidd662662014-12-13 00:59:43 +0100559 unsigned i;
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200560
561 dput(ufs->workdir);
562 mntput(ufs->upper_mnt);
Miklos Szeredidd662662014-12-13 00:59:43 +0100563 for (i = 0; i < ufs->numlower; i++)
564 mntput(ufs->lower_mnt[i]);
Konstantin Khlebnikov5ffdbe82015-08-24 15:57:19 +0300565 kfree(ufs->lower_mnt);
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200566
Erez Zadokf45827e82014-10-24 00:14:38 +0200567 kfree(ufs->config.lowerdir);
568 kfree(ufs->config.upperdir);
569 kfree(ufs->config.workdir);
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200570 kfree(ufs);
571}
572
Andy Whitcroftcc259632014-10-24 00:14:38 +0200573/**
574 * ovl_statfs
575 * @sb: The overlayfs super block
576 * @buf: The struct kstatfs to fill in with stats
577 *
578 * Get the filesystem statistics. As writes always target the upper layer
Miklos Szeredi4ebc5812014-12-13 00:59:46 +0100579 * filesystem pass the statfs to the upper filesystem (if it exists)
Andy Whitcroftcc259632014-10-24 00:14:38 +0200580 */
581static int ovl_statfs(struct dentry *dentry, struct kstatfs *buf)
582{
583 struct ovl_fs *ofs = dentry->d_sb->s_fs_info;
584 struct dentry *root_dentry = dentry->d_sb->s_root;
585 struct path path;
586 int err;
587
Miklos Szeredi4ebc5812014-12-13 00:59:46 +0100588 ovl_path_real(root_dentry, &path);
Andy Whitcroftcc259632014-10-24 00:14:38 +0200589
590 err = vfs_statfs(&path, buf);
591 if (!err) {
592 buf->f_namelen = max(buf->f_namelen, ofs->lower_namelen);
593 buf->f_type = OVERLAYFS_SUPER_MAGIC;
594 }
595
596 return err;
597}
598
Erez Zadokf45827e82014-10-24 00:14:38 +0200599/**
600 * ovl_show_options
601 *
602 * Prints the mount options for a given superblock.
603 * Returns zero; does not fail.
604 */
605static int ovl_show_options(struct seq_file *m, struct dentry *dentry)
606{
607 struct super_block *sb = dentry->d_sb;
608 struct ovl_fs *ufs = sb->s_fs_info;
609
610 seq_printf(m, ",lowerdir=%s", ufs->config.lowerdir);
Miklos Szeredi53a08cb2014-12-13 00:59:51 +0100611 if (ufs->config.upperdir) {
612 seq_printf(m, ",upperdir=%s", ufs->config.upperdir);
613 seq_printf(m, ",workdir=%s", ufs->config.workdir);
614 }
Miklos Szeredi8d3095f2015-10-12 17:11:44 +0200615 if (ufs->config.default_permissions)
616 seq_puts(m, ",default_permissions");
Erez Zadokf45827e82014-10-24 00:14:38 +0200617 return 0;
618}
619
Seunghun Lee3cdf6fe2015-01-03 02:26:49 +0900620static int ovl_remount(struct super_block *sb, int *flags, char *data)
621{
622 struct ovl_fs *ufs = sb->s_fs_info;
623
Miklos Szeredicc6f67b2015-05-19 14:30:12 +0200624 if (!(*flags & MS_RDONLY) && (!ufs->upper_mnt || !ufs->workdir))
Seunghun Lee3cdf6fe2015-01-03 02:26:49 +0900625 return -EROFS;
626
627 return 0;
628}
629
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200630static const struct super_operations ovl_super_operations = {
631 .put_super = ovl_put_super,
Andy Whitcroftcc259632014-10-24 00:14:38 +0200632 .statfs = ovl_statfs,
Erez Zadokf45827e82014-10-24 00:14:38 +0200633 .show_options = ovl_show_options,
Seunghun Lee3cdf6fe2015-01-03 02:26:49 +0900634 .remount_fs = ovl_remount,
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200635};
636
637enum {
638 OPT_LOWERDIR,
639 OPT_UPPERDIR,
640 OPT_WORKDIR,
Miklos Szeredi8d3095f2015-10-12 17:11:44 +0200641 OPT_DEFAULT_PERMISSIONS,
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200642 OPT_ERR,
643};
644
645static const match_table_t ovl_tokens = {
646 {OPT_LOWERDIR, "lowerdir=%s"},
647 {OPT_UPPERDIR, "upperdir=%s"},
648 {OPT_WORKDIR, "workdir=%s"},
Miklos Szeredi8d3095f2015-10-12 17:11:44 +0200649 {OPT_DEFAULT_PERMISSIONS, "default_permissions"},
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200650 {OPT_ERR, NULL}
651};
652
Miklos Szeredi91c77942014-11-20 16:40:00 +0100653static char *ovl_next_opt(char **s)
654{
655 char *sbegin = *s;
656 char *p;
657
658 if (sbegin == NULL)
659 return NULL;
660
661 for (p = sbegin; *p; p++) {
662 if (*p == '\\') {
663 p++;
664 if (!*p)
665 break;
666 } else if (*p == ',') {
667 *p = '\0';
668 *s = p + 1;
669 return sbegin;
670 }
671 }
672 *s = NULL;
673 return sbegin;
674}
675
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200676static int ovl_parse_opt(char *opt, struct ovl_config *config)
677{
678 char *p;
679
Miklos Szeredi91c77942014-11-20 16:40:00 +0100680 while ((p = ovl_next_opt(&opt)) != NULL) {
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200681 int token;
682 substring_t args[MAX_OPT_ARGS];
683
684 if (!*p)
685 continue;
686
687 token = match_token(p, ovl_tokens, args);
688 switch (token) {
689 case OPT_UPPERDIR:
690 kfree(config->upperdir);
691 config->upperdir = match_strdup(&args[0]);
692 if (!config->upperdir)
693 return -ENOMEM;
694 break;
695
696 case OPT_LOWERDIR:
697 kfree(config->lowerdir);
698 config->lowerdir = match_strdup(&args[0]);
699 if (!config->lowerdir)
700 return -ENOMEM;
701 break;
702
703 case OPT_WORKDIR:
704 kfree(config->workdir);
705 config->workdir = match_strdup(&args[0]);
706 if (!config->workdir)
707 return -ENOMEM;
708 break;
709
Miklos Szeredi8d3095f2015-10-12 17:11:44 +0200710 case OPT_DEFAULT_PERMISSIONS:
711 config->default_permissions = true;
712 break;
713
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200714 default:
hujianyangbead55e2015-01-15 13:17:36 +0800715 pr_err("overlayfs: unrecognized mount option \"%s\" or missing value\n", p);
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200716 return -EINVAL;
717 }
718 }
hujianyang71cbad72015-01-15 13:20:57 +0800719
720 /* Workdir is useless in non-upper mount */
721 if (!config->upperdir && config->workdir) {
722 pr_info("overlayfs: option \"workdir=%s\" is useless in a non-upper mount, ignore\n",
723 config->workdir);
724 kfree(config->workdir);
725 config->workdir = NULL;
726 }
727
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200728 return 0;
729}
730
731#define OVL_WORKDIR_NAME "work"
732
733static struct dentry *ovl_workdir_create(struct vfsmount *mnt,
734 struct dentry *dentry)
735{
736 struct inode *dir = dentry->d_inode;
737 struct dentry *work;
738 int err;
739 bool retried = false;
740
741 err = mnt_want_write(mnt);
742 if (err)
743 return ERR_PTR(err);
744
745 mutex_lock_nested(&dir->i_mutex, I_MUTEX_PARENT);
746retry:
747 work = lookup_one_len(OVL_WORKDIR_NAME, dentry,
748 strlen(OVL_WORKDIR_NAME));
749
750 if (!IS_ERR(work)) {
751 struct kstat stat = {
752 .mode = S_IFDIR | 0,
753 };
754
755 if (work->d_inode) {
756 err = -EEXIST;
757 if (retried)
758 goto out_dput;
759
760 retried = true;
761 ovl_cleanup(dir, work);
762 dput(work);
763 goto retry;
764 }
765
766 err = ovl_create_real(dir, work, &stat, NULL, NULL, true);
767 if (err)
768 goto out_dput;
769 }
770out_unlock:
771 mutex_unlock(&dir->i_mutex);
772 mnt_drop_write(mnt);
773
774 return work;
775
776out_dput:
777 dput(work);
778 work = ERR_PTR(err);
779 goto out_unlock;
780}
781
Miklos Szeredi91c77942014-11-20 16:40:00 +0100782static void ovl_unescape(char *s)
783{
784 char *d = s;
785
786 for (;; s++, d++) {
787 if (*s == '\\')
788 s++;
789 *d = *s;
790 if (!*s)
791 break;
792 }
793}
794
Miklos Szerediab508822014-12-13 00:59:49 +0100795static int ovl_mount_dir_noesc(const char *name, struct path *path)
796{
Miklos Szeredia78d9f02014-12-13 00:59:52 +0100797 int err = -EINVAL;
Miklos Szerediab508822014-12-13 00:59:49 +0100798
Miklos Szeredia78d9f02014-12-13 00:59:52 +0100799 if (!*name) {
800 pr_err("overlayfs: empty lowerdir\n");
801 goto out;
802 }
Miklos Szerediab508822014-12-13 00:59:49 +0100803 err = kern_path(name, LOOKUP_FOLLOW, path);
804 if (err) {
805 pr_err("overlayfs: failed to resolve '%s': %i\n", name, err);
806 goto out;
807 }
808 err = -EINVAL;
Miklos Szeredi7c03b5d2015-06-22 13:53:48 +0200809 if (ovl_dentry_weird(path->dentry)) {
Miklos Szerediab508822014-12-13 00:59:49 +0100810 pr_err("overlayfs: filesystem on '%s' not supported\n", name);
811 goto out_put;
812 }
813 if (!S_ISDIR(path->dentry->d_inode->i_mode)) {
814 pr_err("overlayfs: '%s' not a directory\n", name);
815 goto out_put;
816 }
817 return 0;
818
819out_put:
820 path_put(path);
821out:
822 return err;
823}
824
825static int ovl_mount_dir(const char *name, struct path *path)
826{
827 int err = -ENOMEM;
828 char *tmp = kstrdup(name, GFP_KERNEL);
829
830 if (tmp) {
831 ovl_unescape(tmp);
832 err = ovl_mount_dir_noesc(tmp, path);
Miklos Szeredi7c03b5d2015-06-22 13:53:48 +0200833
834 if (!err)
835 if (ovl_dentry_remote(path->dentry)) {
836 pr_err("overlayfs: filesystem on '%s' not supported as upperdir\n",
837 tmp);
838 path_put(path);
839 err = -EINVAL;
840 }
Miklos Szerediab508822014-12-13 00:59:49 +0100841 kfree(tmp);
842 }
843 return err;
844}
845
846static int ovl_lower_dir(const char *name, struct path *path, long *namelen,
Miklos Szeredi7c03b5d2015-06-22 13:53:48 +0200847 int *stack_depth, bool *remote)
Miklos Szerediab508822014-12-13 00:59:49 +0100848{
849 int err;
850 struct kstatfs statfs;
851
Miklos Szeredia78d9f02014-12-13 00:59:52 +0100852 err = ovl_mount_dir_noesc(name, path);
Miklos Szerediab508822014-12-13 00:59:49 +0100853 if (err)
854 goto out;
855
856 err = vfs_statfs(path, &statfs);
857 if (err) {
858 pr_err("overlayfs: statfs failed on '%s'\n", name);
859 goto out_put;
860 }
861 *namelen = max(*namelen, statfs.f_namelen);
862 *stack_depth = max(*stack_depth, path->mnt->mnt_sb->s_stack_depth);
863
Miklos Szeredi7c03b5d2015-06-22 13:53:48 +0200864 if (ovl_dentry_remote(path->dentry))
865 *remote = true;
866
Miklos Szerediab508822014-12-13 00:59:49 +0100867 return 0;
868
869out_put:
870 path_put(path);
871out:
872 return err;
873}
874
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200875/* Workdir should not be subdir of upperdir and vice versa */
876static bool ovl_workdir_ok(struct dentry *workdir, struct dentry *upperdir)
877{
878 bool ok = false;
879
880 if (workdir != upperdir) {
881 ok = (lock_rename(workdir, upperdir) == NULL);
882 unlock_rename(workdir, upperdir);
883 }
884 return ok;
885}
886
Miklos Szeredia78d9f02014-12-13 00:59:52 +0100887static unsigned int ovl_split_lowerdirs(char *str)
888{
889 unsigned int ctr = 1;
890 char *s, *d;
891
892 for (s = d = str;; s++, d++) {
893 if (*s == '\\') {
894 s++;
895 } else if (*s == ':') {
896 *d = '\0';
897 ctr++;
898 continue;
899 }
900 *d = *s;
901 if (!*s)
902 break;
903 }
904 return ctr;
905}
906
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200907static int ovl_fill_super(struct super_block *sb, void *data, int silent)
908{
Miklos Szeredi53a08cb2014-12-13 00:59:51 +0100909 struct path upperpath = { NULL, NULL };
910 struct path workpath = { NULL, NULL };
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200911 struct dentry *root_dentry;
912 struct ovl_entry *oe;
913 struct ovl_fs *ufs;
Miklos Szeredia78d9f02014-12-13 00:59:52 +0100914 struct path *stack = NULL;
915 char *lowertmp;
916 char *lower;
917 unsigned int numlower;
918 unsigned int stacklen = 0;
Miklos Szeredidd662662014-12-13 00:59:43 +0100919 unsigned int i;
Miklos Szeredi7c03b5d2015-06-22 13:53:48 +0200920 bool remote = false;
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200921 int err;
922
Erez Zadokf45827e82014-10-24 00:14:38 +0200923 err = -ENOMEM;
924 ufs = kzalloc(sizeof(struct ovl_fs), GFP_KERNEL);
925 if (!ufs)
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200926 goto out;
927
Erez Zadokf45827e82014-10-24 00:14:38 +0200928 err = ovl_parse_opt((char *) data, &ufs->config);
929 if (err)
930 goto out_free_config;
931
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200932 err = -EINVAL;
Miklos Szeredi53a08cb2014-12-13 00:59:51 +0100933 if (!ufs->config.lowerdir) {
934 pr_err("overlayfs: missing 'lowerdir'\n");
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200935 goto out_free_config;
936 }
937
Miklos Szeredi53a08cb2014-12-13 00:59:51 +0100938 sb->s_stack_depth = 0;
939 if (ufs->config.upperdir) {
Miklos Szeredi53a08cb2014-12-13 00:59:51 +0100940 if (!ufs->config.workdir) {
941 pr_err("overlayfs: missing 'workdir'\n");
942 goto out_free_config;
943 }
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200944
Miklos Szeredi53a08cb2014-12-13 00:59:51 +0100945 err = ovl_mount_dir(ufs->config.upperdir, &upperpath);
946 if (err)
947 goto out_free_config;
Miklos Szeredi3b7a9a22014-12-13 00:59:48 +0100948
hujianyang71cbad72015-01-15 13:20:57 +0800949 /* Upper fs should not be r/o */
950 if (upperpath.mnt->mnt_sb->s_flags & MS_RDONLY) {
951 pr_err("overlayfs: upper fs is r/o, try multi-lower layers mount\n");
952 err = -EINVAL;
953 goto out_put_upperpath;
954 }
955
Miklos Szeredi53a08cb2014-12-13 00:59:51 +0100956 err = ovl_mount_dir(ufs->config.workdir, &workpath);
957 if (err)
958 goto out_put_upperpath;
959
hujianyang2f83fd82015-01-06 12:52:13 +0800960 err = -EINVAL;
Miklos Szeredi53a08cb2014-12-13 00:59:51 +0100961 if (upperpath.mnt != workpath.mnt) {
962 pr_err("overlayfs: workdir and upperdir must reside under the same mount\n");
963 goto out_put_workpath;
964 }
965 if (!ovl_workdir_ok(workpath.dentry, upperpath.dentry)) {
966 pr_err("overlayfs: workdir and upperdir must be separate subtrees\n");
967 goto out_put_workpath;
968 }
969 sb->s_stack_depth = upperpath.mnt->mnt_sb->s_stack_depth;
Miklos Szerediab508822014-12-13 00:59:49 +0100970 }
Miklos Szeredia78d9f02014-12-13 00:59:52 +0100971 err = -ENOMEM;
972 lowertmp = kstrdup(ufs->config.lowerdir, GFP_KERNEL);
973 if (!lowertmp)
Miklos Szeredi3b7a9a22014-12-13 00:59:48 +0100974 goto out_put_workpath;
Miklos Szeredie9be9d52014-10-24 00:14:38 +0200975
976 err = -EINVAL;
Miklos Szeredia78d9f02014-12-13 00:59:52 +0100977 stacklen = ovl_split_lowerdirs(lowertmp);
hujianyang6be45062015-01-15 13:19:21 +0800978 if (stacklen > OVL_MAX_STACK) {
979 pr_err("overlayfs: too many lower directries, limit is %d\n",
980 OVL_MAX_STACK);
Miklos Szeredia78d9f02014-12-13 00:59:52 +0100981 goto out_free_lowertmp;
hujianyang6be45062015-01-15 13:19:21 +0800982 } else if (!ufs->config.upperdir && stacklen == 1) {
983 pr_err("overlayfs: at least 2 lowerdir are needed while upperdir nonexistent\n");
984 goto out_free_lowertmp;
985 }
Miklos Szeredia78d9f02014-12-13 00:59:52 +0100986
987 stack = kcalloc(stacklen, sizeof(struct path), GFP_KERNEL);
988 if (!stack)
989 goto out_free_lowertmp;
990
991 lower = lowertmp;
992 for (numlower = 0; numlower < stacklen; numlower++) {
993 err = ovl_lower_dir(lower, &stack[numlower],
Miklos Szeredi7c03b5d2015-06-22 13:53:48 +0200994 &ufs->lower_namelen, &sb->s_stack_depth,
995 &remote);
Miklos Szeredia78d9f02014-12-13 00:59:52 +0100996 if (err)
997 goto out_put_lowerpath;
998
999 lower = strchr(lower, '\0') + 1;
1000 }
1001
1002 err = -EINVAL;
Miklos Szerediab508822014-12-13 00:59:49 +01001003 sb->s_stack_depth++;
Miklos Szeredi69c433e2014-10-24 00:14:39 +02001004 if (sb->s_stack_depth > FILESYSTEM_MAX_STACK_DEPTH) {
1005 pr_err("overlayfs: maximum fs stacking depth exceeded\n");
Miklos Szeredi3b7a9a22014-12-13 00:59:48 +01001006 goto out_put_lowerpath;
Miklos Szeredi69c433e2014-10-24 00:14:39 +02001007 }
1008
Miklos Szeredi53a08cb2014-12-13 00:59:51 +01001009 if (ufs->config.upperdir) {
1010 ufs->upper_mnt = clone_private_mount(&upperpath);
1011 err = PTR_ERR(ufs->upper_mnt);
1012 if (IS_ERR(ufs->upper_mnt)) {
1013 pr_err("overlayfs: failed to clone upperpath\n");
1014 goto out_put_lowerpath;
1015 }
Miklos Szeredi3b7a9a22014-12-13 00:59:48 +01001016
Miklos Szeredi53a08cb2014-12-13 00:59:51 +01001017 ufs->workdir = ovl_workdir_create(ufs->upper_mnt, workpath.dentry);
1018 err = PTR_ERR(ufs->workdir);
1019 if (IS_ERR(ufs->workdir)) {
Miklos Szeredicc6f67b2015-05-19 14:30:12 +02001020 pr_warn("overlayfs: failed to create directory %s/%s (errno: %i); mounting read-only\n",
1021 ufs->config.workdir, OVL_WORKDIR_NAME, -err);
1022 sb->s_flags |= MS_RDONLY;
1023 ufs->workdir = NULL;
Miklos Szeredi53a08cb2014-12-13 00:59:51 +01001024 }
Miklos Szeredie9be9d52014-10-24 00:14:38 +02001025 }
1026
hujianyang2f83fd82015-01-06 12:52:13 +08001027 err = -ENOMEM;
Miklos Szeredia78d9f02014-12-13 00:59:52 +01001028 ufs->lower_mnt = kcalloc(numlower, sizeof(struct vfsmount *), GFP_KERNEL);
Miklos Szeredidd662662014-12-13 00:59:43 +01001029 if (ufs->lower_mnt == NULL)
Miklos Szeredi3b7a9a22014-12-13 00:59:48 +01001030 goto out_put_workdir;
Miklos Szeredia78d9f02014-12-13 00:59:52 +01001031 for (i = 0; i < numlower; i++) {
1032 struct vfsmount *mnt = clone_private_mount(&stack[i]);
Miklos Szeredidd662662014-12-13 00:59:43 +01001033
hujianyang2f83fd82015-01-06 12:52:13 +08001034 err = PTR_ERR(mnt);
Miklos Szeredia78d9f02014-12-13 00:59:52 +01001035 if (IS_ERR(mnt)) {
1036 pr_err("overlayfs: failed to clone lowerpath\n");
1037 goto out_put_lower_mnt;
1038 }
1039 /*
1040 * Make lower_mnt R/O. That way fchmod/fchown on lower file
1041 * will fail instead of modifying lower fs.
1042 */
1043 mnt->mnt_flags |= MNT_READONLY;
1044
1045 ufs->lower_mnt[ufs->numlower] = mnt;
1046 ufs->numlower++;
Miklos Szeredie9be9d52014-10-24 00:14:38 +02001047 }
1048
hujianyang71cbad72015-01-15 13:20:57 +08001049 /* If the upper fs is nonexistent, we mark overlayfs r/o too */
1050 if (!ufs->upper_mnt)
Miklos Szeredie9be9d52014-10-24 00:14:38 +02001051 sb->s_flags |= MS_RDONLY;
1052
Miklos Szeredi7c03b5d2015-06-22 13:53:48 +02001053 if (remote)
1054 sb->s_d_op = &ovl_reval_dentry_operations;
1055 else
1056 sb->s_d_op = &ovl_dentry_operations;
Miklos Szeredie9be9d52014-10-24 00:14:38 +02001057
1058 err = -ENOMEM;
Miklos Szeredia78d9f02014-12-13 00:59:52 +01001059 oe = ovl_alloc_entry(numlower);
Miklos Szeredi3b7a9a22014-12-13 00:59:48 +01001060 if (!oe)
1061 goto out_put_lower_mnt;
Miklos Szeredie9be9d52014-10-24 00:14:38 +02001062
Miklos Szeredi3b7a9a22014-12-13 00:59:48 +01001063 root_dentry = d_make_root(ovl_new_inode(sb, S_IFDIR, oe));
Miklos Szeredie9be9d52014-10-24 00:14:38 +02001064 if (!root_dentry)
Miklos Szeredi3b7a9a22014-12-13 00:59:48 +01001065 goto out_free_oe;
Miklos Szeredie9be9d52014-10-24 00:14:38 +02001066
1067 mntput(upperpath.mnt);
Miklos Szeredia78d9f02014-12-13 00:59:52 +01001068 for (i = 0; i < numlower; i++)
1069 mntput(stack[i].mnt);
Miklos Szeredie9be9d52014-10-24 00:14:38 +02001070 path_put(&workpath);
Miklos Szeredia78d9f02014-12-13 00:59:52 +01001071 kfree(lowertmp);
Miklos Szeredie9be9d52014-10-24 00:14:38 +02001072
1073 oe->__upperdentry = upperpath.dentry;
Miklos Szeredia78d9f02014-12-13 00:59:52 +01001074 for (i = 0; i < numlower; i++) {
1075 oe->lowerstack[i].dentry = stack[i].dentry;
1076 oe->lowerstack[i].mnt = ufs->lower_mnt[i];
1077 }
Konstantin Khlebnikov0f955022015-08-24 15:57:18 +03001078 kfree(stack);
Miklos Szeredie9be9d52014-10-24 00:14:38 +02001079
1080 root_dentry->d_fsdata = oe;
1081
Miklos Szeredied06e062015-12-09 16:11:59 +01001082 ovl_copyattr(ovl_dentry_real(root_dentry)->d_inode,
1083 root_dentry->d_inode);
1084
Andy Whitcroftcc259632014-10-24 00:14:38 +02001085 sb->s_magic = OVERLAYFS_SUPER_MAGIC;
Miklos Szeredie9be9d52014-10-24 00:14:38 +02001086 sb->s_op = &ovl_super_operations;
1087 sb->s_root = root_dentry;
1088 sb->s_fs_info = ufs;
1089
1090 return 0;
1091
Miklos Szeredi3b7a9a22014-12-13 00:59:48 +01001092out_free_oe:
1093 kfree(oe);
Miklos Szeredie9be9d52014-10-24 00:14:38 +02001094out_put_lower_mnt:
Miklos Szeredidd662662014-12-13 00:59:43 +01001095 for (i = 0; i < ufs->numlower; i++)
1096 mntput(ufs->lower_mnt[i]);
1097 kfree(ufs->lower_mnt);
Miklos Szeredi3b7a9a22014-12-13 00:59:48 +01001098out_put_workdir:
1099 dput(ufs->workdir);
Miklos Szeredie9be9d52014-10-24 00:14:38 +02001100 mntput(ufs->upper_mnt);
Miklos Szeredie9be9d52014-10-24 00:14:38 +02001101out_put_lowerpath:
Miklos Szeredia78d9f02014-12-13 00:59:52 +01001102 for (i = 0; i < numlower; i++)
1103 path_put(&stack[i]);
1104 kfree(stack);
1105out_free_lowertmp:
1106 kfree(lowertmp);
Miklos Szeredi3b7a9a22014-12-13 00:59:48 +01001107out_put_workpath:
1108 path_put(&workpath);
Miklos Szeredie9be9d52014-10-24 00:14:38 +02001109out_put_upperpath:
1110 path_put(&upperpath);
Miklos Szeredie9be9d52014-10-24 00:14:38 +02001111out_free_config:
Erez Zadokf45827e82014-10-24 00:14:38 +02001112 kfree(ufs->config.lowerdir);
1113 kfree(ufs->config.upperdir);
1114 kfree(ufs->config.workdir);
1115 kfree(ufs);
Miklos Szeredie9be9d52014-10-24 00:14:38 +02001116out:
1117 return err;
1118}
1119
1120static struct dentry *ovl_mount(struct file_system_type *fs_type, int flags,
1121 const char *dev_name, void *raw_data)
1122{
1123 return mount_nodev(fs_type, flags, raw_data, ovl_fill_super);
1124}
1125
1126static struct file_system_type ovl_fs_type = {
1127 .owner = THIS_MODULE,
Miklos Szeredief94b182014-11-20 16:39:59 +01001128 .name = "overlay",
Miklos Szeredie9be9d52014-10-24 00:14:38 +02001129 .mount = ovl_mount,
1130 .kill_sb = kill_anon_super,
1131};
Miklos Szeredief94b182014-11-20 16:39:59 +01001132MODULE_ALIAS_FS("overlay");
Miklos Szeredie9be9d52014-10-24 00:14:38 +02001133
1134static int __init ovl_init(void)
1135{
1136 return register_filesystem(&ovl_fs_type);
1137}
1138
1139static void __exit ovl_exit(void)
1140{
1141 unregister_filesystem(&ovl_fs_type);
1142}
1143
1144module_init(ovl_init);
1145module_exit(ovl_exit);