dir.c 24 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075
  1. /*
  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. #include <linux/fs.h>
  10. #include <linux/namei.h>
  11. #include <linux/xattr.h>
  12. #include <linux/security.h>
  13. #include <linux/cred.h>
  14. #include <linux/module.h>
  15. #include <linux/posix_acl.h>
  16. #include <linux/posix_acl_xattr.h>
  17. #include <linux/atomic.h>
  18. #include <linux/ratelimit.h>
  19. #include "overlayfs.h"
  20. static unsigned short ovl_redirect_max = 256;
  21. module_param_named(redirect_max, ovl_redirect_max, ushort, 0644);
  22. MODULE_PARM_DESC(ovl_redirect_max,
  23. "Maximum length of absolute redirect xattr value");
  24. void ovl_cleanup(struct inode *wdir, struct dentry *wdentry)
  25. {
  26. int err;
  27. dget(wdentry);
  28. if (d_is_dir(wdentry))
  29. err = ovl_do_rmdir(wdir, wdentry);
  30. else
  31. err = ovl_do_unlink(wdir, wdentry);
  32. dput(wdentry);
  33. if (err) {
  34. pr_err("overlayfs: cleanup of '%pd2' failed (%i)\n",
  35. wdentry, err);
  36. }
  37. }
  38. struct dentry *ovl_lookup_temp(struct dentry *workdir, struct dentry *dentry)
  39. {
  40. struct dentry *temp;
  41. char name[20];
  42. static atomic_t temp_id = ATOMIC_INIT(0);
  43. /* counter is allowed to wrap, since temp dentries are ephemeral */
  44. snprintf(name, sizeof(name), "#%x", atomic_inc_return(&temp_id));
  45. temp = lookup_one_len(name, workdir, strlen(name));
  46. if (!IS_ERR(temp) && temp->d_inode) {
  47. pr_err("overlayfs: workdir/%s already exists\n", name);
  48. dput(temp);
  49. temp = ERR_PTR(-EIO);
  50. }
  51. return temp;
  52. }
  53. /* caller holds i_mutex on workdir */
  54. static struct dentry *ovl_whiteout(struct dentry *workdir,
  55. struct dentry *dentry)
  56. {
  57. int err;
  58. struct dentry *whiteout;
  59. struct inode *wdir = workdir->d_inode;
  60. whiteout = ovl_lookup_temp(workdir, dentry);
  61. if (IS_ERR(whiteout))
  62. return whiteout;
  63. err = ovl_do_whiteout(wdir, whiteout);
  64. if (err) {
  65. dput(whiteout);
  66. whiteout = ERR_PTR(err);
  67. }
  68. return whiteout;
  69. }
  70. int ovl_create_real(struct inode *dir, struct dentry *newdentry,
  71. struct cattr *attr, struct dentry *hardlink, bool debug)
  72. {
  73. int err;
  74. if (newdentry->d_inode)
  75. return -ESTALE;
  76. if (hardlink) {
  77. err = ovl_do_link(hardlink, dir, newdentry, debug);
  78. } else {
  79. switch (attr->mode & S_IFMT) {
  80. case S_IFREG:
  81. err = ovl_do_create(dir, newdentry, attr->mode, debug);
  82. break;
  83. case S_IFDIR:
  84. err = ovl_do_mkdir(dir, newdentry, attr->mode, debug);
  85. break;
  86. case S_IFCHR:
  87. case S_IFBLK:
  88. case S_IFIFO:
  89. case S_IFSOCK:
  90. err = ovl_do_mknod(dir, newdentry,
  91. attr->mode, attr->rdev, debug);
  92. break;
  93. case S_IFLNK:
  94. err = ovl_do_symlink(dir, newdentry, attr->link, debug);
  95. break;
  96. default:
  97. err = -EPERM;
  98. }
  99. }
  100. if (!err && WARN_ON(!newdentry->d_inode)) {
  101. /*
  102. * Not quite sure if non-instantiated dentry is legal or not.
  103. * VFS doesn't seem to care so check and warn here.
  104. */
  105. err = -ENOENT;
  106. }
  107. return err;
  108. }
  109. static int ovl_set_opaque(struct dentry *dentry, struct dentry *upperdentry)
  110. {
  111. int err;
  112. err = ovl_do_setxattr(upperdentry, OVL_XATTR_OPAQUE, "y", 1, 0);
  113. if (!err)
  114. ovl_dentry_set_opaque(dentry);
  115. return err;
  116. }
  117. static int ovl_dir_getattr(struct vfsmount *mnt, struct dentry *dentry,
  118. struct kstat *stat)
  119. {
  120. int err;
  121. enum ovl_path_type type;
  122. struct path realpath;
  123. const struct cred *old_cred;
  124. type = ovl_path_real(dentry, &realpath);
  125. old_cred = ovl_override_creds(dentry->d_sb);
  126. err = vfs_getattr(&realpath, stat);
  127. revert_creds(old_cred);
  128. if (err)
  129. return err;
  130. stat->dev = dentry->d_sb->s_dev;
  131. stat->ino = dentry->d_inode->i_ino;
  132. /*
  133. * It's probably not worth it to count subdirs to get the
  134. * correct link count. nlink=1 seems to pacify 'find' and
  135. * other utilities.
  136. */
  137. if (OVL_TYPE_MERGE(type))
  138. stat->nlink = 1;
  139. return 0;
  140. }
  141. /* Common operations required to be done after creation of file on upper */
  142. static void ovl_instantiate(struct dentry *dentry, struct inode *inode,
  143. struct dentry *newdentry, bool hardlink)
  144. {
  145. ovl_dentry_version_inc(dentry->d_parent);
  146. ovl_dentry_update(dentry, newdentry);
  147. if (!hardlink) {
  148. ovl_inode_update(inode, d_inode(newdentry));
  149. ovl_copyattr(newdentry->d_inode, inode);
  150. } else {
  151. WARN_ON(ovl_inode_real(inode, NULL) != d_inode(newdentry));
  152. inc_nlink(inode);
  153. }
  154. d_instantiate(dentry, inode);
  155. }
  156. static bool ovl_type_merge(struct dentry *dentry)
  157. {
  158. return OVL_TYPE_MERGE(ovl_path_type(dentry));
  159. }
  160. static int ovl_create_upper(struct dentry *dentry, struct inode *inode,
  161. struct cattr *attr, struct dentry *hardlink)
  162. {
  163. struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
  164. struct inode *udir = upperdir->d_inode;
  165. struct dentry *newdentry;
  166. int err;
  167. if (!hardlink && !IS_POSIXACL(udir))
  168. attr->mode &= ~current_umask();
  169. inode_lock_nested(udir, I_MUTEX_PARENT);
  170. newdentry = lookup_one_len(dentry->d_name.name, upperdir,
  171. dentry->d_name.len);
  172. err = PTR_ERR(newdentry);
  173. if (IS_ERR(newdentry))
  174. goto out_unlock;
  175. err = ovl_create_real(udir, newdentry, attr, hardlink, false);
  176. if (err)
  177. goto out_dput;
  178. if (ovl_type_merge(dentry->d_parent)) {
  179. /* Setting opaque here is just an optimization, allow to fail */
  180. ovl_set_opaque(dentry, newdentry);
  181. }
  182. ovl_instantiate(dentry, inode, newdentry, !!hardlink);
  183. newdentry = NULL;
  184. out_dput:
  185. dput(newdentry);
  186. out_unlock:
  187. inode_unlock(udir);
  188. return err;
  189. }
  190. static int ovl_lock_rename_workdir(struct dentry *workdir,
  191. struct dentry *upperdir)
  192. {
  193. /* Workdir should not be the same as upperdir */
  194. if (workdir == upperdir)
  195. goto err;
  196. /* Workdir should not be subdir of upperdir and vice versa */
  197. if (lock_rename(workdir, upperdir) != NULL)
  198. goto err_unlock;
  199. return 0;
  200. err_unlock:
  201. unlock_rename(workdir, upperdir);
  202. err:
  203. pr_err("overlayfs: failed to lock workdir+upperdir\n");
  204. return -EIO;
  205. }
  206. static struct dentry *ovl_clear_empty(struct dentry *dentry,
  207. struct list_head *list)
  208. {
  209. struct dentry *workdir = ovl_workdir(dentry);
  210. struct inode *wdir = workdir->d_inode;
  211. struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
  212. struct inode *udir = upperdir->d_inode;
  213. struct path upperpath;
  214. struct dentry *upper;
  215. struct dentry *opaquedir;
  216. struct kstat stat;
  217. int err;
  218. if (WARN_ON(!workdir))
  219. return ERR_PTR(-EROFS);
  220. err = ovl_lock_rename_workdir(workdir, upperdir);
  221. if (err)
  222. goto out;
  223. ovl_path_upper(dentry, &upperpath);
  224. err = vfs_getattr(&upperpath, &stat);
  225. if (err)
  226. goto out_unlock;
  227. err = -ESTALE;
  228. if (!S_ISDIR(stat.mode))
  229. goto out_unlock;
  230. upper = upperpath.dentry;
  231. if (upper->d_parent->d_inode != udir)
  232. goto out_unlock;
  233. opaquedir = ovl_lookup_temp(workdir, dentry);
  234. err = PTR_ERR(opaquedir);
  235. if (IS_ERR(opaquedir))
  236. goto out_unlock;
  237. err = ovl_create_real(wdir, opaquedir,
  238. &(struct cattr){.mode = stat.mode}, NULL, true);
  239. if (err)
  240. goto out_dput;
  241. err = ovl_copy_xattr(upper, opaquedir);
  242. if (err)
  243. goto out_cleanup;
  244. err = ovl_set_opaque(dentry, opaquedir);
  245. if (err)
  246. goto out_cleanup;
  247. inode_lock(opaquedir->d_inode);
  248. err = ovl_set_attr(opaquedir, &stat);
  249. inode_unlock(opaquedir->d_inode);
  250. if (err)
  251. goto out_cleanup;
  252. err = ovl_do_rename(wdir, opaquedir, udir, upper, RENAME_EXCHANGE);
  253. if (err)
  254. goto out_cleanup;
  255. ovl_cleanup_whiteouts(upper, list);
  256. ovl_cleanup(wdir, upper);
  257. unlock_rename(workdir, upperdir);
  258. /* dentry's upper doesn't match now, get rid of it */
  259. d_drop(dentry);
  260. return opaquedir;
  261. out_cleanup:
  262. ovl_cleanup(wdir, opaquedir);
  263. out_dput:
  264. dput(opaquedir);
  265. out_unlock:
  266. unlock_rename(workdir, upperdir);
  267. out:
  268. return ERR_PTR(err);
  269. }
  270. static struct dentry *ovl_check_empty_and_clear(struct dentry *dentry)
  271. {
  272. int err;
  273. struct dentry *ret = NULL;
  274. enum ovl_path_type type = ovl_path_type(dentry);
  275. LIST_HEAD(list);
  276. err = ovl_check_empty_dir(dentry, &list);
  277. if (err) {
  278. ret = ERR_PTR(err);
  279. goto out_free;
  280. }
  281. /*
  282. * When removing an empty opaque directory, then it makes no sense to
  283. * replace it with an exact replica of itself.
  284. *
  285. * If no upperdentry then skip clearing whiteouts.
  286. *
  287. * Can race with copy-up, since we don't hold the upperdir mutex.
  288. * Doesn't matter, since copy-up can't create a non-empty directory
  289. * from an empty one.
  290. */
  291. if (OVL_TYPE_UPPER(type) && OVL_TYPE_MERGE(type))
  292. ret = ovl_clear_empty(dentry, &list);
  293. out_free:
  294. ovl_cache_free(&list);
  295. return ret;
  296. }
  297. static int ovl_set_upper_acl(struct dentry *upperdentry, const char *name,
  298. const struct posix_acl *acl)
  299. {
  300. void *buffer;
  301. size_t size;
  302. int err;
  303. if (!IS_ENABLED(CONFIG_FS_POSIX_ACL) || !acl)
  304. return 0;
  305. size = posix_acl_to_xattr(NULL, acl, NULL, 0);
  306. buffer = kmalloc(size, GFP_KERNEL);
  307. if (!buffer)
  308. return -ENOMEM;
  309. size = posix_acl_to_xattr(&init_user_ns, acl, buffer, size);
  310. err = size;
  311. if (err < 0)
  312. goto out_free;
  313. err = vfs_setxattr(upperdentry, name, buffer, size, XATTR_CREATE);
  314. out_free:
  315. kfree(buffer);
  316. return err;
  317. }
  318. static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode,
  319. struct cattr *cattr,
  320. struct dentry *hardlink)
  321. {
  322. struct dentry *workdir = ovl_workdir(dentry);
  323. struct inode *wdir = workdir->d_inode;
  324. struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
  325. struct inode *udir = upperdir->d_inode;
  326. struct dentry *upper;
  327. struct dentry *newdentry;
  328. int err;
  329. struct posix_acl *acl, *default_acl;
  330. if (WARN_ON(!workdir))
  331. return -EROFS;
  332. if (!hardlink) {
  333. err = posix_acl_create(dentry->d_parent->d_inode,
  334. &cattr->mode, &default_acl, &acl);
  335. if (err)
  336. return err;
  337. }
  338. err = ovl_lock_rename_workdir(workdir, upperdir);
  339. if (err)
  340. goto out;
  341. newdentry = ovl_lookup_temp(workdir, dentry);
  342. err = PTR_ERR(newdentry);
  343. if (IS_ERR(newdentry))
  344. goto out_unlock;
  345. upper = lookup_one_len(dentry->d_name.name, upperdir,
  346. dentry->d_name.len);
  347. err = PTR_ERR(upper);
  348. if (IS_ERR(upper))
  349. goto out_dput;
  350. err = ovl_create_real(wdir, newdentry, cattr, hardlink, true);
  351. if (err)
  352. goto out_dput2;
  353. /*
  354. * mode could have been mutilated due to umask (e.g. sgid directory)
  355. */
  356. if (!hardlink &&
  357. !S_ISLNK(cattr->mode) &&
  358. newdentry->d_inode->i_mode != cattr->mode) {
  359. struct iattr attr = {
  360. .ia_valid = ATTR_MODE,
  361. .ia_mode = cattr->mode,
  362. };
  363. inode_lock(newdentry->d_inode);
  364. err = notify_change(newdentry, &attr, NULL);
  365. inode_unlock(newdentry->d_inode);
  366. if (err)
  367. goto out_cleanup;
  368. }
  369. if (!hardlink) {
  370. err = ovl_set_upper_acl(newdentry, XATTR_NAME_POSIX_ACL_ACCESS,
  371. acl);
  372. if (err)
  373. goto out_cleanup;
  374. err = ovl_set_upper_acl(newdentry, XATTR_NAME_POSIX_ACL_DEFAULT,
  375. default_acl);
  376. if (err)
  377. goto out_cleanup;
  378. }
  379. if (!hardlink && S_ISDIR(cattr->mode)) {
  380. err = ovl_set_opaque(dentry, newdentry);
  381. if (err)
  382. goto out_cleanup;
  383. err = ovl_do_rename(wdir, newdentry, udir, upper,
  384. RENAME_EXCHANGE);
  385. if (err)
  386. goto out_cleanup;
  387. ovl_cleanup(wdir, upper);
  388. } else {
  389. err = ovl_do_rename(wdir, newdentry, udir, upper, 0);
  390. if (err)
  391. goto out_cleanup;
  392. }
  393. ovl_instantiate(dentry, inode, newdentry, !!hardlink);
  394. newdentry = NULL;
  395. out_dput2:
  396. dput(upper);
  397. out_dput:
  398. dput(newdentry);
  399. out_unlock:
  400. unlock_rename(workdir, upperdir);
  401. out:
  402. if (!hardlink) {
  403. posix_acl_release(acl);
  404. posix_acl_release(default_acl);
  405. }
  406. return err;
  407. out_cleanup:
  408. ovl_cleanup(wdir, newdentry);
  409. goto out_dput2;
  410. }
  411. static int ovl_create_or_link(struct dentry *dentry, struct inode *inode,
  412. struct cattr *attr, struct dentry *hardlink)
  413. {
  414. int err;
  415. const struct cred *old_cred;
  416. struct cred *override_cred;
  417. err = ovl_copy_up(dentry->d_parent);
  418. if (err)
  419. return err;
  420. old_cred = ovl_override_creds(dentry->d_sb);
  421. err = -ENOMEM;
  422. override_cred = prepare_creds();
  423. if (override_cred) {
  424. override_cred->fsuid = inode->i_uid;
  425. override_cred->fsgid = inode->i_gid;
  426. if (!hardlink) {
  427. err = security_dentry_create_files_as(dentry,
  428. attr->mode, &dentry->d_name, old_cred,
  429. override_cred);
  430. if (err) {
  431. put_cred(override_cred);
  432. goto out_revert_creds;
  433. }
  434. }
  435. put_cred(override_creds(override_cred));
  436. put_cred(override_cred);
  437. if (!ovl_dentry_is_whiteout(dentry))
  438. err = ovl_create_upper(dentry, inode, attr,
  439. hardlink);
  440. else
  441. err = ovl_create_over_whiteout(dentry, inode, attr,
  442. hardlink);
  443. }
  444. out_revert_creds:
  445. revert_creds(old_cred);
  446. if (!err) {
  447. struct inode *realinode = d_inode(ovl_dentry_upper(dentry));
  448. WARN_ON(inode->i_mode != realinode->i_mode);
  449. WARN_ON(!uid_eq(inode->i_uid, realinode->i_uid));
  450. WARN_ON(!gid_eq(inode->i_gid, realinode->i_gid));
  451. }
  452. return err;
  453. }
  454. static int ovl_create_object(struct dentry *dentry, int mode, dev_t rdev,
  455. const char *link)
  456. {
  457. int err;
  458. struct inode *inode;
  459. struct cattr attr = {
  460. .rdev = rdev,
  461. .link = link,
  462. };
  463. err = ovl_want_write(dentry);
  464. if (err)
  465. goto out;
  466. err = -ENOMEM;
  467. inode = ovl_new_inode(dentry->d_sb, mode, rdev);
  468. if (!inode)
  469. goto out_drop_write;
  470. inode_init_owner(inode, dentry->d_parent->d_inode, mode);
  471. attr.mode = inode->i_mode;
  472. err = ovl_create_or_link(dentry, inode, &attr, NULL);
  473. if (err)
  474. iput(inode);
  475. out_drop_write:
  476. ovl_drop_write(dentry);
  477. out:
  478. return err;
  479. }
  480. static int ovl_create(struct inode *dir, struct dentry *dentry, umode_t mode,
  481. bool excl)
  482. {
  483. return ovl_create_object(dentry, (mode & 07777) | S_IFREG, 0, NULL);
  484. }
  485. static int ovl_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
  486. {
  487. return ovl_create_object(dentry, (mode & 07777) | S_IFDIR, 0, NULL);
  488. }
  489. static int ovl_mknod(struct inode *dir, struct dentry *dentry, umode_t mode,
  490. dev_t rdev)
  491. {
  492. /* Don't allow creation of "whiteout" on overlay */
  493. if (S_ISCHR(mode) && rdev == WHITEOUT_DEV)
  494. return -EPERM;
  495. return ovl_create_object(dentry, mode, rdev, NULL);
  496. }
  497. static int ovl_symlink(struct inode *dir, struct dentry *dentry,
  498. const char *link)
  499. {
  500. return ovl_create_object(dentry, S_IFLNK, 0, link);
  501. }
  502. static int ovl_link(struct dentry *old, struct inode *newdir,
  503. struct dentry *new)
  504. {
  505. int err;
  506. struct inode *inode;
  507. err = ovl_want_write(old);
  508. if (err)
  509. goto out;
  510. err = ovl_copy_up(old);
  511. if (err)
  512. goto out_drop_write;
  513. inode = d_inode(old);
  514. ihold(inode);
  515. err = ovl_create_or_link(new, inode, NULL, ovl_dentry_upper(old));
  516. if (err)
  517. iput(inode);
  518. out_drop_write:
  519. ovl_drop_write(old);
  520. out:
  521. return err;
  522. }
  523. static int ovl_remove_and_whiteout(struct dentry *dentry, bool is_dir)
  524. {
  525. struct dentry *workdir = ovl_workdir(dentry);
  526. struct inode *wdir = workdir->d_inode;
  527. struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
  528. struct inode *udir = upperdir->d_inode;
  529. struct dentry *whiteout;
  530. struct dentry *upper;
  531. struct dentry *opaquedir = NULL;
  532. int err;
  533. int flags = 0;
  534. if (WARN_ON(!workdir))
  535. return -EROFS;
  536. if (is_dir) {
  537. opaquedir = ovl_check_empty_and_clear(dentry);
  538. err = PTR_ERR(opaquedir);
  539. if (IS_ERR(opaquedir))
  540. goto out;
  541. }
  542. err = ovl_lock_rename_workdir(workdir, upperdir);
  543. if (err)
  544. goto out_dput;
  545. upper = lookup_one_len(dentry->d_name.name, upperdir,
  546. dentry->d_name.len);
  547. err = PTR_ERR(upper);
  548. if (IS_ERR(upper))
  549. goto out_unlock;
  550. err = -ESTALE;
  551. if ((opaquedir && upper != opaquedir) ||
  552. (!opaquedir && ovl_dentry_upper(dentry) &&
  553. upper != ovl_dentry_upper(dentry))) {
  554. goto out_dput_upper;
  555. }
  556. whiteout = ovl_whiteout(workdir, dentry);
  557. err = PTR_ERR(whiteout);
  558. if (IS_ERR(whiteout))
  559. goto out_dput_upper;
  560. if (d_is_dir(upper))
  561. flags = RENAME_EXCHANGE;
  562. err = ovl_do_rename(wdir, whiteout, udir, upper, flags);
  563. if (err)
  564. goto kill_whiteout;
  565. if (flags)
  566. ovl_cleanup(wdir, upper);
  567. ovl_dentry_version_inc(dentry->d_parent);
  568. out_d_drop:
  569. d_drop(dentry);
  570. dput(whiteout);
  571. out_dput_upper:
  572. dput(upper);
  573. out_unlock:
  574. unlock_rename(workdir, upperdir);
  575. out_dput:
  576. dput(opaquedir);
  577. out:
  578. return err;
  579. kill_whiteout:
  580. ovl_cleanup(wdir, whiteout);
  581. goto out_d_drop;
  582. }
  583. static int ovl_remove_upper(struct dentry *dentry, bool is_dir)
  584. {
  585. struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
  586. struct inode *dir = upperdir->d_inode;
  587. struct dentry *upper;
  588. struct dentry *opaquedir = NULL;
  589. int err;
  590. /* Redirect dir can be !ovl_lower_positive && OVL_TYPE_MERGE */
  591. if (is_dir && ovl_dentry_get_redirect(dentry)) {
  592. opaquedir = ovl_check_empty_and_clear(dentry);
  593. err = PTR_ERR(opaquedir);
  594. if (IS_ERR(opaquedir))
  595. goto out;
  596. }
  597. inode_lock_nested(dir, I_MUTEX_PARENT);
  598. upper = lookup_one_len(dentry->d_name.name, upperdir,
  599. dentry->d_name.len);
  600. err = PTR_ERR(upper);
  601. if (IS_ERR(upper))
  602. goto out_unlock;
  603. err = -ESTALE;
  604. if ((opaquedir && upper != opaquedir) ||
  605. (!opaquedir && upper != ovl_dentry_upper(dentry)))
  606. goto out_dput_upper;
  607. if (is_dir)
  608. err = vfs_rmdir(dir, upper);
  609. else
  610. err = vfs_unlink(dir, upper, NULL);
  611. ovl_dentry_version_inc(dentry->d_parent);
  612. /*
  613. * Keeping this dentry hashed would mean having to release
  614. * upperpath/lowerpath, which could only be done if we are the
  615. * sole user of this dentry. Too tricky... Just unhash for
  616. * now.
  617. */
  618. if (!err)
  619. d_drop(dentry);
  620. out_dput_upper:
  621. dput(upper);
  622. out_unlock:
  623. inode_unlock(dir);
  624. dput(opaquedir);
  625. out:
  626. return err;
  627. }
  628. static int ovl_do_remove(struct dentry *dentry, bool is_dir)
  629. {
  630. enum ovl_path_type type;
  631. int err;
  632. const struct cred *old_cred;
  633. err = ovl_want_write(dentry);
  634. if (err)
  635. goto out;
  636. err = ovl_copy_up(dentry->d_parent);
  637. if (err)
  638. goto out_drop_write;
  639. type = ovl_path_type(dentry);
  640. old_cred = ovl_override_creds(dentry->d_sb);
  641. if (!ovl_lower_positive(dentry))
  642. err = ovl_remove_upper(dentry, is_dir);
  643. else
  644. err = ovl_remove_and_whiteout(dentry, is_dir);
  645. revert_creds(old_cred);
  646. if (!err) {
  647. if (is_dir)
  648. clear_nlink(dentry->d_inode);
  649. else
  650. drop_nlink(dentry->d_inode);
  651. }
  652. out_drop_write:
  653. ovl_drop_write(dentry);
  654. out:
  655. return err;
  656. }
  657. static int ovl_unlink(struct inode *dir, struct dentry *dentry)
  658. {
  659. return ovl_do_remove(dentry, false);
  660. }
  661. static int ovl_rmdir(struct inode *dir, struct dentry *dentry)
  662. {
  663. return ovl_do_remove(dentry, true);
  664. }
  665. static bool ovl_type_merge_or_lower(struct dentry *dentry)
  666. {
  667. enum ovl_path_type type = ovl_path_type(dentry);
  668. return OVL_TYPE_MERGE(type) || !OVL_TYPE_UPPER(type);
  669. }
  670. static bool ovl_can_move(struct dentry *dentry)
  671. {
  672. return ovl_redirect_dir(dentry->d_sb) ||
  673. !d_is_dir(dentry) || !ovl_type_merge_or_lower(dentry);
  674. }
  675. static char *ovl_get_redirect(struct dentry *dentry, bool samedir)
  676. {
  677. char *buf, *ret;
  678. struct dentry *d, *tmp;
  679. int buflen = ovl_redirect_max + 1;
  680. if (samedir) {
  681. ret = kstrndup(dentry->d_name.name, dentry->d_name.len,
  682. GFP_KERNEL);
  683. goto out;
  684. }
  685. buf = ret = kmalloc(buflen, GFP_TEMPORARY);
  686. if (!buf)
  687. goto out;
  688. buflen--;
  689. buf[buflen] = '\0';
  690. for (d = dget(dentry); !IS_ROOT(d);) {
  691. const char *name;
  692. int thislen;
  693. spin_lock(&d->d_lock);
  694. name = ovl_dentry_get_redirect(d);
  695. if (name) {
  696. thislen = strlen(name);
  697. } else {
  698. name = d->d_name.name;
  699. thislen = d->d_name.len;
  700. }
  701. /* If path is too long, fall back to userspace move */
  702. if (thislen + (name[0] != '/') > buflen) {
  703. ret = ERR_PTR(-EXDEV);
  704. spin_unlock(&d->d_lock);
  705. goto out_put;
  706. }
  707. buflen -= thislen;
  708. memcpy(&buf[buflen], name, thislen);
  709. tmp = dget_dlock(d->d_parent);
  710. spin_unlock(&d->d_lock);
  711. dput(d);
  712. d = tmp;
  713. /* Absolute redirect: finished */
  714. if (buf[buflen] == '/')
  715. break;
  716. buflen--;
  717. buf[buflen] = '/';
  718. }
  719. ret = kstrdup(&buf[buflen], GFP_KERNEL);
  720. out_put:
  721. dput(d);
  722. kfree(buf);
  723. out:
  724. return ret ? ret : ERR_PTR(-ENOMEM);
  725. }
  726. static int ovl_set_redirect(struct dentry *dentry, bool samedir)
  727. {
  728. int err;
  729. const char *redirect = ovl_dentry_get_redirect(dentry);
  730. if (redirect && (samedir || redirect[0] == '/'))
  731. return 0;
  732. redirect = ovl_get_redirect(dentry, samedir);
  733. if (IS_ERR(redirect))
  734. return PTR_ERR(redirect);
  735. err = ovl_do_setxattr(ovl_dentry_upper(dentry), OVL_XATTR_REDIRECT,
  736. redirect, strlen(redirect), 0);
  737. if (!err) {
  738. spin_lock(&dentry->d_lock);
  739. ovl_dentry_set_redirect(dentry, redirect);
  740. spin_unlock(&dentry->d_lock);
  741. } else {
  742. kfree(redirect);
  743. if (err == -EOPNOTSUPP)
  744. ovl_clear_redirect_dir(dentry->d_sb);
  745. else
  746. pr_warn_ratelimited("overlay: failed to set redirect (%i)\n", err);
  747. /* Fall back to userspace copy-up */
  748. err = -EXDEV;
  749. }
  750. return err;
  751. }
  752. static int ovl_rename(struct inode *olddir, struct dentry *old,
  753. struct inode *newdir, struct dentry *new,
  754. unsigned int flags)
  755. {
  756. int err;
  757. struct dentry *old_upperdir;
  758. struct dentry *new_upperdir;
  759. struct dentry *olddentry;
  760. struct dentry *newdentry;
  761. struct dentry *trap;
  762. bool old_opaque;
  763. bool new_opaque;
  764. bool cleanup_whiteout = false;
  765. bool overwrite = !(flags & RENAME_EXCHANGE);
  766. bool is_dir = d_is_dir(old);
  767. bool new_is_dir = d_is_dir(new);
  768. bool samedir = olddir == newdir;
  769. struct dentry *opaquedir = NULL;
  770. const struct cred *old_cred = NULL;
  771. err = -EINVAL;
  772. if (flags & ~(RENAME_EXCHANGE | RENAME_NOREPLACE))
  773. goto out;
  774. flags &= ~RENAME_NOREPLACE;
  775. /* Don't copy up directory trees */
  776. err = -EXDEV;
  777. if (!ovl_can_move(old))
  778. goto out;
  779. if (!overwrite && !ovl_can_move(new))
  780. goto out;
  781. err = ovl_want_write(old);
  782. if (err)
  783. goto out;
  784. err = ovl_copy_up(old);
  785. if (err)
  786. goto out_drop_write;
  787. err = ovl_copy_up(new->d_parent);
  788. if (err)
  789. goto out_drop_write;
  790. if (!overwrite) {
  791. err = ovl_copy_up(new);
  792. if (err)
  793. goto out_drop_write;
  794. }
  795. old_cred = ovl_override_creds(old->d_sb);
  796. if (overwrite && new_is_dir && ovl_type_merge_or_lower(new)) {
  797. opaquedir = ovl_check_empty_and_clear(new);
  798. err = PTR_ERR(opaquedir);
  799. if (IS_ERR(opaquedir)) {
  800. opaquedir = NULL;
  801. goto out_revert_creds;
  802. }
  803. }
  804. if (overwrite) {
  805. if (ovl_lower_positive(old)) {
  806. if (!ovl_dentry_is_whiteout(new)) {
  807. /* Whiteout source */
  808. flags |= RENAME_WHITEOUT;
  809. } else {
  810. /* Switch whiteouts */
  811. flags |= RENAME_EXCHANGE;
  812. }
  813. } else if (is_dir && ovl_dentry_is_whiteout(new)) {
  814. flags |= RENAME_EXCHANGE;
  815. cleanup_whiteout = true;
  816. }
  817. }
  818. old_upperdir = ovl_dentry_upper(old->d_parent);
  819. new_upperdir = ovl_dentry_upper(new->d_parent);
  820. trap = lock_rename(new_upperdir, old_upperdir);
  821. olddentry = lookup_one_len(old->d_name.name, old_upperdir,
  822. old->d_name.len);
  823. err = PTR_ERR(olddentry);
  824. if (IS_ERR(olddentry))
  825. goto out_unlock;
  826. err = -ESTALE;
  827. if (olddentry != ovl_dentry_upper(old))
  828. goto out_dput_old;
  829. newdentry = lookup_one_len(new->d_name.name, new_upperdir,
  830. new->d_name.len);
  831. err = PTR_ERR(newdentry);
  832. if (IS_ERR(newdentry))
  833. goto out_dput_old;
  834. old_opaque = ovl_dentry_is_opaque(old);
  835. new_opaque = ovl_dentry_is_opaque(new);
  836. err = -ESTALE;
  837. if (ovl_dentry_upper(new)) {
  838. if (opaquedir) {
  839. if (newdentry != opaquedir)
  840. goto out_dput;
  841. } else {
  842. if (newdentry != ovl_dentry_upper(new))
  843. goto out_dput;
  844. }
  845. } else {
  846. if (!d_is_negative(newdentry) &&
  847. (!new_opaque || !ovl_is_whiteout(newdentry)))
  848. goto out_dput;
  849. }
  850. if (olddentry == trap)
  851. goto out_dput;
  852. if (newdentry == trap)
  853. goto out_dput;
  854. if (WARN_ON(olddentry->d_inode == newdentry->d_inode))
  855. goto out_dput;
  856. err = 0;
  857. if (is_dir) {
  858. if (ovl_type_merge_or_lower(old))
  859. err = ovl_set_redirect(old, samedir);
  860. else if (!old_opaque && ovl_type_merge(new->d_parent))
  861. err = ovl_set_opaque(old, olddentry);
  862. if (err)
  863. goto out_dput;
  864. }
  865. if (!overwrite && new_is_dir) {
  866. if (ovl_type_merge_or_lower(new))
  867. err = ovl_set_redirect(new, samedir);
  868. else if (!new_opaque && ovl_type_merge(old->d_parent))
  869. err = ovl_set_opaque(new, newdentry);
  870. if (err)
  871. goto out_dput;
  872. }
  873. err = ovl_do_rename(old_upperdir->d_inode, olddentry,
  874. new_upperdir->d_inode, newdentry, flags);
  875. if (err)
  876. goto out_dput;
  877. if (cleanup_whiteout)
  878. ovl_cleanup(old_upperdir->d_inode, newdentry);
  879. ovl_dentry_version_inc(old->d_parent);
  880. ovl_dentry_version_inc(new->d_parent);
  881. out_dput:
  882. dput(newdentry);
  883. out_dput_old:
  884. dput(olddentry);
  885. out_unlock:
  886. unlock_rename(new_upperdir, old_upperdir);
  887. out_revert_creds:
  888. revert_creds(old_cred);
  889. out_drop_write:
  890. ovl_drop_write(old);
  891. out:
  892. dput(opaquedir);
  893. return err;
  894. }
  895. const struct inode_operations ovl_dir_inode_operations = {
  896. .lookup = ovl_lookup,
  897. .mkdir = ovl_mkdir,
  898. .symlink = ovl_symlink,
  899. .unlink = ovl_unlink,
  900. .rmdir = ovl_rmdir,
  901. .rename = ovl_rename,
  902. .link = ovl_link,
  903. .setattr = ovl_setattr,
  904. .create = ovl_create,
  905. .mknod = ovl_mknod,
  906. .permission = ovl_permission,
  907. .getattr = ovl_dir_getattr,
  908. .listxattr = ovl_listxattr,
  909. .get_acl = ovl_get_acl,
  910. .update_time = ovl_update_time,
  911. };