dir.c 23 KB

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