dir.c 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. *
  4. * Copyright (C) 2011 Novell Inc.
  5. */
  6. #include <linux/fs.h>
  7. #include <linux/namei.h>
  8. #include <linux/xattr.h>
  9. #include <linux/security.h>
  10. #include <linux/cred.h>
  11. #include <linux/module.h>
  12. #include <linux/posix_acl.h>
  13. #include <linux/posix_acl_xattr.h>
  14. #include <linux/atomic.h>
  15. #include <linux/ratelimit.h>
  16. #include "overlayfs.h"
  17. static unsigned short ovl_redirect_max = 256;
  18. module_param_named(redirect_max, ovl_redirect_max, ushort, 0644);
  19. MODULE_PARM_DESC(redirect_max,
  20. "Maximum length of absolute redirect xattr value");
  21. static int ovl_set_redirect(struct dentry *dentry, bool samedir);
  22. int ovl_cleanup(struct ovl_fs *ofs, struct inode *wdir, struct dentry *wdentry)
  23. {
  24. int err;
  25. dget(wdentry);
  26. if (d_is_dir(wdentry))
  27. err = ovl_do_rmdir(ofs, wdir, wdentry);
  28. else
  29. err = ovl_do_unlink(ofs, wdir, wdentry);
  30. dput(wdentry);
  31. if (err) {
  32. pr_err("cleanup of '%pd2' failed (%i)\n",
  33. wdentry, err);
  34. }
  35. return err;
  36. }
  37. struct dentry *ovl_lookup_temp(struct ovl_fs *ofs, struct dentry *workdir)
  38. {
  39. struct dentry *temp;
  40. char name[20];
  41. static atomic_t temp_id = ATOMIC_INIT(0);
  42. /* counter is allowed to wrap, since temp dentries are ephemeral */
  43. snprintf(name, sizeof(name), "#%x", atomic_inc_return(&temp_id));
  44. temp = ovl_lookup_upper(ofs, name, workdir, strlen(name));
  45. if (!IS_ERR(temp) && temp->d_inode) {
  46. pr_err("workdir/%s already exists\n", name);
  47. dput(temp);
  48. temp = ERR_PTR(-EIO);
  49. }
  50. return temp;
  51. }
  52. /* caller holds i_mutex on workdir */
  53. static struct dentry *ovl_whiteout(struct ovl_fs *ofs)
  54. {
  55. int err;
  56. struct dentry *whiteout;
  57. struct dentry *workdir = ofs->workdir;
  58. struct inode *wdir = workdir->d_inode;
  59. if (!ofs->whiteout) {
  60. whiteout = ovl_lookup_temp(ofs, workdir);
  61. if (IS_ERR(whiteout))
  62. goto out;
  63. err = ovl_do_whiteout(ofs, wdir, whiteout);
  64. if (err) {
  65. dput(whiteout);
  66. whiteout = ERR_PTR(err);
  67. goto out;
  68. }
  69. ofs->whiteout = whiteout;
  70. }
  71. if (ofs->share_whiteout) {
  72. whiteout = ovl_lookup_temp(ofs, workdir);
  73. if (IS_ERR(whiteout))
  74. goto out;
  75. err = ovl_do_link(ofs, ofs->whiteout, wdir, whiteout);
  76. if (!err)
  77. goto out;
  78. if (err != -EMLINK) {
  79. pr_warn("Failed to link whiteout - disabling whiteout inode sharing(nlink=%u, err=%i)\n",
  80. ofs->whiteout->d_inode->i_nlink, err);
  81. ofs->share_whiteout = false;
  82. }
  83. dput(whiteout);
  84. }
  85. whiteout = ofs->whiteout;
  86. ofs->whiteout = NULL;
  87. out:
  88. return whiteout;
  89. }
  90. /* Caller must hold i_mutex on both workdir and dir */
  91. int ovl_cleanup_and_whiteout(struct ovl_fs *ofs, struct inode *dir,
  92. struct dentry *dentry)
  93. {
  94. struct inode *wdir = ofs->workdir->d_inode;
  95. struct dentry *whiteout;
  96. int err;
  97. int flags = 0;
  98. whiteout = ovl_whiteout(ofs);
  99. err = PTR_ERR(whiteout);
  100. if (IS_ERR(whiteout))
  101. return err;
  102. if (d_is_dir(dentry))
  103. flags = RENAME_EXCHANGE;
  104. err = ovl_do_rename(ofs, wdir, whiteout, dir, dentry, flags);
  105. if (err)
  106. goto kill_whiteout;
  107. if (flags)
  108. ovl_cleanup(ofs, wdir, dentry);
  109. out:
  110. dput(whiteout);
  111. return err;
  112. kill_whiteout:
  113. ovl_cleanup(ofs, wdir, whiteout);
  114. goto out;
  115. }
  116. int ovl_mkdir_real(struct ovl_fs *ofs, struct inode *dir,
  117. struct dentry **newdentry, umode_t mode)
  118. {
  119. int err;
  120. struct dentry *d, *dentry = *newdentry;
  121. err = ovl_do_mkdir(ofs, dir, dentry, mode);
  122. if (err)
  123. return err;
  124. if (likely(!d_unhashed(dentry)))
  125. return 0;
  126. /*
  127. * vfs_mkdir() may succeed and leave the dentry passed
  128. * to it unhashed and negative. If that happens, try to
  129. * lookup a new hashed and positive dentry.
  130. */
  131. d = ovl_lookup_upper(ofs, dentry->d_name.name, dentry->d_parent,
  132. dentry->d_name.len);
  133. if (IS_ERR(d)) {
  134. pr_warn("failed lookup after mkdir (%pd2, err=%i).\n",
  135. dentry, err);
  136. return PTR_ERR(d);
  137. }
  138. dput(dentry);
  139. *newdentry = d;
  140. return 0;
  141. }
  142. struct dentry *ovl_create_real(struct ovl_fs *ofs, struct inode *dir,
  143. struct dentry *newdentry, struct ovl_cattr *attr)
  144. {
  145. int err;
  146. if (IS_ERR(newdentry))
  147. return newdentry;
  148. err = -ESTALE;
  149. if (newdentry->d_inode)
  150. goto out;
  151. if (attr->hardlink) {
  152. err = ovl_do_link(ofs, attr->hardlink, dir, newdentry);
  153. } else {
  154. switch (attr->mode & S_IFMT) {
  155. case S_IFREG:
  156. err = ovl_do_create(ofs, dir, newdentry, attr->mode);
  157. break;
  158. case S_IFDIR:
  159. /* mkdir is special... */
  160. err = ovl_mkdir_real(ofs, dir, &newdentry, attr->mode);
  161. break;
  162. case S_IFCHR:
  163. case S_IFBLK:
  164. case S_IFIFO:
  165. case S_IFSOCK:
  166. err = ovl_do_mknod(ofs, dir, newdentry, attr->mode,
  167. attr->rdev);
  168. break;
  169. case S_IFLNK:
  170. err = ovl_do_symlink(ofs, dir, newdentry, attr->link);
  171. break;
  172. default:
  173. err = -EPERM;
  174. }
  175. }
  176. if (!err && WARN_ON(!newdentry->d_inode)) {
  177. /*
  178. * Not quite sure if non-instantiated dentry is legal or not.
  179. * VFS doesn't seem to care so check and warn here.
  180. */
  181. err = -EIO;
  182. }
  183. out:
  184. if (err) {
  185. dput(newdentry);
  186. return ERR_PTR(err);
  187. }
  188. return newdentry;
  189. }
  190. struct dentry *ovl_create_temp(struct ovl_fs *ofs, struct dentry *workdir,
  191. struct ovl_cattr *attr)
  192. {
  193. return ovl_create_real(ofs, d_inode(workdir),
  194. ovl_lookup_temp(ofs, workdir), attr);
  195. }
  196. static int ovl_set_opaque_xerr(struct dentry *dentry, struct dentry *upper,
  197. int xerr)
  198. {
  199. struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
  200. int err;
  201. err = ovl_check_setxattr(ofs, upper, OVL_XATTR_OPAQUE, "y", 1, xerr);
  202. if (!err)
  203. ovl_dentry_set_opaque(dentry);
  204. return err;
  205. }
  206. static int ovl_set_opaque(struct dentry *dentry, struct dentry *upperdentry)
  207. {
  208. /*
  209. * Fail with -EIO when trying to create opaque dir and upper doesn't
  210. * support xattrs. ovl_rename() calls ovl_set_opaque_xerr(-EXDEV) to
  211. * return a specific error for noxattr case.
  212. */
  213. return ovl_set_opaque_xerr(dentry, upperdentry, -EIO);
  214. }
  215. /*
  216. * Common operations required to be done after creation of file on upper.
  217. * If @hardlink is false, then @inode is a pre-allocated inode, we may or
  218. * may not use to instantiate the new dentry.
  219. */
  220. static int ovl_instantiate(struct dentry *dentry, struct inode *inode,
  221. struct dentry *newdentry, bool hardlink)
  222. {
  223. struct ovl_inode_params oip = {
  224. .upperdentry = newdentry,
  225. .newinode = inode,
  226. };
  227. ovl_dir_modified(dentry->d_parent, false);
  228. ovl_dentry_set_upper_alias(dentry);
  229. ovl_dentry_init_reval(dentry, newdentry);
  230. if (!hardlink) {
  231. /*
  232. * ovl_obtain_alias() can be called after ovl_create_real()
  233. * and before we get here, so we may get an inode from cache
  234. * with the same real upperdentry that is not the inode we
  235. * pre-allocated. In this case we will use the cached inode
  236. * to instantiate the new dentry.
  237. *
  238. * XXX: if we ever use ovl_obtain_alias() to decode directory
  239. * file handles, need to use ovl_get_inode_locked() and
  240. * d_instantiate_new() here to prevent from creating two
  241. * hashed directory inode aliases.
  242. */
  243. inode = ovl_get_inode(dentry->d_sb, &oip);
  244. if (IS_ERR(inode))
  245. return PTR_ERR(inode);
  246. if (inode == oip.newinode)
  247. ovl_set_flag(OVL_UPPERDATA, inode);
  248. } else {
  249. WARN_ON(ovl_inode_real(inode) != d_inode(newdentry));
  250. dput(newdentry);
  251. inc_nlink(inode);
  252. }
  253. d_instantiate(dentry, inode);
  254. if (inode != oip.newinode) {
  255. pr_warn_ratelimited("newly created inode found in cache (%pd2)\n",
  256. dentry);
  257. }
  258. /* Force lookup of new upper hardlink to find its lower */
  259. if (hardlink)
  260. d_drop(dentry);
  261. return 0;
  262. }
  263. static bool ovl_type_merge(struct dentry *dentry)
  264. {
  265. return OVL_TYPE_MERGE(ovl_path_type(dentry));
  266. }
  267. static bool ovl_type_origin(struct dentry *dentry)
  268. {
  269. return OVL_TYPE_ORIGIN(ovl_path_type(dentry));
  270. }
  271. static int ovl_create_upper(struct dentry *dentry, struct inode *inode,
  272. struct ovl_cattr *attr)
  273. {
  274. struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
  275. struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
  276. struct inode *udir = upperdir->d_inode;
  277. struct dentry *newdentry;
  278. int err;
  279. if (!attr->hardlink && !IS_POSIXACL(udir))
  280. attr->mode &= ~current_umask();
  281. inode_lock_nested(udir, I_MUTEX_PARENT);
  282. newdentry = ovl_create_real(ofs, udir,
  283. ovl_lookup_upper(ofs, dentry->d_name.name,
  284. upperdir, dentry->d_name.len),
  285. attr);
  286. err = PTR_ERR(newdentry);
  287. if (IS_ERR(newdentry))
  288. goto out_unlock;
  289. if (ovl_type_merge(dentry->d_parent) && d_is_dir(newdentry) &&
  290. !ovl_allow_offline_changes(ofs)) {
  291. /* Setting opaque here is just an optimization, allow to fail */
  292. ovl_set_opaque(dentry, newdentry);
  293. }
  294. err = ovl_instantiate(dentry, inode, newdentry, !!attr->hardlink);
  295. if (err)
  296. goto out_cleanup;
  297. out_unlock:
  298. inode_unlock(udir);
  299. return err;
  300. out_cleanup:
  301. ovl_cleanup(ofs, udir, newdentry);
  302. dput(newdentry);
  303. goto out_unlock;
  304. }
  305. static struct dentry *ovl_clear_empty(struct dentry *dentry,
  306. struct list_head *list)
  307. {
  308. struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
  309. struct dentry *workdir = ovl_workdir(dentry);
  310. struct inode *wdir = workdir->d_inode;
  311. struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
  312. struct inode *udir = upperdir->d_inode;
  313. struct path upperpath;
  314. struct dentry *upper;
  315. struct dentry *opaquedir;
  316. struct kstat stat;
  317. int err;
  318. if (WARN_ON(!workdir))
  319. return ERR_PTR(-EROFS);
  320. err = ovl_lock_rename_workdir(workdir, upperdir);
  321. if (err)
  322. goto out;
  323. ovl_path_upper(dentry, &upperpath);
  324. err = vfs_getattr(&upperpath, &stat,
  325. STATX_BASIC_STATS, AT_STATX_SYNC_AS_STAT);
  326. if (err)
  327. goto out_unlock;
  328. err = -ESTALE;
  329. if (!S_ISDIR(stat.mode))
  330. goto out_unlock;
  331. upper = upperpath.dentry;
  332. if (upper->d_parent->d_inode != udir)
  333. goto out_unlock;
  334. opaquedir = ovl_create_temp(ofs, workdir, OVL_CATTR(stat.mode));
  335. err = PTR_ERR(opaquedir);
  336. if (IS_ERR(opaquedir))
  337. goto out_unlock;
  338. err = ovl_copy_xattr(dentry->d_sb, &upperpath, opaquedir);
  339. if (err)
  340. goto out_cleanup;
  341. err = ovl_set_opaque(dentry, opaquedir);
  342. if (err)
  343. goto out_cleanup;
  344. inode_lock(opaquedir->d_inode);
  345. err = ovl_set_attr(ofs, opaquedir, &stat);
  346. inode_unlock(opaquedir->d_inode);
  347. if (err)
  348. goto out_cleanup;
  349. err = ovl_do_rename(ofs, wdir, opaquedir, udir, upper, RENAME_EXCHANGE);
  350. if (err)
  351. goto out_cleanup;
  352. ovl_cleanup_whiteouts(ofs, upper, list);
  353. ovl_cleanup(ofs, wdir, upper);
  354. unlock_rename(workdir, upperdir);
  355. /* dentry's upper doesn't match now, get rid of it */
  356. d_drop(dentry);
  357. return opaquedir;
  358. out_cleanup:
  359. ovl_cleanup(ofs, wdir, opaquedir);
  360. dput(opaquedir);
  361. out_unlock:
  362. unlock_rename(workdir, upperdir);
  363. out:
  364. return ERR_PTR(err);
  365. }
  366. static int ovl_set_upper_acl(struct ovl_fs *ofs, struct dentry *upperdentry,
  367. const char *name, const struct posix_acl *acl)
  368. {
  369. void *buffer;
  370. size_t size;
  371. int err;
  372. if (!IS_ENABLED(CONFIG_FS_POSIX_ACL) || !acl)
  373. return 0;
  374. size = posix_acl_xattr_size(acl->a_count);
  375. buffer = kmalloc(size, GFP_KERNEL);
  376. if (!buffer)
  377. return -ENOMEM;
  378. err = posix_acl_to_xattr(&init_user_ns, acl, buffer, size);
  379. if (err < 0)
  380. goto out_free;
  381. err = ovl_do_setxattr(ofs, upperdentry, name, buffer, size, XATTR_CREATE);
  382. out_free:
  383. kfree(buffer);
  384. return err;
  385. }
  386. static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode,
  387. struct ovl_cattr *cattr)
  388. {
  389. struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
  390. struct dentry *workdir = ovl_workdir(dentry);
  391. struct inode *wdir = workdir->d_inode;
  392. struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
  393. struct inode *udir = upperdir->d_inode;
  394. struct dentry *upper;
  395. struct dentry *newdentry;
  396. int err;
  397. struct posix_acl *acl, *default_acl;
  398. bool hardlink = !!cattr->hardlink;
  399. if (WARN_ON(!workdir))
  400. return -EROFS;
  401. if (!hardlink) {
  402. err = posix_acl_create(dentry->d_parent->d_inode,
  403. &cattr->mode, &default_acl, &acl);
  404. if (err)
  405. return err;
  406. }
  407. err = ovl_lock_rename_workdir(workdir, upperdir);
  408. if (err)
  409. goto out;
  410. upper = ovl_lookup_upper(ofs, dentry->d_name.name, upperdir,
  411. dentry->d_name.len);
  412. err = PTR_ERR(upper);
  413. if (IS_ERR(upper))
  414. goto out_unlock;
  415. err = -ESTALE;
  416. if (d_is_negative(upper) || !IS_WHITEOUT(d_inode(upper)))
  417. goto out_dput;
  418. newdentry = ovl_create_temp(ofs, workdir, cattr);
  419. err = PTR_ERR(newdentry);
  420. if (IS_ERR(newdentry))
  421. goto out_dput;
  422. /*
  423. * mode could have been mutilated due to umask (e.g. sgid directory)
  424. */
  425. if (!hardlink &&
  426. !S_ISLNK(cattr->mode) &&
  427. newdentry->d_inode->i_mode != cattr->mode) {
  428. struct iattr attr = {
  429. .ia_valid = ATTR_MODE,
  430. .ia_mode = cattr->mode,
  431. };
  432. inode_lock(newdentry->d_inode);
  433. err = ovl_do_notify_change(ofs, newdentry, &attr);
  434. inode_unlock(newdentry->d_inode);
  435. if (err)
  436. goto out_cleanup;
  437. }
  438. if (!hardlink) {
  439. err = ovl_set_upper_acl(ofs, newdentry,
  440. XATTR_NAME_POSIX_ACL_ACCESS, acl);
  441. if (err)
  442. goto out_cleanup;
  443. err = ovl_set_upper_acl(ofs, newdentry,
  444. XATTR_NAME_POSIX_ACL_DEFAULT, default_acl);
  445. if (err)
  446. goto out_cleanup;
  447. }
  448. if (!hardlink && S_ISDIR(cattr->mode)) {
  449. err = ovl_set_opaque(dentry, newdentry);
  450. if (err)
  451. goto out_cleanup;
  452. err = ovl_do_rename(ofs, wdir, newdentry, udir, upper,
  453. RENAME_EXCHANGE);
  454. if (err)
  455. goto out_cleanup;
  456. ovl_cleanup(ofs, wdir, upper);
  457. } else {
  458. err = ovl_do_rename(ofs, wdir, newdentry, udir, upper, 0);
  459. if (err)
  460. goto out_cleanup;
  461. }
  462. err = ovl_instantiate(dentry, inode, newdentry, hardlink);
  463. if (err) {
  464. ovl_cleanup(ofs, udir, newdentry);
  465. dput(newdentry);
  466. }
  467. out_dput:
  468. dput(upper);
  469. out_unlock:
  470. unlock_rename(workdir, upperdir);
  471. out:
  472. if (!hardlink) {
  473. posix_acl_release(acl);
  474. posix_acl_release(default_acl);
  475. }
  476. return err;
  477. out_cleanup:
  478. ovl_cleanup(ofs, wdir, newdentry);
  479. dput(newdentry);
  480. goto out_dput;
  481. }
  482. static int ovl_create_or_link(struct dentry *dentry, struct inode *inode,
  483. struct ovl_cattr *attr, bool origin)
  484. {
  485. int err;
  486. const struct cred *old_cred, *hold_cred = NULL;
  487. struct cred *override_cred;
  488. struct dentry *parent = dentry->d_parent;
  489. err = ovl_copy_up(parent);
  490. if (err)
  491. return err;
  492. old_cred = ovl_override_creds(dentry->d_sb);
  493. /*
  494. * When linking a file with copy up origin into a new parent, mark the
  495. * new parent dir "impure".
  496. */
  497. if (origin) {
  498. err = ovl_set_impure(parent, ovl_dentry_upper(parent));
  499. if (err)
  500. goto out_revert_creds;
  501. }
  502. if (!attr->hardlink) {
  503. err = -ENOMEM;
  504. override_cred = prepare_creds();
  505. if (!override_cred)
  506. goto out_revert_creds;
  507. /*
  508. * In the creation cases(create, mkdir, mknod, symlink),
  509. * ovl should transfer current's fs{u,g}id to underlying
  510. * fs. Because underlying fs want to initialize its new
  511. * inode owner using current's fs{u,g}id. And in this
  512. * case, the @inode is a new inode that is initialized
  513. * in inode_init_owner() to current's fs{u,g}id. So use
  514. * the inode's i_{u,g}id to override the cred's fs{u,g}id.
  515. *
  516. * But in the other hardlink case, ovl_link() does not
  517. * create a new inode, so just use the ovl mounter's
  518. * fs{u,g}id.
  519. */
  520. override_cred->fsuid = inode->i_uid;
  521. override_cred->fsgid = inode->i_gid;
  522. err = security_dentry_create_files_as(dentry,
  523. attr->mode, &dentry->d_name,
  524. old_cred ? old_cred : current_cred(),
  525. override_cred);
  526. if (err) {
  527. put_cred(override_cred);
  528. goto out_revert_creds;
  529. }
  530. hold_cred = override_creds(override_cred);
  531. put_cred(override_cred);
  532. }
  533. if (!ovl_dentry_is_whiteout(dentry))
  534. err = ovl_create_upper(dentry, inode, attr);
  535. else
  536. err = ovl_create_over_whiteout(dentry, inode, attr);
  537. out_revert_creds:
  538. ovl_revert_creds(dentry->d_sb, old_cred ?: hold_cred);
  539. if (old_cred && hold_cred)
  540. put_cred(hold_cred);
  541. return err;
  542. }
  543. static int ovl_create_object(struct dentry *dentry, int mode, dev_t rdev,
  544. const char *link)
  545. {
  546. int err;
  547. struct inode *inode;
  548. struct ovl_cattr attr = {
  549. .rdev = rdev,
  550. .link = link,
  551. };
  552. err = ovl_want_write(dentry);
  553. if (err)
  554. goto out;
  555. /* Preallocate inode to be used by ovl_get_inode() */
  556. err = -ENOMEM;
  557. inode = ovl_new_inode(dentry->d_sb, mode, rdev);
  558. if (!inode)
  559. goto out_drop_write;
  560. spin_lock(&inode->i_lock);
  561. inode->i_state |= I_CREATING;
  562. spin_unlock(&inode->i_lock);
  563. inode_init_owner(&init_user_ns, inode, dentry->d_parent->d_inode, mode);
  564. attr.mode = inode->i_mode;
  565. err = ovl_create_or_link(dentry, inode, &attr, false);
  566. /* Did we end up using the preallocated inode? */
  567. if (inode != d_inode(dentry))
  568. iput(inode);
  569. out_drop_write:
  570. ovl_drop_write(dentry);
  571. out:
  572. return err;
  573. }
  574. static int ovl_create(struct user_namespace *mnt_userns, struct inode *dir,
  575. struct dentry *dentry, umode_t mode, bool excl)
  576. {
  577. return ovl_create_object(dentry, (mode & 07777) | S_IFREG, 0, NULL);
  578. }
  579. static int ovl_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
  580. struct dentry *dentry, umode_t mode)
  581. {
  582. return ovl_create_object(dentry, (mode & 07777) | S_IFDIR, 0, NULL);
  583. }
  584. static int ovl_mknod(struct user_namespace *mnt_userns, struct inode *dir,
  585. struct dentry *dentry, umode_t mode, dev_t rdev)
  586. {
  587. /* Don't allow creation of "whiteout" on overlay */
  588. if (S_ISCHR(mode) && rdev == WHITEOUT_DEV)
  589. return -EPERM;
  590. return ovl_create_object(dentry, mode, rdev, NULL);
  591. }
  592. static int ovl_symlink(struct user_namespace *mnt_userns, struct inode *dir,
  593. struct dentry *dentry, const char *link)
  594. {
  595. return ovl_create_object(dentry, S_IFLNK, 0, link);
  596. }
  597. static int ovl_set_link_redirect(struct dentry *dentry)
  598. {
  599. const struct cred *old_cred;
  600. int err;
  601. old_cred = ovl_override_creds(dentry->d_sb);
  602. err = ovl_set_redirect(dentry, false);
  603. ovl_revert_creds(dentry->d_sb, old_cred);
  604. return err;
  605. }
  606. static int ovl_link(struct dentry *old, struct inode *newdir,
  607. struct dentry *new)
  608. {
  609. int err;
  610. struct inode *inode;
  611. err = ovl_want_write(old);
  612. if (err)
  613. goto out;
  614. err = ovl_copy_up(old);
  615. if (err)
  616. goto out_drop_write;
  617. err = ovl_copy_up(new->d_parent);
  618. if (err)
  619. goto out_drop_write;
  620. if (ovl_is_metacopy_dentry(old)) {
  621. err = ovl_set_link_redirect(old);
  622. if (err)
  623. goto out_drop_write;
  624. }
  625. err = ovl_nlink_start(old);
  626. if (err)
  627. goto out_drop_write;
  628. inode = d_inode(old);
  629. ihold(inode);
  630. err = ovl_create_or_link(new, inode,
  631. &(struct ovl_cattr) {.hardlink = ovl_dentry_upper(old)},
  632. ovl_type_origin(old));
  633. if (err)
  634. iput(inode);
  635. ovl_nlink_end(old);
  636. out_drop_write:
  637. ovl_drop_write(old);
  638. out:
  639. return err;
  640. }
  641. static bool ovl_matches_upper(struct dentry *dentry, struct dentry *upper)
  642. {
  643. return d_inode(ovl_dentry_upper(dentry)) == d_inode(upper);
  644. }
  645. static int ovl_remove_and_whiteout(struct dentry *dentry,
  646. struct list_head *list)
  647. {
  648. struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
  649. struct dentry *workdir = ovl_workdir(dentry);
  650. struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
  651. struct dentry *upper;
  652. struct dentry *opaquedir = NULL;
  653. int err;
  654. if (WARN_ON(!workdir))
  655. return -EROFS;
  656. if (!list_empty(list)) {
  657. opaquedir = ovl_clear_empty(dentry, list);
  658. err = PTR_ERR(opaquedir);
  659. if (IS_ERR(opaquedir))
  660. goto out;
  661. }
  662. err = ovl_lock_rename_workdir(workdir, upperdir);
  663. if (err)
  664. goto out_dput;
  665. upper = ovl_lookup_upper(ofs, dentry->d_name.name, upperdir,
  666. dentry->d_name.len);
  667. err = PTR_ERR(upper);
  668. if (IS_ERR(upper))
  669. goto out_unlock;
  670. err = -ESTALE;
  671. if ((opaquedir && upper != opaquedir) ||
  672. (!opaquedir && ovl_dentry_upper(dentry) &&
  673. !ovl_matches_upper(dentry, upper))) {
  674. goto out_dput_upper;
  675. }
  676. err = ovl_cleanup_and_whiteout(ofs, d_inode(upperdir), upper);
  677. if (err)
  678. goto out_d_drop;
  679. ovl_dir_modified(dentry->d_parent, true);
  680. out_d_drop:
  681. d_drop(dentry);
  682. out_dput_upper:
  683. dput(upper);
  684. out_unlock:
  685. unlock_rename(workdir, upperdir);
  686. out_dput:
  687. dput(opaquedir);
  688. out:
  689. return err;
  690. }
  691. static int ovl_remove_upper(struct dentry *dentry, bool is_dir,
  692. struct list_head *list)
  693. {
  694. struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
  695. struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
  696. struct inode *dir = upperdir->d_inode;
  697. struct dentry *upper;
  698. struct dentry *opaquedir = NULL;
  699. int err;
  700. if (!list_empty(list)) {
  701. opaquedir = ovl_clear_empty(dentry, list);
  702. err = PTR_ERR(opaquedir);
  703. if (IS_ERR(opaquedir))
  704. goto out;
  705. }
  706. inode_lock_nested(dir, I_MUTEX_PARENT);
  707. upper = ovl_lookup_upper(ofs, dentry->d_name.name, upperdir,
  708. dentry->d_name.len);
  709. err = PTR_ERR(upper);
  710. if (IS_ERR(upper))
  711. goto out_unlock;
  712. err = -ESTALE;
  713. if ((opaquedir && upper != opaquedir) ||
  714. (!opaquedir && !ovl_matches_upper(dentry, upper)))
  715. goto out_dput_upper;
  716. if (is_dir)
  717. err = ovl_do_rmdir(ofs, dir, upper);
  718. else
  719. err = ovl_do_unlink(ofs, dir, upper);
  720. ovl_dir_modified(dentry->d_parent, ovl_type_origin(dentry));
  721. /*
  722. * Keeping this dentry hashed would mean having to release
  723. * upperpath/lowerpath, which could only be done if we are the
  724. * sole user of this dentry. Too tricky... Just unhash for
  725. * now.
  726. */
  727. if (!err)
  728. d_drop(dentry);
  729. out_dput_upper:
  730. dput(upper);
  731. out_unlock:
  732. inode_unlock(dir);
  733. dput(opaquedir);
  734. out:
  735. return err;
  736. }
  737. static bool ovl_pure_upper(struct dentry *dentry)
  738. {
  739. return !ovl_dentry_lower(dentry) &&
  740. !ovl_test_flag(OVL_WHITEOUTS, d_inode(dentry));
  741. }
  742. static void ovl_drop_nlink(struct dentry *dentry)
  743. {
  744. struct inode *inode = d_inode(dentry);
  745. struct dentry *alias;
  746. /* Try to find another, hashed alias */
  747. spin_lock(&inode->i_lock);
  748. hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) {
  749. if (alias != dentry && !d_unhashed(alias))
  750. break;
  751. }
  752. spin_unlock(&inode->i_lock);
  753. /*
  754. * Changes to underlying layers may cause i_nlink to lose sync with
  755. * reality. In this case prevent the link count from going to zero
  756. * prematurely.
  757. */
  758. if (inode->i_nlink > !!alias)
  759. drop_nlink(inode);
  760. }
  761. static int ovl_do_remove(struct dentry *dentry, bool is_dir)
  762. {
  763. int err;
  764. const struct cred *old_cred;
  765. bool lower_positive = ovl_lower_positive(dentry);
  766. LIST_HEAD(list);
  767. /* No need to clean pure upper removed by vfs_rmdir() */
  768. if (is_dir && (lower_positive || !ovl_pure_upper(dentry))) {
  769. err = ovl_check_empty_dir(dentry, &list);
  770. if (err)
  771. goto out;
  772. }
  773. err = ovl_want_write(dentry);
  774. if (err)
  775. goto out;
  776. err = ovl_copy_up(dentry->d_parent);
  777. if (err)
  778. goto out_drop_write;
  779. err = ovl_nlink_start(dentry);
  780. if (err)
  781. goto out_drop_write;
  782. old_cred = ovl_override_creds(dentry->d_sb);
  783. if (!lower_positive)
  784. err = ovl_remove_upper(dentry, is_dir, &list);
  785. else
  786. err = ovl_remove_and_whiteout(dentry, &list);
  787. ovl_revert_creds(dentry->d_sb, old_cred);
  788. if (!err) {
  789. if (is_dir)
  790. clear_nlink(dentry->d_inode);
  791. else
  792. ovl_drop_nlink(dentry);
  793. }
  794. ovl_nlink_end(dentry);
  795. /*
  796. * Copy ctime
  797. *
  798. * Note: we fail to update ctime if there was no copy-up, only a
  799. * whiteout
  800. */
  801. if (ovl_dentry_upper(dentry))
  802. ovl_copyattr(d_inode(dentry));
  803. out_drop_write:
  804. ovl_drop_write(dentry);
  805. out:
  806. ovl_cache_free(&list);
  807. return err;
  808. }
  809. static int ovl_unlink(struct inode *dir, struct dentry *dentry)
  810. {
  811. return ovl_do_remove(dentry, false);
  812. }
  813. static int ovl_rmdir(struct inode *dir, struct dentry *dentry)
  814. {
  815. return ovl_do_remove(dentry, true);
  816. }
  817. static bool ovl_type_merge_or_lower(struct dentry *dentry)
  818. {
  819. enum ovl_path_type type = ovl_path_type(dentry);
  820. return OVL_TYPE_MERGE(type) || !OVL_TYPE_UPPER(type);
  821. }
  822. static bool ovl_can_move(struct dentry *dentry)
  823. {
  824. return ovl_redirect_dir(dentry->d_sb) ||
  825. !d_is_dir(dentry) || !ovl_type_merge_or_lower(dentry);
  826. }
  827. static char *ovl_get_redirect(struct dentry *dentry, bool abs_redirect)
  828. {
  829. char *buf, *ret;
  830. struct dentry *d, *tmp;
  831. int buflen = ovl_redirect_max + 1;
  832. if (!abs_redirect) {
  833. ret = kstrndup(dentry->d_name.name, dentry->d_name.len,
  834. GFP_KERNEL);
  835. goto out;
  836. }
  837. buf = ret = kmalloc(buflen, GFP_KERNEL);
  838. if (!buf)
  839. goto out;
  840. buflen--;
  841. buf[buflen] = '\0';
  842. for (d = dget(dentry); !IS_ROOT(d);) {
  843. const char *name;
  844. int thislen;
  845. spin_lock(&d->d_lock);
  846. name = ovl_dentry_get_redirect(d);
  847. if (name) {
  848. thislen = strlen(name);
  849. } else {
  850. name = d->d_name.name;
  851. thislen = d->d_name.len;
  852. }
  853. /* If path is too long, fall back to userspace move */
  854. if (thislen + (name[0] != '/') > buflen) {
  855. ret = ERR_PTR(-EXDEV);
  856. spin_unlock(&d->d_lock);
  857. goto out_put;
  858. }
  859. buflen -= thislen;
  860. memcpy(&buf[buflen], name, thislen);
  861. spin_unlock(&d->d_lock);
  862. tmp = dget_parent(d);
  863. dput(d);
  864. d = tmp;
  865. /* Absolute redirect: finished */
  866. if (buf[buflen] == '/')
  867. break;
  868. buflen--;
  869. buf[buflen] = '/';
  870. }
  871. ret = kstrdup(&buf[buflen], GFP_KERNEL);
  872. out_put:
  873. dput(d);
  874. kfree(buf);
  875. out:
  876. return ret ? ret : ERR_PTR(-ENOMEM);
  877. }
  878. static bool ovl_need_absolute_redirect(struct dentry *dentry, bool samedir)
  879. {
  880. struct dentry *lowerdentry;
  881. if (!samedir)
  882. return true;
  883. if (d_is_dir(dentry))
  884. return false;
  885. /*
  886. * For non-dir hardlinked files, we need absolute redirects
  887. * in general as two upper hardlinks could be in different
  888. * dirs. We could put a relative redirect now and convert
  889. * it to absolute redirect later. But when nlink > 1 and
  890. * indexing is on, that means relative redirect needs to be
  891. * converted to absolute during copy up of another lower
  892. * hardllink as well.
  893. *
  894. * So without optimizing too much, just check if lower is
  895. * a hard link or not. If lower is hard link, put absolute
  896. * redirect.
  897. */
  898. lowerdentry = ovl_dentry_lower(dentry);
  899. return (d_inode(lowerdentry)->i_nlink > 1);
  900. }
  901. static int ovl_set_redirect(struct dentry *dentry, bool samedir)
  902. {
  903. int err;
  904. struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
  905. const char *redirect = ovl_dentry_get_redirect(dentry);
  906. bool absolute_redirect = ovl_need_absolute_redirect(dentry, samedir);
  907. if (redirect && (!absolute_redirect || redirect[0] == '/'))
  908. return 0;
  909. redirect = ovl_get_redirect(dentry, absolute_redirect);
  910. if (IS_ERR(redirect))
  911. return PTR_ERR(redirect);
  912. err = ovl_check_setxattr(ofs, ovl_dentry_upper(dentry),
  913. OVL_XATTR_REDIRECT,
  914. redirect, strlen(redirect), -EXDEV);
  915. if (!err) {
  916. spin_lock(&dentry->d_lock);
  917. ovl_dentry_set_redirect(dentry, redirect);
  918. spin_unlock(&dentry->d_lock);
  919. } else {
  920. kfree(redirect);
  921. pr_warn_ratelimited("failed to set redirect (%i)\n",
  922. err);
  923. /* Fall back to userspace copy-up */
  924. err = -EXDEV;
  925. }
  926. return err;
  927. }
  928. static int ovl_rename(struct user_namespace *mnt_userns, struct inode *olddir,
  929. struct dentry *old, struct inode *newdir,
  930. struct dentry *new, unsigned int flags)
  931. {
  932. int err;
  933. struct dentry *old_upperdir;
  934. struct dentry *new_upperdir;
  935. struct dentry *olddentry;
  936. struct dentry *newdentry;
  937. struct dentry *trap;
  938. bool old_opaque;
  939. bool new_opaque;
  940. bool cleanup_whiteout = false;
  941. bool update_nlink = false;
  942. bool overwrite = !(flags & RENAME_EXCHANGE);
  943. bool is_dir = d_is_dir(old);
  944. bool new_is_dir = d_is_dir(new);
  945. bool samedir = olddir == newdir;
  946. struct dentry *opaquedir = NULL;
  947. const struct cred *old_cred = NULL;
  948. struct ovl_fs *ofs = OVL_FS(old->d_sb);
  949. LIST_HEAD(list);
  950. err = -EINVAL;
  951. if (flags & ~(RENAME_EXCHANGE | RENAME_NOREPLACE))
  952. goto out;
  953. flags &= ~RENAME_NOREPLACE;
  954. /* Don't copy up directory trees */
  955. err = -EXDEV;
  956. if (!ovl_can_move(old))
  957. goto out;
  958. if (!overwrite && !ovl_can_move(new))
  959. goto out;
  960. if (overwrite && new_is_dir && !ovl_pure_upper(new)) {
  961. err = ovl_check_empty_dir(new, &list);
  962. if (err)
  963. goto out;
  964. }
  965. if (overwrite) {
  966. if (ovl_lower_positive(old)) {
  967. if (!ovl_dentry_is_whiteout(new)) {
  968. /* Whiteout source */
  969. flags |= RENAME_WHITEOUT;
  970. } else {
  971. /* Switch whiteouts */
  972. flags |= RENAME_EXCHANGE;
  973. }
  974. } else if (is_dir && ovl_dentry_is_whiteout(new)) {
  975. flags |= RENAME_EXCHANGE;
  976. cleanup_whiteout = true;
  977. }
  978. }
  979. err = ovl_want_write(old);
  980. if (err)
  981. goto out;
  982. err = ovl_copy_up(old);
  983. if (err)
  984. goto out_drop_write;
  985. err = ovl_copy_up(new->d_parent);
  986. if (err)
  987. goto out_drop_write;
  988. if (!overwrite) {
  989. err = ovl_copy_up(new);
  990. if (err)
  991. goto out_drop_write;
  992. } else if (d_inode(new)) {
  993. err = ovl_nlink_start(new);
  994. if (err)
  995. goto out_drop_write;
  996. update_nlink = true;
  997. }
  998. old_cred = ovl_override_creds(old->d_sb);
  999. if (!list_empty(&list)) {
  1000. opaquedir = ovl_clear_empty(new, &list);
  1001. err = PTR_ERR(opaquedir);
  1002. if (IS_ERR(opaquedir)) {
  1003. opaquedir = NULL;
  1004. goto out_revert_creds;
  1005. }
  1006. }
  1007. old_upperdir = ovl_dentry_upper(old->d_parent);
  1008. new_upperdir = ovl_dentry_upper(new->d_parent);
  1009. if (!samedir) {
  1010. /*
  1011. * When moving a merge dir or non-dir with copy up origin into
  1012. * a new parent, we are marking the new parent dir "impure".
  1013. * When ovl_iterate() iterates an "impure" upper dir, it will
  1014. * lookup the origin inodes of the entries to fill d_ino.
  1015. */
  1016. if (ovl_type_origin(old)) {
  1017. err = ovl_set_impure(new->d_parent, new_upperdir);
  1018. if (err)
  1019. goto out_revert_creds;
  1020. }
  1021. if (!overwrite && ovl_type_origin(new)) {
  1022. err = ovl_set_impure(old->d_parent, old_upperdir);
  1023. if (err)
  1024. goto out_revert_creds;
  1025. }
  1026. }
  1027. trap = lock_rename(new_upperdir, old_upperdir);
  1028. olddentry = ovl_lookup_upper(ofs, old->d_name.name, old_upperdir,
  1029. old->d_name.len);
  1030. err = PTR_ERR(olddentry);
  1031. if (IS_ERR(olddentry))
  1032. goto out_unlock;
  1033. err = -ESTALE;
  1034. if (!ovl_matches_upper(old, olddentry))
  1035. goto out_dput_old;
  1036. newdentry = ovl_lookup_upper(ofs, new->d_name.name, new_upperdir,
  1037. new->d_name.len);
  1038. err = PTR_ERR(newdentry);
  1039. if (IS_ERR(newdentry))
  1040. goto out_dput_old;
  1041. old_opaque = ovl_dentry_is_opaque(old);
  1042. new_opaque = ovl_dentry_is_opaque(new);
  1043. err = -ESTALE;
  1044. if (d_inode(new) && ovl_dentry_upper(new)) {
  1045. if (opaquedir) {
  1046. if (newdentry != opaquedir)
  1047. goto out_dput;
  1048. } else {
  1049. if (!ovl_matches_upper(new, newdentry))
  1050. goto out_dput;
  1051. }
  1052. } else {
  1053. if (!d_is_negative(newdentry)) {
  1054. if (!new_opaque || !ovl_is_whiteout(newdentry))
  1055. goto out_dput;
  1056. } else {
  1057. if (flags & RENAME_EXCHANGE)
  1058. goto out_dput;
  1059. }
  1060. }
  1061. if (olddentry == trap)
  1062. goto out_dput;
  1063. if (newdentry == trap)
  1064. goto out_dput;
  1065. if (olddentry->d_inode == newdentry->d_inode)
  1066. goto out_dput;
  1067. err = 0;
  1068. if (ovl_type_merge_or_lower(old))
  1069. err = ovl_set_redirect(old, samedir);
  1070. else if (is_dir && !old_opaque && ovl_type_merge(new->d_parent))
  1071. err = ovl_set_opaque_xerr(old, olddentry, -EXDEV);
  1072. if (err)
  1073. goto out_dput;
  1074. if (!overwrite && ovl_type_merge_or_lower(new))
  1075. err = ovl_set_redirect(new, samedir);
  1076. else if (!overwrite && new_is_dir && !new_opaque &&
  1077. ovl_type_merge(old->d_parent))
  1078. err = ovl_set_opaque_xerr(new, newdentry, -EXDEV);
  1079. if (err)
  1080. goto out_dput;
  1081. err = ovl_do_rename(ofs, old_upperdir->d_inode, olddentry,
  1082. new_upperdir->d_inode, newdentry, flags);
  1083. if (err)
  1084. goto out_dput;
  1085. if (cleanup_whiteout)
  1086. ovl_cleanup(ofs, old_upperdir->d_inode, newdentry);
  1087. if (overwrite && d_inode(new)) {
  1088. if (new_is_dir)
  1089. clear_nlink(d_inode(new));
  1090. else
  1091. ovl_drop_nlink(new);
  1092. }
  1093. ovl_dir_modified(old->d_parent, ovl_type_origin(old) ||
  1094. (!overwrite && ovl_type_origin(new)));
  1095. ovl_dir_modified(new->d_parent, ovl_type_origin(old) ||
  1096. (d_inode(new) && ovl_type_origin(new)));
  1097. /* copy ctime: */
  1098. ovl_copyattr(d_inode(old));
  1099. if (d_inode(new) && ovl_dentry_upper(new))
  1100. ovl_copyattr(d_inode(new));
  1101. out_dput:
  1102. dput(newdentry);
  1103. out_dput_old:
  1104. dput(olddentry);
  1105. out_unlock:
  1106. unlock_rename(new_upperdir, old_upperdir);
  1107. out_revert_creds:
  1108. ovl_revert_creds(old->d_sb, old_cred);
  1109. if (update_nlink)
  1110. ovl_nlink_end(new);
  1111. out_drop_write:
  1112. ovl_drop_write(old);
  1113. out:
  1114. dput(opaquedir);
  1115. ovl_cache_free(&list);
  1116. return err;
  1117. }
  1118. const struct inode_operations ovl_dir_inode_operations = {
  1119. .lookup = ovl_lookup,
  1120. .mkdir = ovl_mkdir,
  1121. .symlink = ovl_symlink,
  1122. .unlink = ovl_unlink,
  1123. .rmdir = ovl_rmdir,
  1124. .rename = ovl_rename,
  1125. .link = ovl_link,
  1126. .setattr = ovl_setattr,
  1127. .create = ovl_create,
  1128. .mknod = ovl_mknod,
  1129. .permission = ovl_permission,
  1130. .getattr = ovl_getattr,
  1131. .listxattr = ovl_listxattr,
  1132. .get_acl = ovl_get_acl,
  1133. .update_time = ovl_update_time,
  1134. .fileattr_get = ovl_fileattr_get,
  1135. .fileattr_set = ovl_fileattr_set,
  1136. };