dir.c 25 KB

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