2 * linux/fs/ext2/namei.c
4 * Copyright (C) 1992, 1993, 1994, 1995
5 * Remy Card (card@masi.ibp.fr)
6 * Laboratoire MASI - Institut Blaise Pascal
7 * Universite Pierre et Marie Curie (Paris VI)
11 * linux/fs/minix/namei.c
13 * Copyright (C) 1991, 1992 Linus Torvalds
15 * Big-endian to little-endian byte-swapping/bitmaps by
16 * David S. Miller (davem@caip.rutgers.edu), 1995
17 * Directory entry file type support and forward compatibility hooks
18 * for B-tree directories by Theodore Ts'o (tytso@mit.edu), 1998
20 * Changes for use in OBDFS
21 * Copyright (c) 1999, Seagate Technology Inc.
25 #include <asm/uaccess.h>
27 #include <linux/errno.h>
29 #include <linux/ext2_fs.h>
30 #include <linux/fcntl.h>
31 #include <linux/sched.h>
32 #include <linux/stat.h>
33 #include <linux/string.h>
34 #include <linux/locks.h>
35 #include <linux/quotaops.h>
36 #include <linux/iobuf.h>
38 #include <linux/obd_support.h>
42 * define how far ahead to read directories while searching them.
44 #define NAMEI_RA_CHUNKS 2
45 #define NAMEI_RA_BLOCKS 4
46 #define NAMEI_RA_SIZE (NAMEI_RA_CHUNKS * NAMEI_RA_BLOCKS)
47 #define NAMEI_RA_INDEX(c,b) (((c) * NAMEI_RA_BLOCKS) + (b))
50 * NOTE! unlike strncmp, ext2_match returns 1 for success, 0 for failure.
52 * `len <= EXT2_NAME_LEN' is guaranteed by caller.
53 * `de != NULL' is guaranteed by caller.
55 static inline int ext2_match (int len, const char * const name,
56 struct ext2_dir_entry_2 * de)
58 if (len != de->name_len)
62 return !memcmp(name, de->name, len);
68 * finds an entry in the specified directory with the wanted name. It
69 * returns the cache buffer in which the entry was found, and the entry
70 * itself (as a parameter - res_dir). It does NOT read the inode of the
71 * entry - you'll have to do that yourself if you want to.
73 struct page * obdfs_find_entry (struct inode * dir,
74 const char * const name, int namelen,
75 struct ext2_dir_entry_2 ** res_dir, int lock)
77 struct super_block * sb;
85 if (namelen > EXT2_NAME_LEN)
88 for (page = 0, offset = 0; offset < dir->i_size; page++) {
89 struct ext2_dir_entry_2 * de;
92 page = obdfs_getpage(dir, offset, 0, lock);
96 de = (struct ext2_dir_entry_2 *) page_address(page);
97 dlimit = (char *)page_address(page) + PAGE_SIZE;
98 while ((char *) de < dlimit) {
99 /* this code is executed quadratically often */
100 /* do minimal checking `by hand' */
103 if ((char *) de + namelen <= dlimit &&
104 ext2_match (namelen, name, de)) {
106 just to be sure, do a full check */
107 if (!obdfs_check_dir_entry("ext2_find_entry",
108 dir, de, page, offset))
114 /* prevent looping on a bad block */
115 de_len = le16_to_cpu(de->rec_len);
119 de = (struct ext2_dir_entry_2 *)
120 ((char *) de + de_len);
122 page_cache_release(page);
126 page_cache_release(page);
131 struct dentry *obdfs_lookup(struct inode * dir, struct dentry *dentry)
133 struct inode * inode;
134 struct ext2_dir_entry_2 * de;
138 if (dentry->d_name.len > EXT2_NAME_LEN)
139 return ERR_PTR(-ENAMETOOLONG);
141 page = obdfs_find_entry (dir, dentry->d_name.name, dentry->d_name.len, &de, NOLOCK);
144 CDEBUG(D_INODE, "No page - negative entry.\n");
146 CDEBUG(D_INODE, "Danger: PAGE but de.\n");
147 return ERR_PTR(-ENOENT);
150 unsigned long ino = le32_to_cpu(de->inode);
151 page_cache_release(page);
152 inode = iget(dir->i_sb, ino);
155 CDEBUG(D_INODE, "No inode.\n");
157 return ERR_PTR(-EACCES);
160 d_add(dentry, inode);
169 * adds a file entry to the specified directory, using the same
170 * semantics as ext2_find_entry(). It returns NULL if it failed.
172 * NOTE!! The inode part of 'de' is left at 0 - which means you
173 * may not sleep between calling this and putting something into
174 * the entry, as someone else might have used it while you slept.
176 * returns a locked page
178 static struct page *obdfs_add_entry (struct inode * dir,
179 const char * name, int namelen,
180 struct ext2_dir_entry_2 ** res_dir,
183 unsigned long offset;
184 unsigned short rec_len;
186 struct ext2_dir_entry_2 * de, * de1;
187 struct super_block * sb;
192 if (!dir || !dir->i_nlink)
199 * Is this a busy deleted directory? Can't create new files if so
201 if (dir->i_size == 0)
206 page = obdfs_getpage(dir, 0, 0, LOCKED);
211 rec_len = EXT2_DIR_REC_LEN(namelen);
213 de = (struct ext2_dir_entry_2 *) page_address(page);
216 if ((char *)de >= PAGE_SIZE + (char *)page_address(page)) {
218 page_cache_release(page);
219 page = obdfs_getpage(dir, offset, 1, LOCKED);
222 if (dir->i_size <= offset) {
223 if (dir->i_size == 0) {
228 ext2_debug ("creating next block\n");
230 de = (struct ext2_dir_entry_2 *) page_address(page);
232 de->rec_len = le16_to_cpu(PAGE_SIZE);
233 dir->i_size = offset + PAGE_SIZE;
234 dir->u.ext2_i.i_flags &= ~EXT2_BTREE_FL;
235 mark_inode_dirty(dir);
238 ext2_debug ("skipping to next block\n");
240 de = (struct ext2_dir_entry_2 *) page_address(page);
243 CDEBUG(D_INODE, "\n");
244 if (!obdfs_check_dir_entry ("ext2_add_entry", dir, de, page,
247 page_cache_release(page);
251 CDEBUG(D_INODE, "\n");
252 if (ext2_match (namelen, name, de)) {
255 page_cache_release(page);
259 CDEBUG(D_INODE, "\n");
260 if ((le32_to_cpu(de->inode) == 0 && le16_to_cpu(de->rec_len) >= rec_len) ||
261 (le16_to_cpu(de->rec_len) >= EXT2_DIR_REC_LEN(de->name_len) + rec_len)) {
262 offset += le16_to_cpu(de->rec_len);
263 if (le32_to_cpu(de->inode)) {
264 de1 = (struct ext2_dir_entry_2 *) ((char *) de +
265 EXT2_DIR_REC_LEN(de->name_len));
266 de1->rec_len = cpu_to_le16(le16_to_cpu(de->rec_len) -
267 EXT2_DIR_REC_LEN(de->name_len));
268 de->rec_len = cpu_to_le16(EXT2_DIR_REC_LEN(de->name_len));
271 CDEBUG(D_INODE, "\n");
273 de->name_len = namelen;
275 memcpy (de->name, name, namelen);
276 CDEBUG(D_INODE, "\n");
278 * XXX shouldn't update any times until successful
279 * completion of syscall, but too many callers depend
282 * XXX similarly, too many callers depend on
283 * ext2_new_inode() setting the times, but error
284 * recovery deletes the inode, so the worst that can
285 * happen is that the times are slightly out of date
286 * and/or different from the directory change time.
288 dir->i_mtime = dir->i_ctime = CURRENT_TIME;
289 dir->u.ext2_i.i_flags &= ~EXT2_BTREE_FL;
290 mark_inode_dirty(dir);
291 dir->i_version = ++event;
294 PDEBUG(page, "addentry");
298 CDEBUG(D_INODE, "\n");
299 offset += le16_to_cpu(de->rec_len);
300 de = (struct ext2_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len));
302 CDEBUG(D_INODE, "\n");
305 page_cache_release(page);
306 PDEBUG(page, "addentry");
312 * ext2_delete_entry deletes a directory entry by merging it with the
315 static int obdfs_delete_entry (struct ext2_dir_entry_2 * dir,
318 struct ext2_dir_entry_2 * de, * pde;
323 de = (struct ext2_dir_entry_2 *) page_address(page);
324 while (i < PAGE_SIZE) {
325 if (!obdfs_check_dir_entry ("ext2_delete_entry", NULL,
331 cpu_to_le16(le16_to_cpu(pde->rec_len) +
332 le16_to_cpu(dir->rec_len));
337 i += le16_to_cpu(de->rec_len);
339 de = (struct ext2_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len));
345 static inline void ext2_set_de_type(struct super_block *sb,
346 struct ext2_dir_entry_2 *de,
348 if (!EXT2_HAS_INCOMPAT_FEATURE(sb, EXT2_FEATURE_INCOMPAT_FILETYPE))
351 de->file_type = EXT2_FT_CHRDEV;
352 else if (S_ISBLK(mode))
353 de->file_type = EXT2_FT_BLKDEV;
354 else if (S_ISFIFO(mode))
355 de->file_type = EXT2_FT_FIFO;
356 else if (S_ISLNK(mode))
357 de->file_type = EXT2_FT_SYMLINK;
358 else if (S_ISREG(mode))
359 de->file_type = EXT2_FT_REG_FILE;
360 else if (S_ISDIR(mode))
361 de->file_type = EXT2_FT_DIR;
365 * By the time this is called, we already have created
366 * the directory cache entry for the new file, but it
367 * is so far negative - it has no inode.
369 * If the create succeeds, we fill in the inode information
370 * with d_instantiate().
372 int obdfs_create (struct inode * dir, struct dentry * dentry, int mode)
374 struct inode * inode;
376 struct ext2_dir_entry_2 * de;
378 struct obdfs_sb_info *sbi;
383 sbi = dir->i_sb->u.generic_sbp;
385 * N.B. Several error exits in ext2_new_inode don't set err.
387 ino = sbi->osi_ops->o_create(sbi->osi_conn_info.conn_id, 0, &err);
390 inode = iget(dir->i_sb, ino);
392 CDEBUG(D_INODE, "No inode, ino %ld\n", ino);
396 inode->i_op = &obdfs_inode_ops;
397 inode->i_mode = mode;
398 mark_inode_dirty(inode);
399 page = obdfs_add_entry (dir, dentry->d_name.name, dentry->d_name.len, &de, &err);
402 mark_inode_dirty(inode);
407 de->inode = cpu_to_le32(inode->i_ino);
408 ext2_set_de_type(dir->i_sb, de, S_IFREG);
409 dir->i_version = ++event;
410 sbi->osi_ops->o_brw(WRITE, sbi->osi_conn_info.conn_id,
411 dir->i_ino, page, 0);
415 ll_rw_block (WRITE, 1, &bh);
419 page_cache_release(page);
420 d_instantiate(dentry, inode);
425 int obdfs_mknod (struct inode * dir, struct dentry *dentry, int mode, int rdev)
427 struct inode * inode;
429 struct ext2_dir_entry_2 * de;
431 struct obdfs_sb_info *sbi;
437 sbi = dir->i_sb->u.generic_sbp;
439 * N.B. Several error exits in ext2_new_inode don't set err.
441 ino = sbi->osi_ops->o_create(sbi->osi_conn_info.conn_id, 0, &err);
444 inode = iget(dir->i_sb, ino);
448 inode->i_uid = current->fsuid;
449 init_special_inode(inode, mode, rdev);
450 page = obdfs_add_entry (dir, dentry->d_name.name, dentry->d_name.len, &de, &err);
453 de->inode = cpu_to_le32(inode->i_ino);
454 dir->i_version = ++event;
455 ext2_set_de_type(dir->i_sb, de, inode->i_mode);
456 mark_inode_dirty(inode);
457 sbi->osi_ops->o_brw(WRITE, sbi->osi_conn_info.conn_id,
458 dir->i_ino, page, 0);
463 ll_rw_block (WRITE, 1, &bh);
467 d_instantiate(dentry, inode);
468 page_cache_release(page);
475 mark_inode_dirty(inode);
480 int obdfs_mkdir(struct inode * dir, struct dentry * dentry, int mode)
482 struct inode * child;
483 struct page *page, *child_page;
484 struct ext2_dir_entry_2 * de;
485 struct obdfs_sb_info *sbi;
490 sbi = dir->i_sb->u.generic_sbp;
493 if (dir->i_nlink >= EXT2_LINK_MAX)
497 ino = iops(dir)->o_create(sbi->osi_conn_info.conn_id, 0, &err);
500 child = iget(dir->i_sb, ino);
505 child->i_op = &obdfs_inode_ops;
506 child->i_size = PAGE_SIZE;
508 child_page = obdfs_getpage(child, 0, 1, LOCKED);
510 child->i_nlink--; /* is this nlink == 0? */
511 mark_inode_dirty(child);
515 child->i_blocks = PAGE_SIZE/child->i_sb->s_blocksize;
517 /* create . and .. */
518 de = (struct ext2_dir_entry_2 *) page_address(child_page);
519 de->inode = cpu_to_le32(child->i_ino);
521 de->rec_len = cpu_to_le16(EXT2_DIR_REC_LEN(de->name_len));
522 strcpy (de->name, ".");
523 ext2_set_de_type(dir->i_sb, de, S_IFDIR);
525 de = (struct ext2_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len));
526 de->inode = cpu_to_le32(dir->i_ino);
527 de->rec_len = cpu_to_le16(PAGE_SIZE - EXT2_DIR_REC_LEN(1));
529 strcpy (de->name, "..");
530 ext2_set_de_type(dir->i_sb, de, S_IFDIR);
532 iops(dir)->o_brw(WRITE, sbi->osi_conn_info.conn_id, child->i_ino, child_page, 1);
533 UnlockPage(child_page);
534 page_cache_release(child_page);
537 child->i_mode = S_IFDIR | mode;
538 if (dir->i_mode & S_ISGID)
539 child->i_mode |= S_ISGID;
540 mark_inode_dirty(child);
542 /* now deal with the parent */
543 page = obdfs_add_entry(dir, dentry->d_name.name, dentry->d_name.len, &de, &err);
548 de->inode = cpu_to_le32(child->i_ino);
549 ext2_set_de_type(dir->i_sb, de, S_IFDIR);
550 dir->i_version = ++event;
554 ll_rw_block (WRITE, 1, &bh);
559 dir->u.ext2_i.i_flags &= ~EXT2_BTREE_FL;
560 mark_inode_dirty(dir);
561 iops(dir)->o_brw(WRITE, sbi->osi_conn_info.conn_id, dir->i_ino, page, 1);
563 page_cache_release(page);
564 d_instantiate(dentry, child);
572 mark_inode_dirty(child);
580 * routine to check that the specified directory is empty (for rmdir)
582 static int empty_dir (struct inode * inode)
584 unsigned long offset;
586 struct ext2_dir_entry_2 * de, * de1;
587 struct super_block * sb;
590 if (inode->i_size < EXT2_DIR_REC_LEN(1) + EXT2_DIR_REC_LEN(2) ||
591 !(page = obdfs_getpage (inode, 0, 0, NOLOCK))) {
592 ext2_warning (inode->i_sb, "empty_dir",
593 "bad directory (dir #%lu) - no data block",
597 de = (struct ext2_dir_entry_2 *) page_address(page);
598 de1 = (struct ext2_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len));
599 if (le32_to_cpu(de->inode) != inode->i_ino || !le32_to_cpu(de1->inode) ||
600 strcmp (".", de->name) || strcmp ("..", de1->name)) {
601 ext2_warning (inode->i_sb, "empty_dir",
602 "bad directory (dir #%lu) - no `.' or `..'",
604 page_cache_release(page);
607 offset = le16_to_cpu(de->rec_len) + le16_to_cpu(de1->rec_len);
608 de = (struct ext2_dir_entry_2 *) ((char *) de1 + le16_to_cpu(de1->rec_len));
609 while (offset < inode->i_size ) {
610 if (!page || (void *) de >= (void *) (page_address(page) + PAGE_SIZE)) {
612 page_cache_release(page);
613 page = obdfs_getpage(inode, offset, 0, NOLOCK);
616 ext2_error (sb, "empty_dir",
617 "directory #%lu contains a hole at offset %lu",
618 inode->i_ino, offset);
620 offset += sb->s_blocksize;
623 de = (struct ext2_dir_entry_2 *) page_address(page);
625 if (!obdfs_check_dir_entry ("empty_dir", inode, de, page,
627 page_cache_release(page);
630 if (le32_to_cpu(de->inode)) {
631 page_cache_release(page);
634 offset += le16_to_cpu(de->rec_len);
635 de = (struct ext2_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len));
637 page_cache_release(page);
641 int obdfs_rmdir (struct inode * dir, struct dentry *dentry)
644 struct inode * inode;
646 struct ext2_dir_entry_2 * de;
647 struct obdfs_sb_info *sbi;
650 sbi = dir->i_sb->u.generic_sbp;
653 page = obdfs_find_entry (dir, dentry->d_name.name, dentry->d_name.len, &de, LOCKED);
657 inode = dentry->d_inode;
661 if (le32_to_cpu(de->inode) != inode->i_ino)
665 if (!empty_dir (inode))
668 retval = obdfs_delete_entry (de, page);
669 dir->i_version = ++event;
672 sbi->osi_ops->o_brw(WRITE, sbi->osi_conn_info.conn_id,
673 dir->i_ino, page, 0);
677 ll_rw_block (WRITE, 1, &bh);
681 if (inode->i_nlink != 2)
682 ext2_warning (inode->i_sb, "ext2_rmdir",
683 "empty directory has nlink!=2 (%d)",
685 inode->i_version = ++event;
688 mark_inode_dirty(inode);
690 inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
691 dir->u.ext2_i.i_flags &= ~EXT2_BTREE_FL;
692 mark_inode_dirty(dir);
697 page_cache_release(page);
702 int obdfs_unlink(struct inode * dir, struct dentry *dentry)
705 struct inode * inode;
707 struct ext2_dir_entry_2 * de;
708 struct obdfs_sb_info *sbi;
711 sbi = dir->i_sb->u.generic_sbp;
714 page = obdfs_find_entry (dir, dentry->d_name.name, dentry->d_name.len, &de, LOCKED);
718 inode = dentry->d_inode;
722 if (le32_to_cpu(de->inode) != inode->i_ino)
725 if (!inode->i_nlink) {
726 ext2_warning (inode->i_sb, "ext2_unlink",
727 "Deleting nonexistent file (%lu), %d",
728 inode->i_ino, inode->i_nlink);
731 retval = obdfs_delete_entry (de, page);
734 dir->i_version = ++event;
735 sbi->osi_ops->o_brw(WRITE, sbi->osi_conn_info.conn_id,
736 dir->i_ino, page, 0);
740 ll_rw_block (WRITE, 1, &bh);
744 dir->i_ctime = dir->i_mtime = CURRENT_TIME;
745 dir->u.ext2_i.i_flags &= ~EXT2_BTREE_FL;
746 mark_inode_dirty(dir);
748 mark_inode_dirty(inode);
749 inode->i_ctime = dir->i_ctime;
751 d_delete(dentry); /* This also frees the inode */
755 page_cache_release(page);
760 int obdfs_symlink (struct inode * dir, struct dentry *dentry, const char * symname)
762 struct ext2_dir_entry_2 * de;
763 struct inode * inode;
764 struct page* page = NULL, * name_page = NULL;
766 int i, l, err = -EIO;
768 struct obdfs_sb_info *sbi;
773 sbi = dir->i_sb->u.generic_sbp;
775 * N.B. Several error exits in ext2_new_inode don't set err.
777 ino = sbi->osi_ops->o_create(sbi->osi_conn_info.conn_id, 0, &err);
780 inode = iget(dir->i_sb, ino);
784 inode->i_mode = S_IFLNK | S_IRWXUGO;
785 inode->i_op = &obdfs_inode_ops;
786 for (l = 0; l < inode->i_sb->s_blocksize - 1 &&
789 if (l >= sizeof (inode->u.ext2_i.i_data)) {
791 ext2_debug ("l=%d, normal symlink\n", l);
793 name_page = obdfs_getpage(inode, 0, 1, LOCKED);
796 mark_inode_dirty(inode);
800 link = (char *)page_address(name_page);
802 link = (char *) inode->u.ext2_i.i_data;
804 ext2_debug ("l=%d, fast symlink\n", l);
808 while (i < inode->i_sb->s_blocksize - 1 && (c = *(symname++)))
812 sbi->osi_ops->o_brw(WRITE, sbi->osi_conn_info.conn_id,
813 inode->i_ino, name_page, 1);
814 PDEBUG(name_page, "symlink");
815 UnlockPage(name_page);
816 page_cache_release(name_page);
819 mark_inode_dirty(inode);
821 page = obdfs_add_entry (dir, dentry->d_name.name, dentry->d_name.len, &de, &err);
824 de->inode = cpu_to_le32(inode->i_ino);
825 ext2_set_de_type(dir->i_sb, de, S_IFLNK);
826 dir->i_version = ++event;
827 sbi->osi_ops->o_brw(WRITE, sbi->osi_conn_info.conn_id,
828 dir->i_ino, page, 1);
832 ll_rw_block (WRITE, 1, &bh);
836 d_instantiate(dentry, inode);
843 mark_inode_dirty(inode);
848 int obdfs_link (struct dentry * old_dentry,
849 struct inode * dir, struct dentry *dentry)
851 struct inode *inode = old_dentry->d_inode;
852 struct ext2_dir_entry_2 * de;
855 struct obdfs_sb_info *sbi;
858 sbi = dir->i_sb->u.generic_sbp;
860 if (S_ISDIR(inode->i_mode))
863 if (inode->i_nlink >= EXT2_LINK_MAX)
866 page = obdfs_add_entry (dir, dentry->d_name.name, dentry->d_name.len, &de, &err);
870 de->inode = cpu_to_le32(inode->i_ino);
871 ext2_set_de_type(dir->i_sb, de, inode->i_mode);
872 dir->i_version = ++event;
873 sbi->osi_ops->o_brw(WRITE, sbi->osi_conn_info.conn_id,
874 dir->i_ino, page, 0);
879 ll_rw_block (WRITE, 1, &bh);
883 page_cache_release(page);
885 inode->i_ctime = CURRENT_TIME;
886 mark_inode_dirty(inode);
888 d_instantiate(dentry, inode);
892 #define PARENT_INO(buffer) \
893 ((struct ext2_dir_entry_2 *) ((char *) buffer + \
894 le16_to_cpu(((struct ext2_dir_entry_2 *) buffer)->rec_len)))->inode
897 * Anybody can rename anything with this: the permission checks are left to the
898 * higher-level routines.
900 int obdfs_rename (struct inode * old_dir, struct dentry *old_dentry,
901 struct inode * new_dir, struct dentry *new_dentry)
903 struct inode * old_inode, * new_inode;
904 struct page * old_page, * new_page, * dir_page;
905 struct ext2_dir_entry_2 * old_de, * new_de;
907 struct obdfs_sb_info *sbi;
910 sbi = old_dir->i_sb->u.generic_sbp;
912 new_page = dir_page = NULL;
914 /* does the old entry exist? - if not get out */
915 old_page = obdfs_find_entry (old_dir, old_dentry->d_name.name, old_dentry->d_name.len, &old_de, NOLOCK);
916 PDEBUG(old_page, "rename - old page");
918 * Check for inode number is _not_ due to possible IO errors.
919 * We might rmdir the source, keep it as pwd of some process
920 * and merrily kill the link to whatever was created under the
921 * same name. Goodbye sticky bit ;-<
923 old_inode = old_dentry->d_inode;
925 if (!old_page || le32_to_cpu(old_de->inode) != old_inode->i_ino)
929 new_inode = new_dentry->d_inode;
930 new_page = obdfs_find_entry (new_dir, new_dentry->d_name.name,
931 new_dentry->d_name.len, &new_de, NOLOCK);
932 PDEBUG(new_page, "rename - new page ");
935 page_cache_release(new_page);
938 DQUOT_INIT(new_inode);
941 /* in this case we to check more ... */
942 if (S_ISDIR(old_inode->i_mode)) {
943 /* can only rename into empty new directory */
946 if (!empty_dir (new_inode))
950 dir_page= obdfs_getpage (old_inode, 0, 0, LOCKED);
951 PDEBUG(dir_page, "rename dir page");
955 if (le32_to_cpu(PARENT_INO(page_address(dir_page))) != old_dir->i_ino)
958 if (!new_inode && new_dir!=old_dir &&
959 new_dir->i_nlink >= EXT2_LINK_MAX)
962 /* create the target dir entry */
964 new_page = obdfs_add_entry (new_dir, new_dentry->d_name.name,
965 new_dentry->d_name.len, &new_de,
967 PDEBUG(new_page, "rename new page");
971 new_dir->i_version = ++event;
974 * remove the old entry
976 new_de->inode = le32_to_cpu(old_inode->i_ino);
977 if (EXT2_HAS_INCOMPAT_FEATURE(new_dir->i_sb,
978 EXT2_FEATURE_INCOMPAT_FILETYPE))
979 new_de->file_type = old_de->file_type;
981 obdfs_delete_entry (old_de, old_page);
983 old_dir->i_version = ++event;
985 new_inode->i_nlink--;
986 new_inode->i_ctime = CURRENT_TIME;
987 mark_inode_dirty(new_inode);
989 old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME;
990 old_dir->u.ext2_i.i_flags &= ~EXT2_BTREE_FL;
991 mark_inode_dirty(old_dir);
993 PARENT_INO(page_address(dir_page)) = le32_to_cpu(new_dir->i_ino);
994 sbi->osi_ops->o_brw(WRITE, sbi->osi_conn_info.conn_id,
995 old_inode->i_ino, dir_page, 0);
997 mark_inode_dirty(old_dir);
999 new_inode->i_nlink--;
1000 mark_inode_dirty(new_inode);
1003 new_dir->u.ext2_i.i_flags &= ~EXT2_BTREE_FL;
1004 mark_inode_dirty(new_dir);
1007 if ( old_page != new_page ) {
1008 unsigned long offset = old_page->offset;
1009 /* lock the old_page and release unlocked copy */
1010 CDEBUG(D_INODE, "old_page at %p\n", old_page);
1011 page_cache_release(old_page);
1012 old_page = obdfs_getpage(old_dir, offset, 0, LOCKED);
1013 CDEBUG(D_INODE, "old_page at %p\n", old_page);
1014 sbi->osi_ops->o_brw(WRITE, sbi->osi_conn_info.conn_id,
1015 old_dir->i_ino, old_page, 0);
1018 if (IS_SYNC(old_dir)) {
1019 ll_rw_block (WRITE, 1, &old_bh);
1020 wait_on_buffer (old_bh);
1023 sbi->osi_ops->o_brw(WRITE, sbi->osi_conn_info.conn_id,
1024 new_dir->i_ino, new_page, 0);
1026 if (IS_SYNC(new_dir)) {
1027 ll_rw_block (WRITE, 1, &new_bh);
1028 wait_on_buffer (new_bh);
1035 if (old_page && PageLocked(old_page) )
1036 UnlockPage(old_page);
1038 page_cache_release(old_page);
1039 if (new_page && PageLocked(new_page) )
1040 UnlockPage(new_page);
1042 page_cache_release(new_page);
1043 if (dir_page && PageLocked(dir_page) )
1044 UnlockPage(dir_page);
1046 page_cache_release(dir_page);