namei.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * linux/fs/hpfs/namei.c
  4. *
  5. * Mikulas Patocka (mikulas@artax.karlin.mff.cuni.cz), 1998-1999
  6. *
  7. * adding & removing files & directories
  8. */
  9. #include <linux/sched.h>
  10. #include "hpfs_fn.h"
  11. static void hpfs_update_directory_times(struct inode *dir)
  12. {
  13. time64_t t = local_to_gmt(dir->i_sb, local_get_seconds(dir->i_sb));
  14. if (t == inode_get_mtime_sec(dir) &&
  15. t == inode_get_ctime_sec(dir))
  16. return;
  17. inode_set_mtime_to_ts(dir, inode_set_ctime(dir, t, 0));
  18. hpfs_write_inode_nolock(dir);
  19. }
  20. static int hpfs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
  21. struct dentry *dentry, umode_t mode)
  22. {
  23. const unsigned char *name = dentry->d_name.name;
  24. unsigned len = dentry->d_name.len;
  25. struct quad_buffer_head qbh0;
  26. struct buffer_head *bh;
  27. struct hpfs_dirent *de;
  28. struct fnode *fnode;
  29. struct dnode *dnode;
  30. struct inode *result;
  31. fnode_secno fno;
  32. dnode_secno dno;
  33. int r;
  34. struct hpfs_dirent dee;
  35. int err;
  36. if ((err = hpfs_chk_name(name, &len))) return err==-ENOENT ? -EINVAL : err;
  37. hpfs_lock(dir->i_sb);
  38. err = -ENOSPC;
  39. fnode = hpfs_alloc_fnode(dir->i_sb, hpfs_i(dir)->i_dno, &fno, &bh);
  40. if (!fnode)
  41. goto bail;
  42. dnode = hpfs_alloc_dnode(dir->i_sb, fno, &dno, &qbh0);
  43. if (!dnode)
  44. goto bail1;
  45. memset(&dee, 0, sizeof dee);
  46. dee.directory = 1;
  47. if (!(mode & 0222)) dee.read_only = 1;
  48. /*dee.archive = 0;*/
  49. dee.hidden = name[0] == '.';
  50. dee.fnode = cpu_to_le32(fno);
  51. dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(local_get_seconds(dir->i_sb));
  52. result = new_inode(dir->i_sb);
  53. if (!result)
  54. goto bail2;
  55. hpfs_init_inode(result);
  56. result->i_ino = fno;
  57. hpfs_i(result)->i_parent_dir = dir->i_ino;
  58. hpfs_i(result)->i_dno = dno;
  59. inode_set_mtime_to_ts(result,
  60. inode_set_atime_to_ts(result, inode_set_ctime(result, local_to_gmt(dir->i_sb, le32_to_cpu(dee.creation_date)), 0)));
  61. hpfs_i(result)->i_ea_size = 0;
  62. result->i_mode |= S_IFDIR;
  63. result->i_op = &hpfs_dir_iops;
  64. result->i_fop = &hpfs_dir_ops;
  65. result->i_blocks = 4;
  66. result->i_size = 2048;
  67. set_nlink(result, 2);
  68. if (dee.read_only)
  69. result->i_mode &= ~0222;
  70. r = hpfs_add_dirent(dir, name, len, &dee);
  71. if (r == 1)
  72. goto bail3;
  73. if (r == -1) {
  74. err = -EEXIST;
  75. goto bail3;
  76. }
  77. fnode->len = len;
  78. memcpy(fnode->name, name, len > 15 ? 15 : len);
  79. fnode->up = cpu_to_le32(dir->i_ino);
  80. fnode->flags |= FNODE_dir;
  81. fnode->btree.n_free_nodes = 7;
  82. fnode->btree.n_used_nodes = 1;
  83. fnode->btree.first_free = cpu_to_le16(0x14);
  84. fnode->u.external[0].disk_secno = cpu_to_le32(dno);
  85. fnode->u.external[0].file_secno = cpu_to_le32(-1);
  86. dnode->root_dnode = 1;
  87. dnode->up = cpu_to_le32(fno);
  88. de = hpfs_add_de(dir->i_sb, dnode, "\001\001", 2, 0);
  89. de->creation_date = de->write_date = de->read_date = cpu_to_le32(local_get_seconds(dir->i_sb));
  90. if (!(mode & 0222)) de->read_only = 1;
  91. de->first = de->directory = 1;
  92. /*de->hidden = de->system = 0;*/
  93. de->fnode = cpu_to_le32(fno);
  94. mark_buffer_dirty(bh);
  95. brelse(bh);
  96. hpfs_mark_4buffers_dirty(&qbh0);
  97. hpfs_brelse4(&qbh0);
  98. inc_nlink(dir);
  99. insert_inode_hash(result);
  100. if (!uid_eq(result->i_uid, current_fsuid()) ||
  101. !gid_eq(result->i_gid, current_fsgid()) ||
  102. result->i_mode != (mode | S_IFDIR)) {
  103. result->i_uid = current_fsuid();
  104. result->i_gid = current_fsgid();
  105. result->i_mode = mode | S_IFDIR;
  106. hpfs_write_inode_nolock(result);
  107. }
  108. hpfs_update_directory_times(dir);
  109. d_instantiate(dentry, result);
  110. hpfs_unlock(dir->i_sb);
  111. return 0;
  112. bail3:
  113. iput(result);
  114. bail2:
  115. hpfs_brelse4(&qbh0);
  116. hpfs_free_dnode(dir->i_sb, dno);
  117. bail1:
  118. brelse(bh);
  119. hpfs_free_sectors(dir->i_sb, fno, 1);
  120. bail:
  121. hpfs_unlock(dir->i_sb);
  122. return err;
  123. }
  124. static int hpfs_create(struct mnt_idmap *idmap, struct inode *dir,
  125. struct dentry *dentry, umode_t mode, bool excl)
  126. {
  127. const unsigned char *name = dentry->d_name.name;
  128. unsigned len = dentry->d_name.len;
  129. struct inode *result = NULL;
  130. struct buffer_head *bh;
  131. struct fnode *fnode;
  132. fnode_secno fno;
  133. int r;
  134. struct hpfs_dirent dee;
  135. int err;
  136. if ((err = hpfs_chk_name(name, &len)))
  137. return err==-ENOENT ? -EINVAL : err;
  138. hpfs_lock(dir->i_sb);
  139. err = -ENOSPC;
  140. fnode = hpfs_alloc_fnode(dir->i_sb, hpfs_i(dir)->i_dno, &fno, &bh);
  141. if (!fnode)
  142. goto bail;
  143. memset(&dee, 0, sizeof dee);
  144. if (!(mode & 0222)) dee.read_only = 1;
  145. dee.archive = 1;
  146. dee.hidden = name[0] == '.';
  147. dee.fnode = cpu_to_le32(fno);
  148. dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(local_get_seconds(dir->i_sb));
  149. result = new_inode(dir->i_sb);
  150. if (!result)
  151. goto bail1;
  152. hpfs_init_inode(result);
  153. result->i_ino = fno;
  154. result->i_mode |= S_IFREG;
  155. result->i_mode &= ~0111;
  156. result->i_op = &hpfs_file_iops;
  157. result->i_fop = &hpfs_file_ops;
  158. set_nlink(result, 1);
  159. hpfs_i(result)->i_parent_dir = dir->i_ino;
  160. inode_set_mtime_to_ts(result,
  161. inode_set_atime_to_ts(result, inode_set_ctime(result, local_to_gmt(dir->i_sb, le32_to_cpu(dee.creation_date)), 0)));
  162. hpfs_i(result)->i_ea_size = 0;
  163. if (dee.read_only)
  164. result->i_mode &= ~0222;
  165. result->i_blocks = 1;
  166. result->i_size = 0;
  167. result->i_data.a_ops = &hpfs_aops;
  168. hpfs_i(result)->mmu_private = 0;
  169. r = hpfs_add_dirent(dir, name, len, &dee);
  170. if (r == 1)
  171. goto bail2;
  172. if (r == -1) {
  173. err = -EEXIST;
  174. goto bail2;
  175. }
  176. fnode->len = len;
  177. memcpy(fnode->name, name, len > 15 ? 15 : len);
  178. fnode->up = cpu_to_le32(dir->i_ino);
  179. mark_buffer_dirty(bh);
  180. brelse(bh);
  181. insert_inode_hash(result);
  182. if (!uid_eq(result->i_uid, current_fsuid()) ||
  183. !gid_eq(result->i_gid, current_fsgid()) ||
  184. result->i_mode != (mode | S_IFREG)) {
  185. result->i_uid = current_fsuid();
  186. result->i_gid = current_fsgid();
  187. result->i_mode = mode | S_IFREG;
  188. hpfs_write_inode_nolock(result);
  189. }
  190. hpfs_update_directory_times(dir);
  191. d_instantiate(dentry, result);
  192. hpfs_unlock(dir->i_sb);
  193. return 0;
  194. bail2:
  195. iput(result);
  196. bail1:
  197. brelse(bh);
  198. hpfs_free_sectors(dir->i_sb, fno, 1);
  199. bail:
  200. hpfs_unlock(dir->i_sb);
  201. return err;
  202. }
  203. static int hpfs_mknod(struct mnt_idmap *idmap, struct inode *dir,
  204. struct dentry *dentry, umode_t mode, dev_t rdev)
  205. {
  206. const unsigned char *name = dentry->d_name.name;
  207. unsigned len = dentry->d_name.len;
  208. struct buffer_head *bh;
  209. struct fnode *fnode;
  210. fnode_secno fno;
  211. int r;
  212. struct hpfs_dirent dee;
  213. struct inode *result = NULL;
  214. int err;
  215. if ((err = hpfs_chk_name(name, &len))) return err==-ENOENT ? -EINVAL : err;
  216. if (hpfs_sb(dir->i_sb)->sb_eas < 2) return -EPERM;
  217. hpfs_lock(dir->i_sb);
  218. err = -ENOSPC;
  219. fnode = hpfs_alloc_fnode(dir->i_sb, hpfs_i(dir)->i_dno, &fno, &bh);
  220. if (!fnode)
  221. goto bail;
  222. memset(&dee, 0, sizeof dee);
  223. if (!(mode & 0222)) dee.read_only = 1;
  224. dee.archive = 1;
  225. dee.hidden = name[0] == '.';
  226. dee.fnode = cpu_to_le32(fno);
  227. dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(local_get_seconds(dir->i_sb));
  228. result = new_inode(dir->i_sb);
  229. if (!result)
  230. goto bail1;
  231. hpfs_init_inode(result);
  232. result->i_ino = fno;
  233. hpfs_i(result)->i_parent_dir = dir->i_ino;
  234. inode_set_mtime_to_ts(result,
  235. inode_set_atime_to_ts(result, inode_set_ctime(result, local_to_gmt(dir->i_sb, le32_to_cpu(dee.creation_date)), 0)));
  236. hpfs_i(result)->i_ea_size = 0;
  237. result->i_uid = current_fsuid();
  238. result->i_gid = current_fsgid();
  239. set_nlink(result, 1);
  240. result->i_size = 0;
  241. result->i_blocks = 1;
  242. init_special_inode(result, mode, rdev);
  243. r = hpfs_add_dirent(dir, name, len, &dee);
  244. if (r == 1)
  245. goto bail2;
  246. if (r == -1) {
  247. err = -EEXIST;
  248. goto bail2;
  249. }
  250. fnode->len = len;
  251. memcpy(fnode->name, name, len > 15 ? 15 : len);
  252. fnode->up = cpu_to_le32(dir->i_ino);
  253. mark_buffer_dirty(bh);
  254. insert_inode_hash(result);
  255. hpfs_write_inode_nolock(result);
  256. hpfs_update_directory_times(dir);
  257. d_instantiate(dentry, result);
  258. brelse(bh);
  259. hpfs_unlock(dir->i_sb);
  260. return 0;
  261. bail2:
  262. iput(result);
  263. bail1:
  264. brelse(bh);
  265. hpfs_free_sectors(dir->i_sb, fno, 1);
  266. bail:
  267. hpfs_unlock(dir->i_sb);
  268. return err;
  269. }
  270. static int hpfs_symlink(struct mnt_idmap *idmap, struct inode *dir,
  271. struct dentry *dentry, const char *symlink)
  272. {
  273. const unsigned char *name = dentry->d_name.name;
  274. unsigned len = dentry->d_name.len;
  275. struct buffer_head *bh;
  276. struct fnode *fnode;
  277. fnode_secno fno;
  278. int r;
  279. struct hpfs_dirent dee;
  280. struct inode *result;
  281. int err;
  282. if ((err = hpfs_chk_name(name, &len))) return err==-ENOENT ? -EINVAL : err;
  283. hpfs_lock(dir->i_sb);
  284. if (hpfs_sb(dir->i_sb)->sb_eas < 2) {
  285. hpfs_unlock(dir->i_sb);
  286. return -EPERM;
  287. }
  288. err = -ENOSPC;
  289. fnode = hpfs_alloc_fnode(dir->i_sb, hpfs_i(dir)->i_dno, &fno, &bh);
  290. if (!fnode)
  291. goto bail;
  292. memset(&dee, 0, sizeof dee);
  293. dee.archive = 1;
  294. dee.hidden = name[0] == '.';
  295. dee.fnode = cpu_to_le32(fno);
  296. dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(local_get_seconds(dir->i_sb));
  297. result = new_inode(dir->i_sb);
  298. if (!result)
  299. goto bail1;
  300. result->i_ino = fno;
  301. hpfs_init_inode(result);
  302. hpfs_i(result)->i_parent_dir = dir->i_ino;
  303. inode_set_mtime_to_ts(result,
  304. inode_set_atime_to_ts(result, inode_set_ctime(result, local_to_gmt(dir->i_sb, le32_to_cpu(dee.creation_date)), 0)));
  305. hpfs_i(result)->i_ea_size = 0;
  306. result->i_mode = S_IFLNK | 0777;
  307. result->i_uid = current_fsuid();
  308. result->i_gid = current_fsgid();
  309. result->i_blocks = 1;
  310. set_nlink(result, 1);
  311. result->i_size = strlen(symlink);
  312. inode_nohighmem(result);
  313. result->i_op = &page_symlink_inode_operations;
  314. result->i_data.a_ops = &hpfs_symlink_aops;
  315. r = hpfs_add_dirent(dir, name, len, &dee);
  316. if (r == 1)
  317. goto bail2;
  318. if (r == -1) {
  319. err = -EEXIST;
  320. goto bail2;
  321. }
  322. fnode->len = len;
  323. memcpy(fnode->name, name, len > 15 ? 15 : len);
  324. fnode->up = cpu_to_le32(dir->i_ino);
  325. hpfs_set_ea(result, fnode, "SYMLINK", symlink, strlen(symlink));
  326. mark_buffer_dirty(bh);
  327. brelse(bh);
  328. insert_inode_hash(result);
  329. hpfs_write_inode_nolock(result);
  330. hpfs_update_directory_times(dir);
  331. d_instantiate(dentry, result);
  332. hpfs_unlock(dir->i_sb);
  333. return 0;
  334. bail2:
  335. iput(result);
  336. bail1:
  337. brelse(bh);
  338. hpfs_free_sectors(dir->i_sb, fno, 1);
  339. bail:
  340. hpfs_unlock(dir->i_sb);
  341. return err;
  342. }
  343. static int hpfs_unlink(struct inode *dir, struct dentry *dentry)
  344. {
  345. const unsigned char *name = dentry->d_name.name;
  346. unsigned len = dentry->d_name.len;
  347. struct quad_buffer_head qbh;
  348. struct hpfs_dirent *de;
  349. struct inode *inode = d_inode(dentry);
  350. dnode_secno dno;
  351. int r;
  352. int err;
  353. hpfs_lock(dir->i_sb);
  354. hpfs_adjust_length(name, &len);
  355. err = -ENOENT;
  356. de = map_dirent(dir, hpfs_i(dir)->i_dno, name, len, &dno, &qbh);
  357. if (!de)
  358. goto out;
  359. err = -EPERM;
  360. if (de->first)
  361. goto out1;
  362. err = -EISDIR;
  363. if (de->directory)
  364. goto out1;
  365. r = hpfs_remove_dirent(dir, dno, de, &qbh, 1);
  366. switch (r) {
  367. case 1:
  368. hpfs_error(dir->i_sb, "there was error when removing dirent");
  369. err = -EFSERROR;
  370. break;
  371. case 2: /* no space for deleting */
  372. err = -ENOSPC;
  373. break;
  374. default:
  375. drop_nlink(inode);
  376. err = 0;
  377. }
  378. goto out;
  379. out1:
  380. hpfs_brelse4(&qbh);
  381. out:
  382. if (!err)
  383. hpfs_update_directory_times(dir);
  384. hpfs_unlock(dir->i_sb);
  385. return err;
  386. }
  387. static int hpfs_rmdir(struct inode *dir, struct dentry *dentry)
  388. {
  389. const unsigned char *name = dentry->d_name.name;
  390. unsigned len = dentry->d_name.len;
  391. struct quad_buffer_head qbh;
  392. struct hpfs_dirent *de;
  393. struct inode *inode = d_inode(dentry);
  394. dnode_secno dno;
  395. int n_items = 0;
  396. int err;
  397. int r;
  398. hpfs_adjust_length(name, &len);
  399. hpfs_lock(dir->i_sb);
  400. err = -ENOENT;
  401. de = map_dirent(dir, hpfs_i(dir)->i_dno, name, len, &dno, &qbh);
  402. if (!de)
  403. goto out;
  404. err = -EPERM;
  405. if (de->first)
  406. goto out1;
  407. err = -ENOTDIR;
  408. if (!de->directory)
  409. goto out1;
  410. hpfs_count_dnodes(dir->i_sb, hpfs_i(inode)->i_dno, NULL, NULL, &n_items);
  411. err = -ENOTEMPTY;
  412. if (n_items)
  413. goto out1;
  414. r = hpfs_remove_dirent(dir, dno, de, &qbh, 1);
  415. switch (r) {
  416. case 1:
  417. hpfs_error(dir->i_sb, "there was error when removing dirent");
  418. err = -EFSERROR;
  419. break;
  420. case 2:
  421. err = -ENOSPC;
  422. break;
  423. default:
  424. drop_nlink(dir);
  425. clear_nlink(inode);
  426. err = 0;
  427. }
  428. goto out;
  429. out1:
  430. hpfs_brelse4(&qbh);
  431. out:
  432. if (!err)
  433. hpfs_update_directory_times(dir);
  434. hpfs_unlock(dir->i_sb);
  435. return err;
  436. }
  437. static int hpfs_symlink_read_folio(struct file *file, struct folio *folio)
  438. {
  439. char *link = folio_address(folio);
  440. struct inode *i = folio->mapping->host;
  441. struct fnode *fnode;
  442. struct buffer_head *bh;
  443. int err;
  444. err = -EIO;
  445. hpfs_lock(i->i_sb);
  446. if (!(fnode = hpfs_map_fnode(i->i_sb, i->i_ino, &bh)))
  447. goto fail;
  448. err = hpfs_read_ea(i->i_sb, fnode, "SYMLINK", link, PAGE_SIZE);
  449. brelse(bh);
  450. fail:
  451. hpfs_unlock(i->i_sb);
  452. folio_end_read(folio, err == 0);
  453. return err;
  454. }
  455. const struct address_space_operations hpfs_symlink_aops = {
  456. .read_folio = hpfs_symlink_read_folio
  457. };
  458. static int hpfs_rename(struct mnt_idmap *idmap, struct inode *old_dir,
  459. struct dentry *old_dentry, struct inode *new_dir,
  460. struct dentry *new_dentry, unsigned int flags)
  461. {
  462. const unsigned char *old_name = old_dentry->d_name.name;
  463. unsigned old_len = old_dentry->d_name.len;
  464. const unsigned char *new_name = new_dentry->d_name.name;
  465. unsigned new_len = new_dentry->d_name.len;
  466. struct inode *i = d_inode(old_dentry);
  467. struct inode *new_inode = d_inode(new_dentry);
  468. struct quad_buffer_head qbh, qbh1;
  469. struct hpfs_dirent *dep, *nde;
  470. struct hpfs_dirent de;
  471. dnode_secno dno;
  472. int r;
  473. struct buffer_head *bh;
  474. struct fnode *fnode;
  475. int err;
  476. if (flags & ~RENAME_NOREPLACE)
  477. return -EINVAL;
  478. if ((err = hpfs_chk_name(new_name, &new_len))) return err;
  479. err = 0;
  480. hpfs_adjust_length(old_name, &old_len);
  481. hpfs_lock(i->i_sb);
  482. /* order doesn't matter, due to VFS exclusion */
  483. /* Erm? Moving over the empty non-busy directory is perfectly legal */
  484. if (new_inode && S_ISDIR(new_inode->i_mode)) {
  485. err = -EINVAL;
  486. goto end1;
  487. }
  488. if (!(dep = map_dirent(old_dir, hpfs_i(old_dir)->i_dno, old_name, old_len, &dno, &qbh))) {
  489. hpfs_error(i->i_sb, "lookup succeeded but map dirent failed");
  490. err = -ENOENT;
  491. goto end1;
  492. }
  493. copy_de(&de, dep);
  494. de.hidden = new_name[0] == '.';
  495. if (new_inode) {
  496. int r;
  497. if ((r = hpfs_remove_dirent(old_dir, dno, dep, &qbh, 1)) != 2) {
  498. if ((nde = map_dirent(new_dir, hpfs_i(new_dir)->i_dno, new_name, new_len, NULL, &qbh1))) {
  499. clear_nlink(new_inode);
  500. copy_de(nde, &de);
  501. memcpy(nde->name, new_name, new_len);
  502. hpfs_mark_4buffers_dirty(&qbh1);
  503. hpfs_brelse4(&qbh1);
  504. goto end;
  505. }
  506. hpfs_error(new_dir->i_sb, "hpfs_rename: could not find dirent");
  507. err = -EFSERROR;
  508. goto end1;
  509. }
  510. err = -ENOSPC;
  511. goto end1;
  512. }
  513. if (new_dir == old_dir) hpfs_brelse4(&qbh);
  514. if ((r = hpfs_add_dirent(new_dir, new_name, new_len, &de))) {
  515. if (r == -1) hpfs_error(new_dir->i_sb, "hpfs_rename: dirent already exists!");
  516. err = r == 1 ? -ENOSPC : -EFSERROR;
  517. if (new_dir != old_dir) hpfs_brelse4(&qbh);
  518. goto end1;
  519. }
  520. if (new_dir == old_dir)
  521. if (!(dep = map_dirent(old_dir, hpfs_i(old_dir)->i_dno, old_name, old_len, &dno, &qbh))) {
  522. hpfs_error(i->i_sb, "lookup succeeded but map dirent failed at #2");
  523. err = -ENOENT;
  524. goto end1;
  525. }
  526. if ((r = hpfs_remove_dirent(old_dir, dno, dep, &qbh, 0))) {
  527. hpfs_error(i->i_sb, "hpfs_rename: could not remove dirent");
  528. err = r == 2 ? -ENOSPC : -EFSERROR;
  529. goto end1;
  530. }
  531. end:
  532. hpfs_i(i)->i_parent_dir = new_dir->i_ino;
  533. if (S_ISDIR(i->i_mode)) {
  534. inc_nlink(new_dir);
  535. drop_nlink(old_dir);
  536. }
  537. if ((fnode = hpfs_map_fnode(i->i_sb, i->i_ino, &bh))) {
  538. fnode->up = cpu_to_le32(new_dir->i_ino);
  539. fnode->len = new_len;
  540. memcpy(fnode->name, new_name, new_len>15?15:new_len);
  541. if (new_len < 15) memset(&fnode->name[new_len], 0, 15 - new_len);
  542. mark_buffer_dirty(bh);
  543. brelse(bh);
  544. }
  545. end1:
  546. if (!err) {
  547. hpfs_update_directory_times(old_dir);
  548. hpfs_update_directory_times(new_dir);
  549. }
  550. hpfs_unlock(i->i_sb);
  551. return err;
  552. }
  553. const struct inode_operations hpfs_dir_iops =
  554. {
  555. .create = hpfs_create,
  556. .lookup = hpfs_lookup,
  557. .unlink = hpfs_unlink,
  558. .symlink = hpfs_symlink,
  559. .mkdir = hpfs_mkdir,
  560. .rmdir = hpfs_rmdir,
  561. .mknod = hpfs_mknod,
  562. .rename = hpfs_rename,
  563. .setattr = hpfs_setattr,
  564. };