VisionFive2 Linux kernel

StarFive Tech Linux Kernel for VisionFive (JH7110) boards (mirror)

More than 9999 Commits   32 Branches   54 Tags
b24413180f560 (Greg Kroah-Hartman 2017-11-01 15:07:57 +0100   1) // SPDX-License-Identifier: GPL-2.0
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700   2) /*
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700   3)  * linux/fs/ext2/namei.c
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700   4)  *
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700   5)  * Rewrite to pagecache. Almost all code had been changed, so blame me
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700   6)  * if the things go wrong. Please, send bug reports to
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700   7)  * viro@parcelfarce.linux.theplanet.co.uk
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700   8)  *
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700   9)  * Stuff here is basically a glue between the VFS and generic UNIXish
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  10)  * filesystem that keeps everything in pagecache. All knowledge of the
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  11)  * directory layout is in fs/ext2/dir.c - it turned out to be easily separatable
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  12)  * and it's easier to debug that way. In principle we might want to
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  13)  * generalize that a bit and turn it into a library. Or not.
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  14)  *
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  15)  * The only non-static object here is ext2_dir_inode_operations.
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  16)  *
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  17)  * TODO: get rid of kmap() use, add readahead.
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  18)  *
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  19)  * Copyright (C) 1992, 1993, 1994, 1995
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  20)  * Remy Card (card@masi.ibp.fr)
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  21)  * Laboratoire MASI - Institut Blaise Pascal
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  22)  * Universite Pierre et Marie Curie (Paris VI)
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  23)  *
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  24)  *  from
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  25)  *
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  26)  *  linux/fs/minix/namei.c
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  27)  *
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  28)  *  Copyright (C) 1991, 1992  Linus Torvalds
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  29)  *
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  30)  *  Big-endian to little-endian byte-swapping/bitmaps by
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  31)  *        David S. Miller (davem@caip.rutgers.edu), 1995
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  32)  */
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  33) 
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  34) #include <linux/pagemap.h>
907f4554e2521 (Christoph Hellwig  2010-03-03 09:05:06 -0500  35) #include <linux/quotaops.h>
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  36) #include "ext2.h"
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  37) #include "xattr.h"
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  38) #include "acl.h"
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  39) 
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  40) static inline int ext2_add_nondir(struct dentry *dentry, struct inode *inode)
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  41) {
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  42) 	int err = ext2_add_link(dentry, inode);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  43) 	if (!err) {
1e2e547a93a00 (Al Viro            2018-05-04 08:23:01 -0400  44) 		d_instantiate_new(dentry, inode);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  45) 		return 0;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  46) 	}
a513b035eadf8 (Alexey Dobriyan    2006-03-23 03:00:53 -0800  47) 	inode_dec_link_count(inode);
2e5afe54e0cd6 (Al Viro            2018-05-16 18:29:56 -0400  48) 	discard_new_inode(inode);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  49) 	return err;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  50) }
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  51) 
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  52) /*
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  53)  * Methods themselves.
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  54)  */
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  55) 
00cd8dd3bf95f (Al Viro            2012-06-10 17:13:09 -0400  56) static struct dentry *ext2_lookup(struct inode * dir, struct dentry *dentry, unsigned int flags)
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  57) {
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  58) 	struct inode * inode;
a43850a380ef5 (zhangyi (F)        2020-06-08 11:40:43 +0800  59) 	ino_t ino;
b4962091a54c8 (zhangyi (F)        2020-06-08 11:40:42 +0800  60) 	int res;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  61) 	
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  62) 	if (dentry->d_name.len > EXT2_NAME_LEN)
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  63) 		return ERR_PTR(-ENAMETOOLONG);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  64) 
b4962091a54c8 (zhangyi (F)        2020-06-08 11:40:42 +0800  65) 	res = ext2_inode_by_name(dir, &dentry->d_name, &ino);
a43850a380ef5 (zhangyi (F)        2020-06-08 11:40:43 +0800  66) 	if (res) {
a43850a380ef5 (zhangyi (F)        2020-06-08 11:40:43 +0800  67) 		if (res != -ENOENT)
a43850a380ef5 (zhangyi (F)        2020-06-08 11:40:43 +0800  68) 			return ERR_PTR(res);
a43850a380ef5 (zhangyi (F)        2020-06-08 11:40:43 +0800  69) 		inode = NULL;
a43850a380ef5 (zhangyi (F)        2020-06-08 11:40:43 +0800  70) 	} else {
52fcf7032935b (David Howells      2008-02-07 00:15:35 -0800  71) 		inode = ext2_iget(dir->i_sb, ino);
a9049376ee05b (Al Viro            2011-07-08 21:20:11 -0400  72) 		if (inode == ERR_PTR(-ESTALE)) {
a9049376ee05b (Al Viro            2011-07-08 21:20:11 -0400  73) 			ext2_error(dir->i_sb, __func__,
a9049376ee05b (Al Viro            2011-07-08 21:20:11 -0400  74) 					"deleted inode referenced: %lu",
a9049376ee05b (Al Viro            2011-07-08 21:20:11 -0400  75) 					(unsigned long) ino);
a9049376ee05b (Al Viro            2011-07-08 21:20:11 -0400  76) 			return ERR_PTR(-EIO);
4d6c13f87db12 (Bryan Donlan       2009-06-30 11:41:24 -0700  77) 		}
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  78) 	}
082a05c6f02e0 (Pekka Enberg       2006-01-14 13:21:07 -0800  79) 	return d_splice_alias(inode, dentry);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  80) }
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  81) 
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  82) struct dentry *ext2_get_parent(struct dentry *child)
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  83) {
a43850a380ef5 (zhangyi (F)        2020-06-08 11:40:43 +0800  84) 	ino_t ino;
b4962091a54c8 (zhangyi (F)        2020-06-08 11:40:42 +0800  85) 	int res;
b4962091a54c8 (zhangyi (F)        2020-06-08 11:40:42 +0800  86) 
80e5d1ff5d5f1 (Al Viro            2021-04-15 19:46:50 -0400  87) 	res = ext2_inode_by_name(d_inode(child), &dotdot_name, &ino);
b4962091a54c8 (zhangyi (F)        2020-06-08 11:40:42 +0800  88) 	if (res)
b4962091a54c8 (zhangyi (F)        2020-06-08 11:40:42 +0800  89) 		return ERR_PTR(res);
a43850a380ef5 (zhangyi (F)        2020-06-08 11:40:43 +0800  90) 
fc64005c93090 (Al Viro            2016-04-10 01:33:30 -0400  91) 	return d_obtain_alias(ext2_iget(child->d_sb, ino));
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  92) } 
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  93) 
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  94) /*
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  95)  * By the time this is called, we already have created
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  96)  * the directory cache entry for the new file, but it
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  97)  * is so far negative - it has no inode.
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  98)  *
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700  99)  * If the create succeeds, we fill in the inode information
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 100)  * with d_instantiate(). 
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 101)  */
549c7297717c3 (Christian Brauner  2021-01-21 14:19:43 +0100 102) static int ext2_create (struct user_namespace * mnt_userns,
549c7297717c3 (Christian Brauner  2021-01-21 14:19:43 +0100 103) 			struct inode * dir, struct dentry * dentry,
549c7297717c3 (Christian Brauner  2021-01-21 14:19:43 +0100 104) 			umode_t mode, bool excl)
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 105) {
907f4554e2521 (Christoph Hellwig  2010-03-03 09:05:06 -0500 106) 	struct inode *inode;
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 107) 	int err;
907f4554e2521 (Christoph Hellwig  2010-03-03 09:05:06 -0500 108) 
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 109) 	err = dquot_initialize(dir);
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 110) 	if (err)
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 111) 		return err;
907f4554e2521 (Christoph Hellwig  2010-03-03 09:05:06 -0500 112) 
2a7dba391e562 (Eric Paris         2011-02-01 11:05:39 -0500 113) 	inode = ext2_new_inode(dir, mode, &dentry->d_name);
907f4554e2521 (Christoph Hellwig  2010-03-03 09:05:06 -0500 114) 	if (IS_ERR(inode))
907f4554e2521 (Christoph Hellwig  2010-03-03 09:05:06 -0500 115) 		return PTR_ERR(inode);
907f4554e2521 (Christoph Hellwig  2010-03-03 09:05:06 -0500 116) 
fb094c90748fb (Dan Williams       2017-12-21 12:25:11 -0800 117) 	ext2_set_file_ops(inode);
907f4554e2521 (Christoph Hellwig  2010-03-03 09:05:06 -0500 118) 	mark_inode_dirty(inode);
907f4554e2521 (Christoph Hellwig  2010-03-03 09:05:06 -0500 119) 	return ext2_add_nondir(dentry, inode);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 120) }
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 121) 
549c7297717c3 (Christian Brauner  2021-01-21 14:19:43 +0100 122) static int ext2_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
549c7297717c3 (Christian Brauner  2021-01-21 14:19:43 +0100 123) 			struct dentry *dentry, umode_t mode)
60545d0d4610b (Al Viro            2013-06-07 01:20:27 -0400 124) {
60545d0d4610b (Al Viro            2013-06-07 01:20:27 -0400 125) 	struct inode *inode = ext2_new_inode(dir, mode, NULL);
60545d0d4610b (Al Viro            2013-06-07 01:20:27 -0400 126) 	if (IS_ERR(inode))
60545d0d4610b (Al Viro            2013-06-07 01:20:27 -0400 127) 		return PTR_ERR(inode);
60545d0d4610b (Al Viro            2013-06-07 01:20:27 -0400 128) 
fb094c90748fb (Dan Williams       2017-12-21 12:25:11 -0800 129) 	ext2_set_file_ops(inode);
60545d0d4610b (Al Viro            2013-06-07 01:20:27 -0400 130) 	mark_inode_dirty(inode);
60545d0d4610b (Al Viro            2013-06-07 01:20:27 -0400 131) 	d_tmpfile(dentry, inode);
60545d0d4610b (Al Viro            2013-06-07 01:20:27 -0400 132) 	unlock_new_inode(inode);
60545d0d4610b (Al Viro            2013-06-07 01:20:27 -0400 133) 	return 0;
60545d0d4610b (Al Viro            2013-06-07 01:20:27 -0400 134) }
60545d0d4610b (Al Viro            2013-06-07 01:20:27 -0400 135) 
549c7297717c3 (Christian Brauner  2021-01-21 14:19:43 +0100 136) static int ext2_mknod (struct user_namespace * mnt_userns, struct inode * dir,
549c7297717c3 (Christian Brauner  2021-01-21 14:19:43 +0100 137) 	struct dentry *dentry, umode_t mode, dev_t rdev)
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 138) {
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 139) 	struct inode * inode;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 140) 	int err;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 141) 
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 142) 	err = dquot_initialize(dir);
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 143) 	if (err)
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 144) 		return err;
907f4554e2521 (Christoph Hellwig  2010-03-03 09:05:06 -0500 145) 
2a7dba391e562 (Eric Paris         2011-02-01 11:05:39 -0500 146) 	inode = ext2_new_inode (dir, mode, &dentry->d_name);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 147) 	err = PTR_ERR(inode);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 148) 	if (!IS_ERR(inode)) {
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 149) 		init_special_inode(inode, inode->i_mode, rdev);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 150) 		inode->i_op = &ext2_special_inode_operations;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 151) 		mark_inode_dirty(inode);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 152) 		err = ext2_add_nondir(dentry, inode);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 153) 	}
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 154) 	return err;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 155) }
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 156) 
549c7297717c3 (Christian Brauner  2021-01-21 14:19:43 +0100 157) static int ext2_symlink (struct user_namespace * mnt_userns, struct inode * dir,
549c7297717c3 (Christian Brauner  2021-01-21 14:19:43 +0100 158) 	struct dentry * dentry, const char * symname)
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 159) {
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 160) 	struct super_block * sb = dir->i_sb;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 161) 	int err = -ENAMETOOLONG;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 162) 	unsigned l = strlen(symname)+1;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 163) 	struct inode * inode;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 164) 
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 165) 	if (l > sb->s_blocksize)
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 166) 		goto out;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 167) 
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 168) 	err = dquot_initialize(dir);
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 169) 	if (err)
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 170) 		goto out;
907f4554e2521 (Christoph Hellwig  2010-03-03 09:05:06 -0500 171) 
2a7dba391e562 (Eric Paris         2011-02-01 11:05:39 -0500 172) 	inode = ext2_new_inode (dir, S_IFLNK | S_IRWXUGO, &dentry->d_name);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 173) 	err = PTR_ERR(inode);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 174) 	if (IS_ERR(inode))
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 175) 		goto out;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 176) 
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 177) 	if (l > sizeof (EXT2_I(inode)->i_data)) {
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 178) 		/* slow symlink */
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 179) 		inode->i_op = &ext2_symlink_inode_operations;
21fc61c73c390 (Al Viro            2015-11-17 01:07:57 -0500 180) 		inode_nohighmem(inode);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 181) 		if (test_opt(inode->i_sb, NOBH))
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 182) 			inode->i_mapping->a_ops = &ext2_nobh_aops;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 183) 		else
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 184) 			inode->i_mapping->a_ops = &ext2_aops;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 185) 		err = page_symlink(inode, symname, l);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 186) 		if (err)
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 187) 			goto out_fail;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 188) 	} else {
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 189) 		/* fast symlink */
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 190) 		inode->i_op = &ext2_fast_symlink_inode_operations;
cbe0fa3858cd6 (Al Viro            2015-05-02 10:02:46 -0400 191) 		inode->i_link = (char*)EXT2_I(inode)->i_data;
cbe0fa3858cd6 (Al Viro            2015-05-02 10:02:46 -0400 192) 		memcpy(inode->i_link, symname, l);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 193) 		inode->i_size = l-1;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 194) 	}
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 195) 	mark_inode_dirty(inode);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 196) 
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 197) 	err = ext2_add_nondir(dentry, inode);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 198) out:
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 199) 	return err;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 200) 
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 201) out_fail:
a513b035eadf8 (Alexey Dobriyan    2006-03-23 03:00:53 -0800 202) 	inode_dec_link_count(inode);
2e5afe54e0cd6 (Al Viro            2018-05-16 18:29:56 -0400 203) 	discard_new_inode(inode);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 204) 	goto out;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 205) }
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 206) 
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 207) static int ext2_link (struct dentry * old_dentry, struct inode * dir,
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 208) 	struct dentry *dentry)
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 209) {
2b0143b5c986b (David Howells      2015-03-17 22:25:59 +0000 210) 	struct inode *inode = d_inode(old_dentry);
41080b5a24011 (Al Viro            2008-12-30 01:52:35 -0500 211) 	int err;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 212) 
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 213) 	err = dquot_initialize(dir);
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 214) 	if (err)
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 215) 		return err;
907f4554e2521 (Christoph Hellwig  2010-03-03 09:05:06 -0500 216) 
02027d42c3f74 (Deepa Dinamani     2016-09-14 07:48:05 -0700 217) 	inode->i_ctime = current_time(inode);
a513b035eadf8 (Alexey Dobriyan    2006-03-23 03:00:53 -0800 218) 	inode_inc_link_count(inode);
7de9c6ee3ecff (Al Viro            2010-10-23 11:11:40 -0400 219) 	ihold(inode);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 220) 
41080b5a24011 (Al Viro            2008-12-30 01:52:35 -0500 221) 	err = ext2_add_link(dentry, inode);
41080b5a24011 (Al Viro            2008-12-30 01:52:35 -0500 222) 	if (!err) {
41080b5a24011 (Al Viro            2008-12-30 01:52:35 -0500 223) 		d_instantiate(dentry, inode);
41080b5a24011 (Al Viro            2008-12-30 01:52:35 -0500 224) 		return 0;
41080b5a24011 (Al Viro            2008-12-30 01:52:35 -0500 225) 	}
41080b5a24011 (Al Viro            2008-12-30 01:52:35 -0500 226) 	inode_dec_link_count(inode);
41080b5a24011 (Al Viro            2008-12-30 01:52:35 -0500 227) 	iput(inode);
41080b5a24011 (Al Viro            2008-12-30 01:52:35 -0500 228) 	return err;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 229) }
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 230) 
549c7297717c3 (Christian Brauner  2021-01-21 14:19:43 +0100 231) static int ext2_mkdir(struct user_namespace * mnt_userns,
549c7297717c3 (Christian Brauner  2021-01-21 14:19:43 +0100 232) 	struct inode * dir, struct dentry * dentry, umode_t mode)
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 233) {
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 234) 	struct inode * inode;
8de52778798fe (Al Viro            2012-02-06 12:45:27 -0500 235) 	int err;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 236) 
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 237) 	err = dquot_initialize(dir);
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 238) 	if (err)
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 239) 		return err;
907f4554e2521 (Christoph Hellwig  2010-03-03 09:05:06 -0500 240) 
a513b035eadf8 (Alexey Dobriyan    2006-03-23 03:00:53 -0800 241) 	inode_inc_link_count(dir);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 242) 
2a7dba391e562 (Eric Paris         2011-02-01 11:05:39 -0500 243) 	inode = ext2_new_inode(dir, S_IFDIR | mode, &dentry->d_name);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 244) 	err = PTR_ERR(inode);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 245) 	if (IS_ERR(inode))
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 246) 		goto out_dir;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 247) 
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 248) 	inode->i_op = &ext2_dir_inode_operations;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 249) 	inode->i_fop = &ext2_dir_operations;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 250) 	if (test_opt(inode->i_sb, NOBH))
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 251) 		inode->i_mapping->a_ops = &ext2_nobh_aops;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 252) 	else
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 253) 		inode->i_mapping->a_ops = &ext2_aops;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 254) 
a513b035eadf8 (Alexey Dobriyan    2006-03-23 03:00:53 -0800 255) 	inode_inc_link_count(inode);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 256) 
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 257) 	err = ext2_make_empty(inode, dir);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 258) 	if (err)
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 259) 		goto out_fail;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 260) 
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 261) 	err = ext2_add_link(dentry, inode);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 262) 	if (err)
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 263) 		goto out_fail;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 264) 
1e2e547a93a00 (Al Viro            2018-05-04 08:23:01 -0400 265) 	d_instantiate_new(dentry, inode);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 266) out:
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 267) 	return err;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 268) 
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 269) out_fail:
a513b035eadf8 (Alexey Dobriyan    2006-03-23 03:00:53 -0800 270) 	inode_dec_link_count(inode);
a513b035eadf8 (Alexey Dobriyan    2006-03-23 03:00:53 -0800 271) 	inode_dec_link_count(inode);
2e5afe54e0cd6 (Al Viro            2018-05-16 18:29:56 -0400 272) 	discard_new_inode(inode);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 273) out_dir:
a513b035eadf8 (Alexey Dobriyan    2006-03-23 03:00:53 -0800 274) 	inode_dec_link_count(dir);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 275) 	goto out;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 276) }
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 277) 
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 278) static int ext2_unlink(struct inode * dir, struct dentry *dentry)
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 279) {
2b0143b5c986b (David Howells      2015-03-17 22:25:59 +0000 280) 	struct inode * inode = d_inode(dentry);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 281) 	struct ext2_dir_entry_2 * de;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 282) 	struct page * page;
782b76d7abdf0 (Ira Weiny          2021-03-28 23:54:02 -0700 283) 	void *page_addr;
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 284) 	int err;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 285) 
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 286) 	err = dquot_initialize(dir);
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 287) 	if (err)
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 288) 		goto out;
907f4554e2521 (Christoph Hellwig  2010-03-03 09:05:06 -0500 289) 
782b76d7abdf0 (Ira Weiny          2021-03-28 23:54:02 -0700 290) 	de = ext2_find_entry(dir, &dentry->d_name, &page, &page_addr);
b4962091a54c8 (zhangyi (F)        2020-06-08 11:40:42 +0800 291) 	if (IS_ERR(de)) {
b4962091a54c8 (zhangyi (F)        2020-06-08 11:40:42 +0800 292) 		err = PTR_ERR(de);
b4962091a54c8 (zhangyi (F)        2020-06-08 11:40:42 +0800 293) 		goto out;
b4962091a54c8 (zhangyi (F)        2020-06-08 11:40:42 +0800 294) 	}
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 295) 
89e34995bdd78 (Javier Pello       2021-07-14 18:54:48 +0200 296) 	err = ext2_delete_entry (de, page, page_addr);
782b76d7abdf0 (Ira Weiny          2021-03-28 23:54:02 -0700 297) 	ext2_put_page(page, page_addr);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 298) 	if (err)
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 299) 		goto out;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 300) 
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 301) 	inode->i_ctime = dir->i_ctime;
a513b035eadf8 (Alexey Dobriyan    2006-03-23 03:00:53 -0800 302) 	inode_dec_link_count(inode);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 303) 	err = 0;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 304) out:
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 305) 	return err;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 306) }
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 307) 
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 308) static int ext2_rmdir (struct inode * dir, struct dentry *dentry)
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 309) {
2b0143b5c986b (David Howells      2015-03-17 22:25:59 +0000 310) 	struct inode * inode = d_inode(dentry);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 311) 	int err = -ENOTEMPTY;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 312) 
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 313) 	if (ext2_empty_dir(inode)) {
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 314) 		err = ext2_unlink(dir, dentry);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 315) 		if (!err) {
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 316) 			inode->i_size = 0;
a513b035eadf8 (Alexey Dobriyan    2006-03-23 03:00:53 -0800 317) 			inode_dec_link_count(inode);
a513b035eadf8 (Alexey Dobriyan    2006-03-23 03:00:53 -0800 318) 			inode_dec_link_count(dir);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 319) 		}
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 320) 	}
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 321) 	return err;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 322) }
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 323) 
549c7297717c3 (Christian Brauner  2021-01-21 14:19:43 +0100 324) static int ext2_rename (struct user_namespace * mnt_userns,
549c7297717c3 (Christian Brauner  2021-01-21 14:19:43 +0100 325) 			struct inode * old_dir, struct dentry * old_dentry,
549c7297717c3 (Christian Brauner  2021-01-21 14:19:43 +0100 326) 			struct inode * new_dir, struct dentry * new_dentry,
f03b8ad8d3863 (Miklos Szeredi     2016-09-27 11:03:57 +0200 327) 			unsigned int flags)
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 328) {
2b0143b5c986b (David Howells      2015-03-17 22:25:59 +0000 329) 	struct inode * old_inode = d_inode(old_dentry);
2b0143b5c986b (David Howells      2015-03-17 22:25:59 +0000 330) 	struct inode * new_inode = d_inode(new_dentry);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 331) 	struct page * dir_page = NULL;
782b76d7abdf0 (Ira Weiny          2021-03-28 23:54:02 -0700 332) 	void *dir_page_addr;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 333) 	struct ext2_dir_entry_2 * dir_de = NULL;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 334) 	struct page * old_page;
782b76d7abdf0 (Ira Weiny          2021-03-28 23:54:02 -0700 335) 	void *old_page_addr;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 336) 	struct ext2_dir_entry_2 * old_de;
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 337) 	int err;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 338) 
f03b8ad8d3863 (Miklos Szeredi     2016-09-27 11:03:57 +0200 339) 	if (flags & ~RENAME_NOREPLACE)
f03b8ad8d3863 (Miklos Szeredi     2016-09-27 11:03:57 +0200 340) 		return -EINVAL;
f03b8ad8d3863 (Miklos Szeredi     2016-09-27 11:03:57 +0200 341) 
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 342) 	err = dquot_initialize(old_dir);
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 343) 	if (err)
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 344) 		goto out;
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 345) 
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 346) 	err = dquot_initialize(new_dir);
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 347) 	if (err)
c2edb305d6846 (Jan Kara           2015-06-29 16:08:45 +0200 348) 		goto out;
907f4554e2521 (Christoph Hellwig  2010-03-03 09:05:06 -0500 349) 
782b76d7abdf0 (Ira Weiny          2021-03-28 23:54:02 -0700 350) 	old_de = ext2_find_entry(old_dir, &old_dentry->d_name, &old_page,
782b76d7abdf0 (Ira Weiny          2021-03-28 23:54:02 -0700 351) 				 &old_page_addr);
b4962091a54c8 (zhangyi (F)        2020-06-08 11:40:42 +0800 352) 	if (IS_ERR(old_de)) {
b4962091a54c8 (zhangyi (F)        2020-06-08 11:40:42 +0800 353) 		err = PTR_ERR(old_de);
b4962091a54c8 (zhangyi (F)        2020-06-08 11:40:42 +0800 354) 		goto out;
b4962091a54c8 (zhangyi (F)        2020-06-08 11:40:42 +0800 355) 	}
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 356) 
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 357) 	if (S_ISDIR(old_inode->i_mode)) {
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 358) 		err = -EIO;
782b76d7abdf0 (Ira Weiny          2021-03-28 23:54:02 -0700 359) 		dir_de = ext2_dotdot(old_inode, &dir_page, &dir_page_addr);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 360) 		if (!dir_de)
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 361) 			goto out_old;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 362) 	}
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 363) 
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 364) 	if (new_inode) {
782b76d7abdf0 (Ira Weiny          2021-03-28 23:54:02 -0700 365) 		void *page_addr;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 366) 		struct page *new_page;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 367) 		struct ext2_dir_entry_2 *new_de;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 368) 
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 369) 		err = -ENOTEMPTY;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 370) 		if (dir_de && !ext2_empty_dir (new_inode))
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 371) 			goto out_dir;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 372) 
782b76d7abdf0 (Ira Weiny          2021-03-28 23:54:02 -0700 373) 		new_de = ext2_find_entry(new_dir, &new_dentry->d_name,
782b76d7abdf0 (Ira Weiny          2021-03-28 23:54:02 -0700 374) 					 &new_page, &page_addr);
b4962091a54c8 (zhangyi (F)        2020-06-08 11:40:42 +0800 375) 		if (IS_ERR(new_de)) {
b4962091a54c8 (zhangyi (F)        2020-06-08 11:40:42 +0800 376) 			err = PTR_ERR(new_de);
b4962091a54c8 (zhangyi (F)        2020-06-08 11:40:42 +0800 377) 			goto out_dir;
b4962091a54c8 (zhangyi (F)        2020-06-08 11:40:42 +0800 378) 		}
782b76d7abdf0 (Ira Weiny          2021-03-28 23:54:02 -0700 379) 		ext2_set_link(new_dir, new_de, new_page, page_addr, old_inode, 1);
782b76d7abdf0 (Ira Weiny          2021-03-28 23:54:02 -0700 380) 		ext2_put_page(new_page, page_addr);
02027d42c3f74 (Deepa Dinamani     2016-09-14 07:48:05 -0700 381) 		new_inode->i_ctime = current_time(new_inode);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 382) 		if (dir_de)
9a53c3a783c2f (Dave Hansen        2006-09-30 23:29:03 -0700 383) 			drop_nlink(new_inode);
a513b035eadf8 (Alexey Dobriyan    2006-03-23 03:00:53 -0800 384) 		inode_dec_link_count(new_inode);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 385) 	} else {
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 386) 		err = ext2_add_link(new_dentry, old_inode);
e8a80c6f769dd (Josh Hunt          2011-02-24 11:48:22 +0100 387) 		if (err)
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 388) 			goto out_dir;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 389) 		if (dir_de)
a513b035eadf8 (Alexey Dobriyan    2006-03-23 03:00:53 -0800 390) 			inode_inc_link_count(new_dir);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 391) 	}
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 392) 
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 393) 	/*
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 394) 	 * Like most other Unix systems, set the ctime for inodes on a
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 395)  	 * rename.
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 396) 	 */
02027d42c3f74 (Deepa Dinamani     2016-09-14 07:48:05 -0700 397) 	old_inode->i_ctime = current_time(old_inode);
e8a80c6f769dd (Josh Hunt          2011-02-24 11:48:22 +0100 398) 	mark_inode_dirty(old_inode);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 399) 
89e34995bdd78 (Javier Pello       2021-07-14 18:54:48 +0200 400) 	ext2_delete_entry(old_de, old_page, old_page_addr);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 401) 
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 402) 	if (dir_de) {
39fe7557b4d6a (Jan Kara           2009-06-17 16:26:20 -0700 403) 		if (old_dir != new_dir)
782b76d7abdf0 (Ira Weiny          2021-03-28 23:54:02 -0700 404) 			ext2_set_link(old_inode, dir_de, dir_page,
782b76d7abdf0 (Ira Weiny          2021-03-28 23:54:02 -0700 405) 				      dir_page_addr, new_dir, 0);
e2ebb12304559 (Ira Weiny          2021-03-28 23:54:01 -0700 406) 
782b76d7abdf0 (Ira Weiny          2021-03-28 23:54:02 -0700 407) 		ext2_put_page(dir_page, dir_page_addr);
a513b035eadf8 (Alexey Dobriyan    2006-03-23 03:00:53 -0800 408) 		inode_dec_link_count(old_dir);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 409) 	}
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 410) 
782b76d7abdf0 (Ira Weiny          2021-03-28 23:54:02 -0700 411) 	ext2_put_page(old_page, old_page_addr);
782b76d7abdf0 (Ira Weiny          2021-03-28 23:54:02 -0700 412) 	return 0;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 413) 
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 414) out_dir:
a6fbd0ab3d7a1 (Ira Weiny          2020-11-12 09:42:44 -0800 415) 	if (dir_de)
782b76d7abdf0 (Ira Weiny          2021-03-28 23:54:02 -0700 416) 		ext2_put_page(dir_page, dir_page_addr);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 417) out_old:
782b76d7abdf0 (Ira Weiny          2021-03-28 23:54:02 -0700 418) 	ext2_put_page(old_page, old_page_addr);
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 419) out:
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 420) 	return err;
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 421) }
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 422) 
754661f143e70 (Arjan van de Ven   2007-02-12 00:55:38 -0800 423) const struct inode_operations ext2_dir_inode_operations = {
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 424) 	.create		= ext2_create,
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 425) 	.lookup		= ext2_lookup,
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 426) 	.link		= ext2_link,
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 427) 	.unlink		= ext2_unlink,
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 428) 	.symlink	= ext2_symlink,
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 429) 	.mkdir		= ext2_mkdir,
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 430) 	.rmdir		= ext2_rmdir,
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 431) 	.mknod		= ext2_mknod,
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 432) 	.rename		= ext2_rename,
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 433) 	.listxattr	= ext2_listxattr,
93bc420ed41df (yangerkun          2019-02-18 09:07:02 +0800 434) 	.getattr	= ext2_getattr,
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 435) 	.setattr	= ext2_setattr,
4e34e719e457f (Christoph Hellwig  2011-07-23 17:37:31 +0200 436) 	.get_acl	= ext2_get_acl,
64e178a7118b1 (Christoph Hellwig  2013-12-20 05:16:44 -0800 437) 	.set_acl	= ext2_set_acl,
60545d0d4610b (Al Viro            2013-06-07 01:20:27 -0400 438) 	.tmpfile	= ext2_tmpfile,
aba405e33e150 (Miklos Szeredi     2021-04-07 14:36:43 +0200 439) 	.fileattr_get	= ext2_fileattr_get,
aba405e33e150 (Miklos Szeredi     2021-04-07 14:36:43 +0200 440) 	.fileattr_set	= ext2_fileattr_set,
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 441) };
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 442) 
754661f143e70 (Arjan van de Ven   2007-02-12 00:55:38 -0800 443) const struct inode_operations ext2_special_inode_operations = {
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 444) 	.listxattr	= ext2_listxattr,
93bc420ed41df (yangerkun          2019-02-18 09:07:02 +0800 445) 	.getattr	= ext2_getattr,
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 446) 	.setattr	= ext2_setattr,
4e34e719e457f (Christoph Hellwig  2011-07-23 17:37:31 +0200 447) 	.get_acl	= ext2_get_acl,
64e178a7118b1 (Christoph Hellwig  2013-12-20 05:16:44 -0800 448) 	.set_acl	= ext2_set_acl,
^1da177e4c3f4 (Linus Torvalds     2005-04-16 15:20:36 -0700 449) };