dir.c 24 KB

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