xref: /openbmc/linux/fs/ext4/orphan.c (revision 25c6d98f)
1*25c6d98fSJan Kara /*
2*25c6d98fSJan Kara  * Ext4 orphan inode handling
3*25c6d98fSJan Kara  */
4*25c6d98fSJan Kara #include <linux/fs.h>
5*25c6d98fSJan Kara #include <linux/quotaops.h>
6*25c6d98fSJan Kara #include <linux/buffer_head.h>
7*25c6d98fSJan Kara 
8*25c6d98fSJan Kara #include "ext4.h"
9*25c6d98fSJan Kara #include "ext4_jbd2.h"
10*25c6d98fSJan Kara 
11*25c6d98fSJan Kara /*
12*25c6d98fSJan Kara  * ext4_orphan_add() links an unlinked or truncated inode into a list of
13*25c6d98fSJan Kara  * such inodes, starting at the superblock, in case we crash before the
14*25c6d98fSJan Kara  * file is closed/deleted, or in case the inode truncate spans multiple
15*25c6d98fSJan Kara  * transactions and the last transaction is not recovered after a crash.
16*25c6d98fSJan Kara  *
17*25c6d98fSJan Kara  * At filesystem recovery time, we walk this list deleting unlinked
18*25c6d98fSJan Kara  * inodes and truncating linked inodes in ext4_orphan_cleanup().
19*25c6d98fSJan Kara  *
20*25c6d98fSJan Kara  * Orphan list manipulation functions must be called under i_mutex unless
21*25c6d98fSJan Kara  * we are just creating the inode or deleting it.
22*25c6d98fSJan Kara  */
23*25c6d98fSJan Kara int ext4_orphan_add(handle_t *handle, struct inode *inode)
24*25c6d98fSJan Kara {
25*25c6d98fSJan Kara 	struct super_block *sb = inode->i_sb;
26*25c6d98fSJan Kara 	struct ext4_sb_info *sbi = EXT4_SB(sb);
27*25c6d98fSJan Kara 	struct ext4_iloc iloc;
28*25c6d98fSJan Kara 	int err = 0, rc;
29*25c6d98fSJan Kara 	bool dirty = false;
30*25c6d98fSJan Kara 
31*25c6d98fSJan Kara 	if (!sbi->s_journal || is_bad_inode(inode))
32*25c6d98fSJan Kara 		return 0;
33*25c6d98fSJan Kara 
34*25c6d98fSJan Kara 	WARN_ON_ONCE(!(inode->i_state & (I_NEW | I_FREEING)) &&
35*25c6d98fSJan Kara 		     !inode_is_locked(inode));
36*25c6d98fSJan Kara 	/*
37*25c6d98fSJan Kara 	 * Exit early if inode already is on orphan list. This is a big speedup
38*25c6d98fSJan Kara 	 * since we don't have to contend on the global s_orphan_lock.
39*25c6d98fSJan Kara 	 */
40*25c6d98fSJan Kara 	if (!list_empty(&EXT4_I(inode)->i_orphan))
41*25c6d98fSJan Kara 		return 0;
42*25c6d98fSJan Kara 
43*25c6d98fSJan Kara 	/*
44*25c6d98fSJan Kara 	 * Orphan handling is only valid for files with data blocks
45*25c6d98fSJan Kara 	 * being truncated, or files being unlinked. Note that we either
46*25c6d98fSJan Kara 	 * hold i_mutex, or the inode can not be referenced from outside,
47*25c6d98fSJan Kara 	 * so i_nlink should not be bumped due to race
48*25c6d98fSJan Kara 	 */
49*25c6d98fSJan Kara 	ASSERT((S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
50*25c6d98fSJan Kara 		  S_ISLNK(inode->i_mode)) || inode->i_nlink == 0);
51*25c6d98fSJan Kara 
52*25c6d98fSJan Kara 	BUFFER_TRACE(sbi->s_sbh, "get_write_access");
53*25c6d98fSJan Kara 	err = ext4_journal_get_write_access(handle, sb, sbi->s_sbh,
54*25c6d98fSJan Kara 					    EXT4_JTR_NONE);
55*25c6d98fSJan Kara 	if (err)
56*25c6d98fSJan Kara 		goto out;
57*25c6d98fSJan Kara 
58*25c6d98fSJan Kara 	err = ext4_reserve_inode_write(handle, inode, &iloc);
59*25c6d98fSJan Kara 	if (err)
60*25c6d98fSJan Kara 		goto out;
61*25c6d98fSJan Kara 
62*25c6d98fSJan Kara 	mutex_lock(&sbi->s_orphan_lock);
63*25c6d98fSJan Kara 	/*
64*25c6d98fSJan Kara 	 * Due to previous errors inode may be already a part of on-disk
65*25c6d98fSJan Kara 	 * orphan list. If so skip on-disk list modification.
66*25c6d98fSJan Kara 	 */
67*25c6d98fSJan Kara 	if (!NEXT_ORPHAN(inode) || NEXT_ORPHAN(inode) >
68*25c6d98fSJan Kara 	    (le32_to_cpu(sbi->s_es->s_inodes_count))) {
69*25c6d98fSJan Kara 		/* Insert this inode at the head of the on-disk orphan list */
70*25c6d98fSJan Kara 		NEXT_ORPHAN(inode) = le32_to_cpu(sbi->s_es->s_last_orphan);
71*25c6d98fSJan Kara 		lock_buffer(sbi->s_sbh);
72*25c6d98fSJan Kara 		sbi->s_es->s_last_orphan = cpu_to_le32(inode->i_ino);
73*25c6d98fSJan Kara 		ext4_superblock_csum_set(sb);
74*25c6d98fSJan Kara 		unlock_buffer(sbi->s_sbh);
75*25c6d98fSJan Kara 		dirty = true;
76*25c6d98fSJan Kara 	}
77*25c6d98fSJan Kara 	list_add(&EXT4_I(inode)->i_orphan, &sbi->s_orphan);
78*25c6d98fSJan Kara 	mutex_unlock(&sbi->s_orphan_lock);
79*25c6d98fSJan Kara 
80*25c6d98fSJan Kara 	if (dirty) {
81*25c6d98fSJan Kara 		err = ext4_handle_dirty_metadata(handle, NULL, sbi->s_sbh);
82*25c6d98fSJan Kara 		rc = ext4_mark_iloc_dirty(handle, inode, &iloc);
83*25c6d98fSJan Kara 		if (!err)
84*25c6d98fSJan Kara 			err = rc;
85*25c6d98fSJan Kara 		if (err) {
86*25c6d98fSJan Kara 			/*
87*25c6d98fSJan Kara 			 * We have to remove inode from in-memory list if
88*25c6d98fSJan Kara 			 * addition to on disk orphan list failed. Stray orphan
89*25c6d98fSJan Kara 			 * list entries can cause panics at unmount time.
90*25c6d98fSJan Kara 			 */
91*25c6d98fSJan Kara 			mutex_lock(&sbi->s_orphan_lock);
92*25c6d98fSJan Kara 			list_del_init(&EXT4_I(inode)->i_orphan);
93*25c6d98fSJan Kara 			mutex_unlock(&sbi->s_orphan_lock);
94*25c6d98fSJan Kara 		}
95*25c6d98fSJan Kara 	} else
96*25c6d98fSJan Kara 		brelse(iloc.bh);
97*25c6d98fSJan Kara 
98*25c6d98fSJan Kara 	jbd_debug(4, "superblock will point to %lu\n", inode->i_ino);
99*25c6d98fSJan Kara 	jbd_debug(4, "orphan inode %lu will point to %d\n",
100*25c6d98fSJan Kara 			inode->i_ino, NEXT_ORPHAN(inode));
101*25c6d98fSJan Kara out:
102*25c6d98fSJan Kara 	ext4_std_error(sb, err);
103*25c6d98fSJan Kara 	return err;
104*25c6d98fSJan Kara }
105*25c6d98fSJan Kara 
106*25c6d98fSJan Kara /*
107*25c6d98fSJan Kara  * ext4_orphan_del() removes an unlinked or truncated inode from the list
108*25c6d98fSJan Kara  * of such inodes stored on disk, because it is finally being cleaned up.
109*25c6d98fSJan Kara  */
110*25c6d98fSJan Kara int ext4_orphan_del(handle_t *handle, struct inode *inode)
111*25c6d98fSJan Kara {
112*25c6d98fSJan Kara 	struct list_head *prev;
113*25c6d98fSJan Kara 	struct ext4_inode_info *ei = EXT4_I(inode);
114*25c6d98fSJan Kara 	struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
115*25c6d98fSJan Kara 	__u32 ino_next;
116*25c6d98fSJan Kara 	struct ext4_iloc iloc;
117*25c6d98fSJan Kara 	int err = 0;
118*25c6d98fSJan Kara 
119*25c6d98fSJan Kara 	if (!sbi->s_journal && !(sbi->s_mount_state & EXT4_ORPHAN_FS))
120*25c6d98fSJan Kara 		return 0;
121*25c6d98fSJan Kara 
122*25c6d98fSJan Kara 	WARN_ON_ONCE(!(inode->i_state & (I_NEW | I_FREEING)) &&
123*25c6d98fSJan Kara 		     !inode_is_locked(inode));
124*25c6d98fSJan Kara 	/* Do this quick check before taking global s_orphan_lock. */
125*25c6d98fSJan Kara 	if (list_empty(&ei->i_orphan))
126*25c6d98fSJan Kara 		return 0;
127*25c6d98fSJan Kara 
128*25c6d98fSJan Kara 	if (handle) {
129*25c6d98fSJan Kara 		/* Grab inode buffer early before taking global s_orphan_lock */
130*25c6d98fSJan Kara 		err = ext4_reserve_inode_write(handle, inode, &iloc);
131*25c6d98fSJan Kara 	}
132*25c6d98fSJan Kara 
133*25c6d98fSJan Kara 	mutex_lock(&sbi->s_orphan_lock);
134*25c6d98fSJan Kara 	jbd_debug(4, "remove inode %lu from orphan list\n", inode->i_ino);
135*25c6d98fSJan Kara 
136*25c6d98fSJan Kara 	prev = ei->i_orphan.prev;
137*25c6d98fSJan Kara 	list_del_init(&ei->i_orphan);
138*25c6d98fSJan Kara 
139*25c6d98fSJan Kara 	/* If we're on an error path, we may not have a valid
140*25c6d98fSJan Kara 	 * transaction handle with which to update the orphan list on
141*25c6d98fSJan Kara 	 * disk, but we still need to remove the inode from the linked
142*25c6d98fSJan Kara 	 * list in memory. */
143*25c6d98fSJan Kara 	if (!handle || err) {
144*25c6d98fSJan Kara 		mutex_unlock(&sbi->s_orphan_lock);
145*25c6d98fSJan Kara 		goto out_err;
146*25c6d98fSJan Kara 	}
147*25c6d98fSJan Kara 
148*25c6d98fSJan Kara 	ino_next = NEXT_ORPHAN(inode);
149*25c6d98fSJan Kara 	if (prev == &sbi->s_orphan) {
150*25c6d98fSJan Kara 		jbd_debug(4, "superblock will point to %u\n", ino_next);
151*25c6d98fSJan Kara 		BUFFER_TRACE(sbi->s_sbh, "get_write_access");
152*25c6d98fSJan Kara 		err = ext4_journal_get_write_access(handle, inode->i_sb,
153*25c6d98fSJan Kara 						    sbi->s_sbh, EXT4_JTR_NONE);
154*25c6d98fSJan Kara 		if (err) {
155*25c6d98fSJan Kara 			mutex_unlock(&sbi->s_orphan_lock);
156*25c6d98fSJan Kara 			goto out_brelse;
157*25c6d98fSJan Kara 		}
158*25c6d98fSJan Kara 		lock_buffer(sbi->s_sbh);
159*25c6d98fSJan Kara 		sbi->s_es->s_last_orphan = cpu_to_le32(ino_next);
160*25c6d98fSJan Kara 		ext4_superblock_csum_set(inode->i_sb);
161*25c6d98fSJan Kara 		unlock_buffer(sbi->s_sbh);
162*25c6d98fSJan Kara 		mutex_unlock(&sbi->s_orphan_lock);
163*25c6d98fSJan Kara 		err = ext4_handle_dirty_metadata(handle, NULL, sbi->s_sbh);
164*25c6d98fSJan Kara 	} else {
165*25c6d98fSJan Kara 		struct ext4_iloc iloc2;
166*25c6d98fSJan Kara 		struct inode *i_prev =
167*25c6d98fSJan Kara 			&list_entry(prev, struct ext4_inode_info, i_orphan)->vfs_inode;
168*25c6d98fSJan Kara 
169*25c6d98fSJan Kara 		jbd_debug(4, "orphan inode %lu will point to %u\n",
170*25c6d98fSJan Kara 			  i_prev->i_ino, ino_next);
171*25c6d98fSJan Kara 		err = ext4_reserve_inode_write(handle, i_prev, &iloc2);
172*25c6d98fSJan Kara 		if (err) {
173*25c6d98fSJan Kara 			mutex_unlock(&sbi->s_orphan_lock);
174*25c6d98fSJan Kara 			goto out_brelse;
175*25c6d98fSJan Kara 		}
176*25c6d98fSJan Kara 		NEXT_ORPHAN(i_prev) = ino_next;
177*25c6d98fSJan Kara 		err = ext4_mark_iloc_dirty(handle, i_prev, &iloc2);
178*25c6d98fSJan Kara 		mutex_unlock(&sbi->s_orphan_lock);
179*25c6d98fSJan Kara 	}
180*25c6d98fSJan Kara 	if (err)
181*25c6d98fSJan Kara 		goto out_brelse;
182*25c6d98fSJan Kara 	NEXT_ORPHAN(inode) = 0;
183*25c6d98fSJan Kara 	err = ext4_mark_iloc_dirty(handle, inode, &iloc);
184*25c6d98fSJan Kara out_err:
185*25c6d98fSJan Kara 	ext4_std_error(inode->i_sb, err);
186*25c6d98fSJan Kara 	return err;
187*25c6d98fSJan Kara 
188*25c6d98fSJan Kara out_brelse:
189*25c6d98fSJan Kara 	brelse(iloc.bh);
190*25c6d98fSJan Kara 	goto out_err;
191*25c6d98fSJan Kara }
192*25c6d98fSJan Kara 
193*25c6d98fSJan Kara #ifdef CONFIG_QUOTA
194*25c6d98fSJan Kara static int ext4_quota_on_mount(struct super_block *sb, int type)
195*25c6d98fSJan Kara {
196*25c6d98fSJan Kara 	return dquot_quota_on_mount(sb,
197*25c6d98fSJan Kara 		rcu_dereference_protected(EXT4_SB(sb)->s_qf_names[type],
198*25c6d98fSJan Kara 					  lockdep_is_held(&sb->s_umount)),
199*25c6d98fSJan Kara 		EXT4_SB(sb)->s_jquota_fmt, type);
200*25c6d98fSJan Kara }
201*25c6d98fSJan Kara #endif
202*25c6d98fSJan Kara 
203*25c6d98fSJan Kara /* ext4_orphan_cleanup() walks a singly-linked list of inodes (starting at
204*25c6d98fSJan Kara  * the superblock) which were deleted from all directories, but held open by
205*25c6d98fSJan Kara  * a process at the time of a crash.  We walk the list and try to delete these
206*25c6d98fSJan Kara  * inodes at recovery time (only with a read-write filesystem).
207*25c6d98fSJan Kara  *
208*25c6d98fSJan Kara  * In order to keep the orphan inode chain consistent during traversal (in
209*25c6d98fSJan Kara  * case of crash during recovery), we link each inode into the superblock
210*25c6d98fSJan Kara  * orphan list_head and handle it the same way as an inode deletion during
211*25c6d98fSJan Kara  * normal operation (which journals the operations for us).
212*25c6d98fSJan Kara  *
213*25c6d98fSJan Kara  * We only do an iget() and an iput() on each inode, which is very safe if we
214*25c6d98fSJan Kara  * accidentally point at an in-use or already deleted inode.  The worst that
215*25c6d98fSJan Kara  * can happen in this case is that we get a "bit already cleared" message from
216*25c6d98fSJan Kara  * ext4_free_inode().  The only reason we would point at a wrong inode is if
217*25c6d98fSJan Kara  * e2fsck was run on this filesystem, and it must have already done the orphan
218*25c6d98fSJan Kara  * inode cleanup for us, so we can safely abort without any further action.
219*25c6d98fSJan Kara  */
220*25c6d98fSJan Kara void ext4_orphan_cleanup(struct super_block *sb, struct ext4_super_block *es)
221*25c6d98fSJan Kara {
222*25c6d98fSJan Kara 	unsigned int s_flags = sb->s_flags;
223*25c6d98fSJan Kara 	int ret, nr_orphans = 0, nr_truncates = 0;
224*25c6d98fSJan Kara #ifdef CONFIG_QUOTA
225*25c6d98fSJan Kara 	int quota_update = 0;
226*25c6d98fSJan Kara 	int i;
227*25c6d98fSJan Kara #endif
228*25c6d98fSJan Kara 	if (!es->s_last_orphan) {
229*25c6d98fSJan Kara 		jbd_debug(4, "no orphan inodes to clean up\n");
230*25c6d98fSJan Kara 		return;
231*25c6d98fSJan Kara 	}
232*25c6d98fSJan Kara 
233*25c6d98fSJan Kara 	if (bdev_read_only(sb->s_bdev)) {
234*25c6d98fSJan Kara 		ext4_msg(sb, KERN_ERR, "write access "
235*25c6d98fSJan Kara 			"unavailable, skipping orphan cleanup");
236*25c6d98fSJan Kara 		return;
237*25c6d98fSJan Kara 	}
238*25c6d98fSJan Kara 
239*25c6d98fSJan Kara 	/* Check if feature set would not allow a r/w mount */
240*25c6d98fSJan Kara 	if (!ext4_feature_set_ok(sb, 0)) {
241*25c6d98fSJan Kara 		ext4_msg(sb, KERN_INFO, "Skipping orphan cleanup due to "
242*25c6d98fSJan Kara 			 "unknown ROCOMPAT features");
243*25c6d98fSJan Kara 		return;
244*25c6d98fSJan Kara 	}
245*25c6d98fSJan Kara 
246*25c6d98fSJan Kara 	if (EXT4_SB(sb)->s_mount_state & EXT4_ERROR_FS) {
247*25c6d98fSJan Kara 		/* don't clear list on RO mount w/ errors */
248*25c6d98fSJan Kara 		if (es->s_last_orphan && !(s_flags & SB_RDONLY)) {
249*25c6d98fSJan Kara 			ext4_msg(sb, KERN_INFO, "Errors on filesystem, "
250*25c6d98fSJan Kara 				  "clearing orphan list.\n");
251*25c6d98fSJan Kara 			es->s_last_orphan = 0;
252*25c6d98fSJan Kara 		}
253*25c6d98fSJan Kara 		jbd_debug(1, "Skipping orphan recovery on fs with errors.\n");
254*25c6d98fSJan Kara 		return;
255*25c6d98fSJan Kara 	}
256*25c6d98fSJan Kara 
257*25c6d98fSJan Kara 	if (s_flags & SB_RDONLY) {
258*25c6d98fSJan Kara 		ext4_msg(sb, KERN_INFO, "orphan cleanup on readonly fs");
259*25c6d98fSJan Kara 		sb->s_flags &= ~SB_RDONLY;
260*25c6d98fSJan Kara 	}
261*25c6d98fSJan Kara #ifdef CONFIG_QUOTA
262*25c6d98fSJan Kara 	/*
263*25c6d98fSJan Kara 	 * Turn on quotas which were not enabled for read-only mounts if
264*25c6d98fSJan Kara 	 * filesystem has quota feature, so that they are updated correctly.
265*25c6d98fSJan Kara 	 */
266*25c6d98fSJan Kara 	if (ext4_has_feature_quota(sb) && (s_flags & SB_RDONLY)) {
267*25c6d98fSJan Kara 		int ret = ext4_enable_quotas(sb);
268*25c6d98fSJan Kara 
269*25c6d98fSJan Kara 		if (!ret)
270*25c6d98fSJan Kara 			quota_update = 1;
271*25c6d98fSJan Kara 		else
272*25c6d98fSJan Kara 			ext4_msg(sb, KERN_ERR,
273*25c6d98fSJan Kara 				"Cannot turn on quotas: error %d", ret);
274*25c6d98fSJan Kara 	}
275*25c6d98fSJan Kara 
276*25c6d98fSJan Kara 	/* Turn on journaled quotas used for old sytle */
277*25c6d98fSJan Kara 	for (i = 0; i < EXT4_MAXQUOTAS; i++) {
278*25c6d98fSJan Kara 		if (EXT4_SB(sb)->s_qf_names[i]) {
279*25c6d98fSJan Kara 			int ret = ext4_quota_on_mount(sb, i);
280*25c6d98fSJan Kara 
281*25c6d98fSJan Kara 			if (!ret)
282*25c6d98fSJan Kara 				quota_update = 1;
283*25c6d98fSJan Kara 			else
284*25c6d98fSJan Kara 				ext4_msg(sb, KERN_ERR,
285*25c6d98fSJan Kara 					"Cannot turn on journaled "
286*25c6d98fSJan Kara 					"quota: type %d: error %d", i, ret);
287*25c6d98fSJan Kara 		}
288*25c6d98fSJan Kara 	}
289*25c6d98fSJan Kara #endif
290*25c6d98fSJan Kara 
291*25c6d98fSJan Kara 	while (es->s_last_orphan) {
292*25c6d98fSJan Kara 		struct inode *inode;
293*25c6d98fSJan Kara 
294*25c6d98fSJan Kara 		/*
295*25c6d98fSJan Kara 		 * We may have encountered an error during cleanup; if
296*25c6d98fSJan Kara 		 * so, skip the rest.
297*25c6d98fSJan Kara 		 */
298*25c6d98fSJan Kara 		if (EXT4_SB(sb)->s_mount_state & EXT4_ERROR_FS) {
299*25c6d98fSJan Kara 			jbd_debug(1, "Skipping orphan recovery on fs with errors.\n");
300*25c6d98fSJan Kara 			es->s_last_orphan = 0;
301*25c6d98fSJan Kara 			break;
302*25c6d98fSJan Kara 		}
303*25c6d98fSJan Kara 
304*25c6d98fSJan Kara 		inode = ext4_orphan_get(sb, le32_to_cpu(es->s_last_orphan));
305*25c6d98fSJan Kara 		if (IS_ERR(inode)) {
306*25c6d98fSJan Kara 			es->s_last_orphan = 0;
307*25c6d98fSJan Kara 			break;
308*25c6d98fSJan Kara 		}
309*25c6d98fSJan Kara 
310*25c6d98fSJan Kara 		list_add(&EXT4_I(inode)->i_orphan, &EXT4_SB(sb)->s_orphan);
311*25c6d98fSJan Kara 		dquot_initialize(inode);
312*25c6d98fSJan Kara 		if (inode->i_nlink) {
313*25c6d98fSJan Kara 			if (test_opt(sb, DEBUG))
314*25c6d98fSJan Kara 				ext4_msg(sb, KERN_DEBUG,
315*25c6d98fSJan Kara 					"%s: truncating inode %lu to %lld bytes",
316*25c6d98fSJan Kara 					__func__, inode->i_ino, inode->i_size);
317*25c6d98fSJan Kara 			jbd_debug(2, "truncating inode %lu to %lld bytes\n",
318*25c6d98fSJan Kara 				  inode->i_ino, inode->i_size);
319*25c6d98fSJan Kara 			inode_lock(inode);
320*25c6d98fSJan Kara 			truncate_inode_pages(inode->i_mapping, inode->i_size);
321*25c6d98fSJan Kara 			ret = ext4_truncate(inode);
322*25c6d98fSJan Kara 			if (ret) {
323*25c6d98fSJan Kara 				/*
324*25c6d98fSJan Kara 				 * We need to clean up the in-core orphan list
325*25c6d98fSJan Kara 				 * manually if ext4_truncate() failed to get a
326*25c6d98fSJan Kara 				 * transaction handle.
327*25c6d98fSJan Kara 				 */
328*25c6d98fSJan Kara 				ext4_orphan_del(NULL, inode);
329*25c6d98fSJan Kara 				ext4_std_error(inode->i_sb, ret);
330*25c6d98fSJan Kara 			}
331*25c6d98fSJan Kara 			inode_unlock(inode);
332*25c6d98fSJan Kara 			nr_truncates++;
333*25c6d98fSJan Kara 		} else {
334*25c6d98fSJan Kara 			if (test_opt(sb, DEBUG))
335*25c6d98fSJan Kara 				ext4_msg(sb, KERN_DEBUG,
336*25c6d98fSJan Kara 					"%s: deleting unreferenced inode %lu",
337*25c6d98fSJan Kara 					__func__, inode->i_ino);
338*25c6d98fSJan Kara 			jbd_debug(2, "deleting unreferenced inode %lu\n",
339*25c6d98fSJan Kara 				  inode->i_ino);
340*25c6d98fSJan Kara 			nr_orphans++;
341*25c6d98fSJan Kara 		}
342*25c6d98fSJan Kara 		iput(inode);  /* The delete magic happens here! */
343*25c6d98fSJan Kara 	}
344*25c6d98fSJan Kara 
345*25c6d98fSJan Kara #define PLURAL(x) (x), ((x) == 1) ? "" : "s"
346*25c6d98fSJan Kara 
347*25c6d98fSJan Kara 	if (nr_orphans)
348*25c6d98fSJan Kara 		ext4_msg(sb, KERN_INFO, "%d orphan inode%s deleted",
349*25c6d98fSJan Kara 		       PLURAL(nr_orphans));
350*25c6d98fSJan Kara 	if (nr_truncates)
351*25c6d98fSJan Kara 		ext4_msg(sb, KERN_INFO, "%d truncate%s cleaned up",
352*25c6d98fSJan Kara 		       PLURAL(nr_truncates));
353*25c6d98fSJan Kara #ifdef CONFIG_QUOTA
354*25c6d98fSJan Kara 	/* Turn off quotas if they were enabled for orphan cleanup */
355*25c6d98fSJan Kara 	if (quota_update) {
356*25c6d98fSJan Kara 		for (i = 0; i < EXT4_MAXQUOTAS; i++) {
357*25c6d98fSJan Kara 			if (sb_dqopt(sb)->files[i])
358*25c6d98fSJan Kara 				dquot_quota_off(sb, i);
359*25c6d98fSJan Kara 		}
360*25c6d98fSJan Kara 	}
361*25c6d98fSJan Kara #endif
362*25c6d98fSJan Kara 	sb->s_flags = s_flags; /* Restore SB_RDONLY status */
363*25c6d98fSJan Kara }
364