xref: /openbmc/linux/fs/nilfs2/inode.c (revision 05fe58fdc10df9ebea04c0eaed57adc47af5c184)
1*05fe58fdSRyusuke Konishi /*
2*05fe58fdSRyusuke Konishi  * inode.c - NILFS inode operations.
3*05fe58fdSRyusuke Konishi  *
4*05fe58fdSRyusuke Konishi  * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation.
5*05fe58fdSRyusuke Konishi  *
6*05fe58fdSRyusuke Konishi  * This program is free software; you can redistribute it and/or modify
7*05fe58fdSRyusuke Konishi  * it under the terms of the GNU General Public License as published by
8*05fe58fdSRyusuke Konishi  * the Free Software Foundation; either version 2 of the License, or
9*05fe58fdSRyusuke Konishi  * (at your option) any later version.
10*05fe58fdSRyusuke Konishi  *
11*05fe58fdSRyusuke Konishi  * This program is distributed in the hope that it will be useful,
12*05fe58fdSRyusuke Konishi  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13*05fe58fdSRyusuke Konishi  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*05fe58fdSRyusuke Konishi  * GNU General Public License for more details.
15*05fe58fdSRyusuke Konishi  *
16*05fe58fdSRyusuke Konishi  * You should have received a copy of the GNU General Public License
17*05fe58fdSRyusuke Konishi  * along with this program; if not, write to the Free Software
18*05fe58fdSRyusuke Konishi  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19*05fe58fdSRyusuke Konishi  *
20*05fe58fdSRyusuke Konishi  * Written by Ryusuke Konishi <ryusuke@osrg.net>
21*05fe58fdSRyusuke Konishi  *
22*05fe58fdSRyusuke Konishi  */
23*05fe58fdSRyusuke Konishi 
24*05fe58fdSRyusuke Konishi #include <linux/buffer_head.h>
25*05fe58fdSRyusuke Konishi #include <linux/mpage.h>
26*05fe58fdSRyusuke Konishi #include <linux/writeback.h>
27*05fe58fdSRyusuke Konishi #include "nilfs.h"
28*05fe58fdSRyusuke Konishi #include "segment.h"
29*05fe58fdSRyusuke Konishi #include "page.h"
30*05fe58fdSRyusuke Konishi #include "mdt.h"
31*05fe58fdSRyusuke Konishi #include "cpfile.h"
32*05fe58fdSRyusuke Konishi #include "ifile.h"
33*05fe58fdSRyusuke Konishi 
34*05fe58fdSRyusuke Konishi 
35*05fe58fdSRyusuke Konishi /**
36*05fe58fdSRyusuke Konishi  * nilfs_get_block() - get a file block on the filesystem (callback function)
37*05fe58fdSRyusuke Konishi  * @inode - inode struct of the target file
38*05fe58fdSRyusuke Konishi  * @blkoff - file block number
39*05fe58fdSRyusuke Konishi  * @bh_result - buffer head to be mapped on
40*05fe58fdSRyusuke Konishi  * @create - indicate whether allocating the block or not when it has not
41*05fe58fdSRyusuke Konishi  *      been allocated yet.
42*05fe58fdSRyusuke Konishi  *
43*05fe58fdSRyusuke Konishi  * This function does not issue actual read request of the specified data
44*05fe58fdSRyusuke Konishi  * block. It is done by VFS.
45*05fe58fdSRyusuke Konishi  * Bulk read for direct-io is not supported yet. (should be supported)
46*05fe58fdSRyusuke Konishi  */
47*05fe58fdSRyusuke Konishi int nilfs_get_block(struct inode *inode, sector_t blkoff,
48*05fe58fdSRyusuke Konishi 		    struct buffer_head *bh_result, int create)
49*05fe58fdSRyusuke Konishi {
50*05fe58fdSRyusuke Konishi 	struct nilfs_inode_info *ii = NILFS_I(inode);
51*05fe58fdSRyusuke Konishi 	unsigned long blknum = 0;
52*05fe58fdSRyusuke Konishi 	int err = 0, ret;
53*05fe58fdSRyusuke Konishi 	struct inode *dat = nilfs_dat_inode(NILFS_I_NILFS(inode));
54*05fe58fdSRyusuke Konishi 
55*05fe58fdSRyusuke Konishi 	/* This exclusion control is a workaround; should be revised */
56*05fe58fdSRyusuke Konishi 	down_read(&NILFS_MDT(dat)->mi_sem);	/* XXX */
57*05fe58fdSRyusuke Konishi 	ret = nilfs_bmap_lookup(ii->i_bmap, (unsigned long)blkoff, &blknum);
58*05fe58fdSRyusuke Konishi 	up_read(&NILFS_MDT(dat)->mi_sem);	/* XXX */
59*05fe58fdSRyusuke Konishi 	if (ret == 0) {	/* found */
60*05fe58fdSRyusuke Konishi 		map_bh(bh_result, inode->i_sb, blknum);
61*05fe58fdSRyusuke Konishi 		goto out;
62*05fe58fdSRyusuke Konishi 	}
63*05fe58fdSRyusuke Konishi 	if (unlikely(ret == 1)) {
64*05fe58fdSRyusuke Konishi 		printk(KERN_ERR "nilfs_get_block: bmap_lookup returns "
65*05fe58fdSRyusuke Konishi 		       "buffer_head pointer (blkoff=%llu, blknum=%lu)\n",
66*05fe58fdSRyusuke Konishi 		       (unsigned long long)blkoff, blknum);
67*05fe58fdSRyusuke Konishi 		BUG();
68*05fe58fdSRyusuke Konishi 	}
69*05fe58fdSRyusuke Konishi 	/* data block was not found */
70*05fe58fdSRyusuke Konishi 	if (ret == -ENOENT && create) {
71*05fe58fdSRyusuke Konishi 		struct nilfs_transaction_info ti;
72*05fe58fdSRyusuke Konishi 
73*05fe58fdSRyusuke Konishi 		bh_result->b_blocknr = 0;
74*05fe58fdSRyusuke Konishi 		err = nilfs_transaction_begin(inode->i_sb, &ti, 1);
75*05fe58fdSRyusuke Konishi 		if (unlikely(err))
76*05fe58fdSRyusuke Konishi 			goto out;
77*05fe58fdSRyusuke Konishi 		err = nilfs_bmap_insert(ii->i_bmap, (unsigned long)blkoff,
78*05fe58fdSRyusuke Konishi 					(unsigned long)bh_result);
79*05fe58fdSRyusuke Konishi 		nilfs_transaction_end(inode->i_sb, !err);
80*05fe58fdSRyusuke Konishi 		if (unlikely(err != 0)) {
81*05fe58fdSRyusuke Konishi 			if (err == -EEXIST) {
82*05fe58fdSRyusuke Konishi 				/*
83*05fe58fdSRyusuke Konishi 				 * The get_block() function could be called
84*05fe58fdSRyusuke Konishi 				 * from multiple callers for an inode.
85*05fe58fdSRyusuke Konishi 				 * However, the page having this block must
86*05fe58fdSRyusuke Konishi 				 * be locked in this case.
87*05fe58fdSRyusuke Konishi 				 */
88*05fe58fdSRyusuke Konishi 				printk(KERN_ERR
89*05fe58fdSRyusuke Konishi 				       "nilfs_get_block: a race condition "
90*05fe58fdSRyusuke Konishi 				       "while inserting a data block. "
91*05fe58fdSRyusuke Konishi 				       "(inode number=%lu, file block "
92*05fe58fdSRyusuke Konishi 				       "offset=%llu)\n",
93*05fe58fdSRyusuke Konishi 				       inode->i_ino,
94*05fe58fdSRyusuke Konishi 				       (unsigned long long)blkoff);
95*05fe58fdSRyusuke Konishi 				BUG();
96*05fe58fdSRyusuke Konishi 			} else if (err == -EINVAL) {
97*05fe58fdSRyusuke Konishi 				nilfs_error(inode->i_sb, __func__,
98*05fe58fdSRyusuke Konishi 					    "broken bmap (inode=%lu)\n",
99*05fe58fdSRyusuke Konishi 					    inode->i_ino);
100*05fe58fdSRyusuke Konishi 				err = -EIO;
101*05fe58fdSRyusuke Konishi 			}
102*05fe58fdSRyusuke Konishi 			goto out;
103*05fe58fdSRyusuke Konishi 		}
104*05fe58fdSRyusuke Konishi 		/* Error handling should be detailed */
105*05fe58fdSRyusuke Konishi 		set_buffer_new(bh_result);
106*05fe58fdSRyusuke Konishi 		map_bh(bh_result, inode->i_sb, 0); /* dbn must be changed
107*05fe58fdSRyusuke Konishi 						      to proper value */
108*05fe58fdSRyusuke Konishi 	} else if (ret == -ENOENT) {
109*05fe58fdSRyusuke Konishi 		/* not found is not error (e.g. hole); must return without
110*05fe58fdSRyusuke Konishi 		   the mapped state flag. */
111*05fe58fdSRyusuke Konishi 		;
112*05fe58fdSRyusuke Konishi 	} else {
113*05fe58fdSRyusuke Konishi 		err = ret;
114*05fe58fdSRyusuke Konishi 	}
115*05fe58fdSRyusuke Konishi 
116*05fe58fdSRyusuke Konishi  out:
117*05fe58fdSRyusuke Konishi 	return err;
118*05fe58fdSRyusuke Konishi }
119*05fe58fdSRyusuke Konishi 
120*05fe58fdSRyusuke Konishi /**
121*05fe58fdSRyusuke Konishi  * nilfs_readpage() - implement readpage() method of nilfs_aops {}
122*05fe58fdSRyusuke Konishi  * address_space_operations.
123*05fe58fdSRyusuke Konishi  * @file - file struct of the file to be read
124*05fe58fdSRyusuke Konishi  * @page - the page to be read
125*05fe58fdSRyusuke Konishi  */
126*05fe58fdSRyusuke Konishi static int nilfs_readpage(struct file *file, struct page *page)
127*05fe58fdSRyusuke Konishi {
128*05fe58fdSRyusuke Konishi 	return mpage_readpage(page, nilfs_get_block);
129*05fe58fdSRyusuke Konishi }
130*05fe58fdSRyusuke Konishi 
131*05fe58fdSRyusuke Konishi /**
132*05fe58fdSRyusuke Konishi  * nilfs_readpages() - implement readpages() method of nilfs_aops {}
133*05fe58fdSRyusuke Konishi  * address_space_operations.
134*05fe58fdSRyusuke Konishi  * @file - file struct of the file to be read
135*05fe58fdSRyusuke Konishi  * @mapping - address_space struct used for reading multiple pages
136*05fe58fdSRyusuke Konishi  * @pages - the pages to be read
137*05fe58fdSRyusuke Konishi  * @nr_pages - number of pages to be read
138*05fe58fdSRyusuke Konishi  */
139*05fe58fdSRyusuke Konishi static int nilfs_readpages(struct file *file, struct address_space *mapping,
140*05fe58fdSRyusuke Konishi 			   struct list_head *pages, unsigned nr_pages)
141*05fe58fdSRyusuke Konishi {
142*05fe58fdSRyusuke Konishi 	return mpage_readpages(mapping, pages, nr_pages, nilfs_get_block);
143*05fe58fdSRyusuke Konishi }
144*05fe58fdSRyusuke Konishi 
145*05fe58fdSRyusuke Konishi static int nilfs_writepages(struct address_space *mapping,
146*05fe58fdSRyusuke Konishi 			    struct writeback_control *wbc)
147*05fe58fdSRyusuke Konishi {
148*05fe58fdSRyusuke Konishi 	/* This empty method is required not to call generic_writepages() */
149*05fe58fdSRyusuke Konishi 	return 0;
150*05fe58fdSRyusuke Konishi }
151*05fe58fdSRyusuke Konishi 
152*05fe58fdSRyusuke Konishi static int nilfs_writepage(struct page *page, struct writeback_control *wbc)
153*05fe58fdSRyusuke Konishi {
154*05fe58fdSRyusuke Konishi 	struct inode *inode = page->mapping->host;
155*05fe58fdSRyusuke Konishi 	int err;
156*05fe58fdSRyusuke Konishi 
157*05fe58fdSRyusuke Konishi 	redirty_page_for_writepage(wbc, page);
158*05fe58fdSRyusuke Konishi 	unlock_page(page);
159*05fe58fdSRyusuke Konishi 
160*05fe58fdSRyusuke Konishi 	if (wbc->sync_mode == WB_SYNC_ALL) {
161*05fe58fdSRyusuke Konishi 		err = nilfs_construct_segment(inode->i_sb);
162*05fe58fdSRyusuke Konishi 		if (unlikely(err))
163*05fe58fdSRyusuke Konishi 			return err;
164*05fe58fdSRyusuke Konishi 	} else if (wbc->for_reclaim)
165*05fe58fdSRyusuke Konishi 		nilfs_flush_segment(inode->i_sb, inode->i_ino);
166*05fe58fdSRyusuke Konishi 
167*05fe58fdSRyusuke Konishi 	return 0;
168*05fe58fdSRyusuke Konishi }
169*05fe58fdSRyusuke Konishi 
170*05fe58fdSRyusuke Konishi static int nilfs_set_page_dirty(struct page *page)
171*05fe58fdSRyusuke Konishi {
172*05fe58fdSRyusuke Konishi 	int ret = __set_page_dirty_buffers(page);
173*05fe58fdSRyusuke Konishi 
174*05fe58fdSRyusuke Konishi 	if (ret) {
175*05fe58fdSRyusuke Konishi 		struct inode *inode = page->mapping->host;
176*05fe58fdSRyusuke Konishi 		struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb);
177*05fe58fdSRyusuke Konishi 		unsigned nr_dirty = 1 << (PAGE_SHIFT - inode->i_blkbits);
178*05fe58fdSRyusuke Konishi 
179*05fe58fdSRyusuke Konishi 		nilfs_set_file_dirty(sbi, inode, nr_dirty);
180*05fe58fdSRyusuke Konishi 	}
181*05fe58fdSRyusuke Konishi 	return ret;
182*05fe58fdSRyusuke Konishi }
183*05fe58fdSRyusuke Konishi 
184*05fe58fdSRyusuke Konishi static int nilfs_write_begin(struct file *file, struct address_space *mapping,
185*05fe58fdSRyusuke Konishi 			     loff_t pos, unsigned len, unsigned flags,
186*05fe58fdSRyusuke Konishi 			     struct page **pagep, void **fsdata)
187*05fe58fdSRyusuke Konishi 
188*05fe58fdSRyusuke Konishi {
189*05fe58fdSRyusuke Konishi 	struct inode *inode = mapping->host;
190*05fe58fdSRyusuke Konishi 	int err = nilfs_transaction_begin(inode->i_sb, NULL, 1);
191*05fe58fdSRyusuke Konishi 
192*05fe58fdSRyusuke Konishi 	if (unlikely(err))
193*05fe58fdSRyusuke Konishi 		return err;
194*05fe58fdSRyusuke Konishi 
195*05fe58fdSRyusuke Konishi 	*pagep = NULL;
196*05fe58fdSRyusuke Konishi 	err = block_write_begin(file, mapping, pos, len, flags, pagep,
197*05fe58fdSRyusuke Konishi 				fsdata, nilfs_get_block);
198*05fe58fdSRyusuke Konishi 	if (unlikely(err))
199*05fe58fdSRyusuke Konishi 		nilfs_transaction_end(inode->i_sb, 0);
200*05fe58fdSRyusuke Konishi 	return err;
201*05fe58fdSRyusuke Konishi }
202*05fe58fdSRyusuke Konishi 
203*05fe58fdSRyusuke Konishi static int nilfs_write_end(struct file *file, struct address_space *mapping,
204*05fe58fdSRyusuke Konishi 			   loff_t pos, unsigned len, unsigned copied,
205*05fe58fdSRyusuke Konishi 			   struct page *page, void *fsdata)
206*05fe58fdSRyusuke Konishi {
207*05fe58fdSRyusuke Konishi 	struct inode *inode = mapping->host;
208*05fe58fdSRyusuke Konishi 	unsigned start = pos & (PAGE_CACHE_SIZE - 1);
209*05fe58fdSRyusuke Konishi 	unsigned nr_dirty;
210*05fe58fdSRyusuke Konishi 	int err;
211*05fe58fdSRyusuke Konishi 
212*05fe58fdSRyusuke Konishi 	nr_dirty = nilfs_page_count_clean_buffers(page, start,
213*05fe58fdSRyusuke Konishi 						  start + copied);
214*05fe58fdSRyusuke Konishi 	copied = generic_write_end(file, mapping, pos, len, copied, page,
215*05fe58fdSRyusuke Konishi 				   fsdata);
216*05fe58fdSRyusuke Konishi 	nilfs_set_file_dirty(NILFS_SB(inode->i_sb), inode, nr_dirty);
217*05fe58fdSRyusuke Konishi 	err = nilfs_transaction_end(inode->i_sb, 1);
218*05fe58fdSRyusuke Konishi 	return err ? : copied;
219*05fe58fdSRyusuke Konishi }
220*05fe58fdSRyusuke Konishi 
221*05fe58fdSRyusuke Konishi static ssize_t
222*05fe58fdSRyusuke Konishi nilfs_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
223*05fe58fdSRyusuke Konishi 		loff_t offset, unsigned long nr_segs)
224*05fe58fdSRyusuke Konishi {
225*05fe58fdSRyusuke Konishi 	struct file *file = iocb->ki_filp;
226*05fe58fdSRyusuke Konishi 	struct inode *inode = file->f_mapping->host;
227*05fe58fdSRyusuke Konishi 	ssize_t size;
228*05fe58fdSRyusuke Konishi 	int err;
229*05fe58fdSRyusuke Konishi 
230*05fe58fdSRyusuke Konishi 	err = nilfs_construct_dsync_segment(inode->i_sb, inode);
231*05fe58fdSRyusuke Konishi 	if (unlikely(err))
232*05fe58fdSRyusuke Konishi 		return err;
233*05fe58fdSRyusuke Konishi 
234*05fe58fdSRyusuke Konishi 	if (rw == WRITE)
235*05fe58fdSRyusuke Konishi 		return 0;
236*05fe58fdSRyusuke Konishi 
237*05fe58fdSRyusuke Konishi 	/* Needs synchronization with the cleaner */
238*05fe58fdSRyusuke Konishi 	size = blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov,
239*05fe58fdSRyusuke Konishi 				  offset, nr_segs, nilfs_get_block, NULL);
240*05fe58fdSRyusuke Konishi 	return size;
241*05fe58fdSRyusuke Konishi }
242*05fe58fdSRyusuke Konishi 
243*05fe58fdSRyusuke Konishi struct address_space_operations nilfs_aops = {
244*05fe58fdSRyusuke Konishi 	.writepage		= nilfs_writepage,
245*05fe58fdSRyusuke Konishi 	.readpage		= nilfs_readpage,
246*05fe58fdSRyusuke Konishi 	/* .sync_page		= nilfs_sync_page, */
247*05fe58fdSRyusuke Konishi 	.writepages		= nilfs_writepages,
248*05fe58fdSRyusuke Konishi 	.set_page_dirty		= nilfs_set_page_dirty,
249*05fe58fdSRyusuke Konishi 	.readpages		= nilfs_readpages,
250*05fe58fdSRyusuke Konishi 	.write_begin		= nilfs_write_begin,
251*05fe58fdSRyusuke Konishi 	.write_end		= nilfs_write_end,
252*05fe58fdSRyusuke Konishi 	/* .releasepage		= nilfs_releasepage, */
253*05fe58fdSRyusuke Konishi 	.invalidatepage		= block_invalidatepage,
254*05fe58fdSRyusuke Konishi 	.direct_IO		= nilfs_direct_IO,
255*05fe58fdSRyusuke Konishi };
256*05fe58fdSRyusuke Konishi 
257*05fe58fdSRyusuke Konishi struct inode *nilfs_new_inode(struct inode *dir, int mode)
258*05fe58fdSRyusuke Konishi {
259*05fe58fdSRyusuke Konishi 	struct super_block *sb = dir->i_sb;
260*05fe58fdSRyusuke Konishi 	struct nilfs_sb_info *sbi = NILFS_SB(sb);
261*05fe58fdSRyusuke Konishi 	struct inode *inode;
262*05fe58fdSRyusuke Konishi 	struct nilfs_inode_info *ii;
263*05fe58fdSRyusuke Konishi 	int err = -ENOMEM;
264*05fe58fdSRyusuke Konishi 	ino_t ino;
265*05fe58fdSRyusuke Konishi 
266*05fe58fdSRyusuke Konishi 	inode = new_inode(sb);
267*05fe58fdSRyusuke Konishi 	if (unlikely(!inode))
268*05fe58fdSRyusuke Konishi 		goto failed;
269*05fe58fdSRyusuke Konishi 
270*05fe58fdSRyusuke Konishi 	mapping_set_gfp_mask(inode->i_mapping,
271*05fe58fdSRyusuke Konishi 			     mapping_gfp_mask(inode->i_mapping) & ~__GFP_FS);
272*05fe58fdSRyusuke Konishi 
273*05fe58fdSRyusuke Konishi 	ii = NILFS_I(inode);
274*05fe58fdSRyusuke Konishi 	ii->i_state = 1 << NILFS_I_NEW;
275*05fe58fdSRyusuke Konishi 
276*05fe58fdSRyusuke Konishi 	err = nilfs_ifile_create_inode(sbi->s_ifile, &ino, &ii->i_bh);
277*05fe58fdSRyusuke Konishi 	if (unlikely(err))
278*05fe58fdSRyusuke Konishi 		goto failed_ifile_create_inode;
279*05fe58fdSRyusuke Konishi 	/* reference count of i_bh inherits from nilfs_mdt_read_block() */
280*05fe58fdSRyusuke Konishi 
281*05fe58fdSRyusuke Konishi 	atomic_inc(&sbi->s_inodes_count);
282*05fe58fdSRyusuke Konishi 
283*05fe58fdSRyusuke Konishi 	inode->i_uid = current_fsuid();
284*05fe58fdSRyusuke Konishi 	if (dir->i_mode & S_ISGID) {
285*05fe58fdSRyusuke Konishi 		inode->i_gid = dir->i_gid;
286*05fe58fdSRyusuke Konishi 		if (S_ISDIR(mode))
287*05fe58fdSRyusuke Konishi 			mode |= S_ISGID;
288*05fe58fdSRyusuke Konishi 	} else
289*05fe58fdSRyusuke Konishi 		inode->i_gid = current_fsgid();
290*05fe58fdSRyusuke Konishi 
291*05fe58fdSRyusuke Konishi 	inode->i_mode = mode;
292*05fe58fdSRyusuke Konishi 	inode->i_ino = ino;
293*05fe58fdSRyusuke Konishi 	inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
294*05fe58fdSRyusuke Konishi 
295*05fe58fdSRyusuke Konishi 	if (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)) {
296*05fe58fdSRyusuke Konishi 		err = nilfs_bmap_read(ii->i_bmap, NULL);
297*05fe58fdSRyusuke Konishi 		if (err < 0)
298*05fe58fdSRyusuke Konishi 			goto failed_bmap;
299*05fe58fdSRyusuke Konishi 
300*05fe58fdSRyusuke Konishi 		set_bit(NILFS_I_BMAP, &ii->i_state);
301*05fe58fdSRyusuke Konishi 		/* No lock is needed; iget() ensures it. */
302*05fe58fdSRyusuke Konishi 	}
303*05fe58fdSRyusuke Konishi 
304*05fe58fdSRyusuke Konishi 	ii->i_flags = NILFS_I(dir)->i_flags;
305*05fe58fdSRyusuke Konishi 	if (S_ISLNK(mode))
306*05fe58fdSRyusuke Konishi 		ii->i_flags &= ~(NILFS_IMMUTABLE_FL | NILFS_APPEND_FL);
307*05fe58fdSRyusuke Konishi 	if (!S_ISDIR(mode))
308*05fe58fdSRyusuke Konishi 		ii->i_flags &= ~NILFS_DIRSYNC_FL;
309*05fe58fdSRyusuke Konishi 
310*05fe58fdSRyusuke Konishi 	/* ii->i_file_acl = 0; */
311*05fe58fdSRyusuke Konishi 	/* ii->i_dir_acl = 0; */
312*05fe58fdSRyusuke Konishi 	ii->i_dtime = 0;
313*05fe58fdSRyusuke Konishi 	ii->i_dir_start_lookup = 0;
314*05fe58fdSRyusuke Konishi #ifdef CONFIG_NILFS_FS_POSIX_ACL
315*05fe58fdSRyusuke Konishi 	ii->i_acl = NULL;
316*05fe58fdSRyusuke Konishi 	ii->i_default_acl = NULL;
317*05fe58fdSRyusuke Konishi #endif
318*05fe58fdSRyusuke Konishi 	ii->i_cno = 0;
319*05fe58fdSRyusuke Konishi 	nilfs_set_inode_flags(inode);
320*05fe58fdSRyusuke Konishi 	spin_lock(&sbi->s_next_gen_lock);
321*05fe58fdSRyusuke Konishi 	inode->i_generation = sbi->s_next_generation++;
322*05fe58fdSRyusuke Konishi 	spin_unlock(&sbi->s_next_gen_lock);
323*05fe58fdSRyusuke Konishi 	insert_inode_hash(inode);
324*05fe58fdSRyusuke Konishi 
325*05fe58fdSRyusuke Konishi 	err = nilfs_init_acl(inode, dir);
326*05fe58fdSRyusuke Konishi 	if (unlikely(err))
327*05fe58fdSRyusuke Konishi 		goto failed_acl; /* never occur. When supporting
328*05fe58fdSRyusuke Konishi 				    nilfs_init_acl(), proper cancellation of
329*05fe58fdSRyusuke Konishi 				    above jobs should be considered */
330*05fe58fdSRyusuke Konishi 
331*05fe58fdSRyusuke Konishi 	mark_inode_dirty(inode);
332*05fe58fdSRyusuke Konishi 	return inode;
333*05fe58fdSRyusuke Konishi 
334*05fe58fdSRyusuke Konishi  failed_acl:
335*05fe58fdSRyusuke Konishi  failed_bmap:
336*05fe58fdSRyusuke Konishi 	inode->i_nlink = 0;
337*05fe58fdSRyusuke Konishi 	iput(inode);  /* raw_inode will be deleted through
338*05fe58fdSRyusuke Konishi 			 generic_delete_inode() */
339*05fe58fdSRyusuke Konishi 	goto failed;
340*05fe58fdSRyusuke Konishi 
341*05fe58fdSRyusuke Konishi  failed_ifile_create_inode:
342*05fe58fdSRyusuke Konishi 	make_bad_inode(inode);
343*05fe58fdSRyusuke Konishi 	iput(inode);  /* if i_nlink == 1, generic_forget_inode() will be
344*05fe58fdSRyusuke Konishi 			 called */
345*05fe58fdSRyusuke Konishi  failed:
346*05fe58fdSRyusuke Konishi 	return ERR_PTR(err);
347*05fe58fdSRyusuke Konishi }
348*05fe58fdSRyusuke Konishi 
349*05fe58fdSRyusuke Konishi void nilfs_free_inode(struct inode *inode)
350*05fe58fdSRyusuke Konishi {
351*05fe58fdSRyusuke Konishi 	struct super_block *sb = inode->i_sb;
352*05fe58fdSRyusuke Konishi 	struct nilfs_sb_info *sbi = NILFS_SB(sb);
353*05fe58fdSRyusuke Konishi 
354*05fe58fdSRyusuke Konishi 	clear_inode(inode);
355*05fe58fdSRyusuke Konishi 	/* XXX: check error code? Is there any thing I can do? */
356*05fe58fdSRyusuke Konishi 	(void) nilfs_ifile_delete_inode(sbi->s_ifile, inode->i_ino);
357*05fe58fdSRyusuke Konishi 	atomic_dec(&sbi->s_inodes_count);
358*05fe58fdSRyusuke Konishi }
359*05fe58fdSRyusuke Konishi 
360*05fe58fdSRyusuke Konishi void nilfs_set_inode_flags(struct inode *inode)
361*05fe58fdSRyusuke Konishi {
362*05fe58fdSRyusuke Konishi 	unsigned int flags = NILFS_I(inode)->i_flags;
363*05fe58fdSRyusuke Konishi 
364*05fe58fdSRyusuke Konishi 	inode->i_flags &= ~(S_SYNC | S_APPEND | S_IMMUTABLE | S_NOATIME |
365*05fe58fdSRyusuke Konishi 			    S_DIRSYNC);
366*05fe58fdSRyusuke Konishi 	if (flags & NILFS_SYNC_FL)
367*05fe58fdSRyusuke Konishi 		inode->i_flags |= S_SYNC;
368*05fe58fdSRyusuke Konishi 	if (flags & NILFS_APPEND_FL)
369*05fe58fdSRyusuke Konishi 		inode->i_flags |= S_APPEND;
370*05fe58fdSRyusuke Konishi 	if (flags & NILFS_IMMUTABLE_FL)
371*05fe58fdSRyusuke Konishi 		inode->i_flags |= S_IMMUTABLE;
372*05fe58fdSRyusuke Konishi #ifndef NILFS_ATIME_DISABLE
373*05fe58fdSRyusuke Konishi 	if (flags & NILFS_NOATIME_FL)
374*05fe58fdSRyusuke Konishi #endif
375*05fe58fdSRyusuke Konishi 		inode->i_flags |= S_NOATIME;
376*05fe58fdSRyusuke Konishi 	if (flags & NILFS_DIRSYNC_FL)
377*05fe58fdSRyusuke Konishi 		inode->i_flags |= S_DIRSYNC;
378*05fe58fdSRyusuke Konishi 	mapping_set_gfp_mask(inode->i_mapping,
379*05fe58fdSRyusuke Konishi 			     mapping_gfp_mask(inode->i_mapping) & ~__GFP_FS);
380*05fe58fdSRyusuke Konishi }
381*05fe58fdSRyusuke Konishi 
382*05fe58fdSRyusuke Konishi int nilfs_read_inode_common(struct inode *inode,
383*05fe58fdSRyusuke Konishi 			    struct nilfs_inode *raw_inode)
384*05fe58fdSRyusuke Konishi {
385*05fe58fdSRyusuke Konishi 	struct nilfs_inode_info *ii = NILFS_I(inode);
386*05fe58fdSRyusuke Konishi 	int err;
387*05fe58fdSRyusuke Konishi 
388*05fe58fdSRyusuke Konishi 	inode->i_mode = le16_to_cpu(raw_inode->i_mode);
389*05fe58fdSRyusuke Konishi 	inode->i_uid = (uid_t)le32_to_cpu(raw_inode->i_uid);
390*05fe58fdSRyusuke Konishi 	inode->i_gid = (gid_t)le32_to_cpu(raw_inode->i_gid);
391*05fe58fdSRyusuke Konishi 	inode->i_nlink = le16_to_cpu(raw_inode->i_links_count);
392*05fe58fdSRyusuke Konishi 	inode->i_size = le64_to_cpu(raw_inode->i_size);
393*05fe58fdSRyusuke Konishi 	inode->i_atime.tv_sec = le64_to_cpu(raw_inode->i_mtime);
394*05fe58fdSRyusuke Konishi 	inode->i_ctime.tv_sec = le64_to_cpu(raw_inode->i_ctime);
395*05fe58fdSRyusuke Konishi 	inode->i_mtime.tv_sec = le64_to_cpu(raw_inode->i_mtime);
396*05fe58fdSRyusuke Konishi 	inode->i_atime.tv_nsec = 0;
397*05fe58fdSRyusuke Konishi 	inode->i_ctime.tv_nsec = 0;
398*05fe58fdSRyusuke Konishi 	inode->i_mtime.tv_nsec = 0;
399*05fe58fdSRyusuke Konishi 	ii->i_dtime = le64_to_cpu(raw_inode->i_dtime);
400*05fe58fdSRyusuke Konishi 	if (inode->i_nlink == 0 && (inode->i_mode == 0 || ii->i_dtime))
401*05fe58fdSRyusuke Konishi 		return -EINVAL; /* this inode is deleted */
402*05fe58fdSRyusuke Konishi 
403*05fe58fdSRyusuke Konishi 	inode->i_blocks = le64_to_cpu(raw_inode->i_blocks);
404*05fe58fdSRyusuke Konishi 	ii->i_flags = le32_to_cpu(raw_inode->i_flags);
405*05fe58fdSRyusuke Konishi #if 0
406*05fe58fdSRyusuke Konishi 	ii->i_file_acl = le32_to_cpu(raw_inode->i_file_acl);
407*05fe58fdSRyusuke Konishi 	ii->i_dir_acl = S_ISREG(inode->i_mode) ?
408*05fe58fdSRyusuke Konishi 		0 : le32_to_cpu(raw_inode->i_dir_acl);
409*05fe58fdSRyusuke Konishi #endif
410*05fe58fdSRyusuke Konishi 	ii->i_cno = 0;
411*05fe58fdSRyusuke Konishi 	inode->i_generation = le32_to_cpu(raw_inode->i_generation);
412*05fe58fdSRyusuke Konishi 
413*05fe58fdSRyusuke Konishi 	if (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
414*05fe58fdSRyusuke Konishi 	    S_ISLNK(inode->i_mode)) {
415*05fe58fdSRyusuke Konishi 		err = nilfs_bmap_read(ii->i_bmap, raw_inode);
416*05fe58fdSRyusuke Konishi 		if (err < 0)
417*05fe58fdSRyusuke Konishi 			return err;
418*05fe58fdSRyusuke Konishi 		set_bit(NILFS_I_BMAP, &ii->i_state);
419*05fe58fdSRyusuke Konishi 		/* No lock is needed; iget() ensures it. */
420*05fe58fdSRyusuke Konishi 	}
421*05fe58fdSRyusuke Konishi 	return 0;
422*05fe58fdSRyusuke Konishi }
423*05fe58fdSRyusuke Konishi 
424*05fe58fdSRyusuke Konishi static int nilfs_read_sketch_inode(struct inode *inode)
425*05fe58fdSRyusuke Konishi {
426*05fe58fdSRyusuke Konishi 	struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb);
427*05fe58fdSRyusuke Konishi 	int err = 0;
428*05fe58fdSRyusuke Konishi 
429*05fe58fdSRyusuke Konishi 	if (sbi->s_snapshot_cno) {
430*05fe58fdSRyusuke Konishi 		struct the_nilfs *nilfs = sbi->s_nilfs;
431*05fe58fdSRyusuke Konishi 		struct buffer_head *bh_cp;
432*05fe58fdSRyusuke Konishi 		struct nilfs_checkpoint *raw_cp;
433*05fe58fdSRyusuke Konishi 
434*05fe58fdSRyusuke Konishi 		err = nilfs_cpfile_get_checkpoint(
435*05fe58fdSRyusuke Konishi 			nilfs->ns_cpfile, sbi->s_snapshot_cno, 0, &raw_cp,
436*05fe58fdSRyusuke Konishi 			&bh_cp);
437*05fe58fdSRyusuke Konishi 		if (likely(!err)) {
438*05fe58fdSRyusuke Konishi 			if (!nilfs_checkpoint_sketch(raw_cp))
439*05fe58fdSRyusuke Konishi 				inode->i_size = 0;
440*05fe58fdSRyusuke Konishi 			nilfs_cpfile_put_checkpoint(
441*05fe58fdSRyusuke Konishi 				nilfs->ns_cpfile, sbi->s_snapshot_cno, bh_cp);
442*05fe58fdSRyusuke Konishi 		}
443*05fe58fdSRyusuke Konishi 		inode->i_flags |= S_NOCMTIME;
444*05fe58fdSRyusuke Konishi 	}
445*05fe58fdSRyusuke Konishi 	return err;
446*05fe58fdSRyusuke Konishi }
447*05fe58fdSRyusuke Konishi 
448*05fe58fdSRyusuke Konishi static int __nilfs_read_inode(struct super_block *sb, unsigned long ino,
449*05fe58fdSRyusuke Konishi 			      struct inode *inode)
450*05fe58fdSRyusuke Konishi {
451*05fe58fdSRyusuke Konishi 	struct nilfs_sb_info *sbi = NILFS_SB(sb);
452*05fe58fdSRyusuke Konishi 	struct inode *dat = nilfs_dat_inode(sbi->s_nilfs);
453*05fe58fdSRyusuke Konishi 	struct buffer_head *bh;
454*05fe58fdSRyusuke Konishi 	struct nilfs_inode *raw_inode;
455*05fe58fdSRyusuke Konishi 	int err;
456*05fe58fdSRyusuke Konishi 
457*05fe58fdSRyusuke Konishi 	down_read(&NILFS_MDT(dat)->mi_sem);	/* XXX */
458*05fe58fdSRyusuke Konishi 	err = nilfs_ifile_get_inode_block(sbi->s_ifile, ino, &bh);
459*05fe58fdSRyusuke Konishi 	if (unlikely(err))
460*05fe58fdSRyusuke Konishi 		goto bad_inode;
461*05fe58fdSRyusuke Konishi 
462*05fe58fdSRyusuke Konishi 	raw_inode = nilfs_ifile_map_inode(sbi->s_ifile, ino, bh);
463*05fe58fdSRyusuke Konishi 
464*05fe58fdSRyusuke Konishi #ifdef CONFIG_NILFS_FS_POSIX_ACL
465*05fe58fdSRyusuke Konishi 	ii->i_acl = NILFS_ACL_NOT_CACHED;
466*05fe58fdSRyusuke Konishi 	ii->i_default_acl = NILFS_ACL_NOT_CACHED;
467*05fe58fdSRyusuke Konishi #endif
468*05fe58fdSRyusuke Konishi 	if (nilfs_read_inode_common(inode, raw_inode))
469*05fe58fdSRyusuke Konishi 		goto failed_unmap;
470*05fe58fdSRyusuke Konishi 
471*05fe58fdSRyusuke Konishi 	if (S_ISREG(inode->i_mode)) {
472*05fe58fdSRyusuke Konishi 		inode->i_op = &nilfs_file_inode_operations;
473*05fe58fdSRyusuke Konishi 		inode->i_fop = &nilfs_file_operations;
474*05fe58fdSRyusuke Konishi 		inode->i_mapping->a_ops = &nilfs_aops;
475*05fe58fdSRyusuke Konishi 		if (unlikely(inode->i_ino == NILFS_SKETCH_INO)) {
476*05fe58fdSRyusuke Konishi 			err = nilfs_read_sketch_inode(inode);
477*05fe58fdSRyusuke Konishi 			if (unlikely(err))
478*05fe58fdSRyusuke Konishi 				goto failed_unmap;
479*05fe58fdSRyusuke Konishi 		}
480*05fe58fdSRyusuke Konishi 	} else if (S_ISDIR(inode->i_mode)) {
481*05fe58fdSRyusuke Konishi 		inode->i_op = &nilfs_dir_inode_operations;
482*05fe58fdSRyusuke Konishi 		inode->i_fop = &nilfs_dir_operations;
483*05fe58fdSRyusuke Konishi 		inode->i_mapping->a_ops = &nilfs_aops;
484*05fe58fdSRyusuke Konishi 	} else if (S_ISLNK(inode->i_mode)) {
485*05fe58fdSRyusuke Konishi 		inode->i_op = &nilfs_symlink_inode_operations;
486*05fe58fdSRyusuke Konishi 		inode->i_mapping->a_ops = &nilfs_aops;
487*05fe58fdSRyusuke Konishi 	} else {
488*05fe58fdSRyusuke Konishi 		inode->i_op = &nilfs_special_inode_operations;
489*05fe58fdSRyusuke Konishi 		init_special_inode(
490*05fe58fdSRyusuke Konishi 			inode, inode->i_mode,
491*05fe58fdSRyusuke Konishi 			new_decode_dev(le64_to_cpu(raw_inode->i_device_code)));
492*05fe58fdSRyusuke Konishi 	}
493*05fe58fdSRyusuke Konishi 	nilfs_ifile_unmap_inode(sbi->s_ifile, ino, bh);
494*05fe58fdSRyusuke Konishi 	brelse(bh);
495*05fe58fdSRyusuke Konishi 	up_read(&NILFS_MDT(dat)->mi_sem);	/* XXX */
496*05fe58fdSRyusuke Konishi 	nilfs_set_inode_flags(inode);
497*05fe58fdSRyusuke Konishi 	return 0;
498*05fe58fdSRyusuke Konishi 
499*05fe58fdSRyusuke Konishi  failed_unmap:
500*05fe58fdSRyusuke Konishi 	nilfs_ifile_unmap_inode(sbi->s_ifile, ino, bh);
501*05fe58fdSRyusuke Konishi 	brelse(bh);
502*05fe58fdSRyusuke Konishi 
503*05fe58fdSRyusuke Konishi  bad_inode:
504*05fe58fdSRyusuke Konishi 	up_read(&NILFS_MDT(dat)->mi_sem);	/* XXX */
505*05fe58fdSRyusuke Konishi 	return err;
506*05fe58fdSRyusuke Konishi }
507*05fe58fdSRyusuke Konishi 
508*05fe58fdSRyusuke Konishi struct inode *nilfs_iget(struct super_block *sb, unsigned long ino)
509*05fe58fdSRyusuke Konishi {
510*05fe58fdSRyusuke Konishi 	struct inode *inode;
511*05fe58fdSRyusuke Konishi 	int err;
512*05fe58fdSRyusuke Konishi 
513*05fe58fdSRyusuke Konishi 	inode = iget_locked(sb, ino);
514*05fe58fdSRyusuke Konishi 	if (unlikely(!inode))
515*05fe58fdSRyusuke Konishi 		return ERR_PTR(-ENOMEM);
516*05fe58fdSRyusuke Konishi 	if (!(inode->i_state & I_NEW))
517*05fe58fdSRyusuke Konishi 		return inode;
518*05fe58fdSRyusuke Konishi 
519*05fe58fdSRyusuke Konishi 	err = __nilfs_read_inode(sb, ino, inode);
520*05fe58fdSRyusuke Konishi 	if (unlikely(err)) {
521*05fe58fdSRyusuke Konishi 		iget_failed(inode);
522*05fe58fdSRyusuke Konishi 		return ERR_PTR(err);
523*05fe58fdSRyusuke Konishi 	}
524*05fe58fdSRyusuke Konishi 	unlock_new_inode(inode);
525*05fe58fdSRyusuke Konishi 	return inode;
526*05fe58fdSRyusuke Konishi }
527*05fe58fdSRyusuke Konishi 
528*05fe58fdSRyusuke Konishi void nilfs_write_inode_common(struct inode *inode,
529*05fe58fdSRyusuke Konishi 			      struct nilfs_inode *raw_inode, int has_bmap)
530*05fe58fdSRyusuke Konishi {
531*05fe58fdSRyusuke Konishi 	struct nilfs_inode_info *ii = NILFS_I(inode);
532*05fe58fdSRyusuke Konishi 
533*05fe58fdSRyusuke Konishi 	raw_inode->i_mode = cpu_to_le16(inode->i_mode);
534*05fe58fdSRyusuke Konishi 	raw_inode->i_uid = cpu_to_le32(inode->i_uid);
535*05fe58fdSRyusuke Konishi 	raw_inode->i_gid = cpu_to_le32(inode->i_gid);
536*05fe58fdSRyusuke Konishi 	raw_inode->i_links_count = cpu_to_le16(inode->i_nlink);
537*05fe58fdSRyusuke Konishi 	raw_inode->i_size = cpu_to_le64(inode->i_size);
538*05fe58fdSRyusuke Konishi 	raw_inode->i_ctime = cpu_to_le64(inode->i_ctime.tv_sec);
539*05fe58fdSRyusuke Konishi 	raw_inode->i_mtime = cpu_to_le64(inode->i_mtime.tv_sec);
540*05fe58fdSRyusuke Konishi 	raw_inode->i_blocks = cpu_to_le64(inode->i_blocks);
541*05fe58fdSRyusuke Konishi 
542*05fe58fdSRyusuke Konishi 	raw_inode->i_dtime = cpu_to_le64(ii->i_dtime);
543*05fe58fdSRyusuke Konishi 	raw_inode->i_flags = cpu_to_le32(ii->i_flags);
544*05fe58fdSRyusuke Konishi 	raw_inode->i_generation = cpu_to_le32(inode->i_generation);
545*05fe58fdSRyusuke Konishi 
546*05fe58fdSRyusuke Konishi 	if (has_bmap)
547*05fe58fdSRyusuke Konishi 		nilfs_bmap_write(ii->i_bmap, raw_inode);
548*05fe58fdSRyusuke Konishi 	else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
549*05fe58fdSRyusuke Konishi 		raw_inode->i_device_code =
550*05fe58fdSRyusuke Konishi 			cpu_to_le64(new_encode_dev(inode->i_rdev));
551*05fe58fdSRyusuke Konishi 	/* When extending inode, nilfs->ns_inode_size should be checked
552*05fe58fdSRyusuke Konishi 	   for substitutions of appended fields */
553*05fe58fdSRyusuke Konishi }
554*05fe58fdSRyusuke Konishi 
555*05fe58fdSRyusuke Konishi void nilfs_update_inode(struct inode *inode, struct buffer_head *ibh)
556*05fe58fdSRyusuke Konishi {
557*05fe58fdSRyusuke Konishi 	ino_t ino = inode->i_ino;
558*05fe58fdSRyusuke Konishi 	struct nilfs_inode_info *ii = NILFS_I(inode);
559*05fe58fdSRyusuke Konishi 	struct super_block *sb = inode->i_sb;
560*05fe58fdSRyusuke Konishi 	struct nilfs_sb_info *sbi = NILFS_SB(sb);
561*05fe58fdSRyusuke Konishi 	struct nilfs_inode *raw_inode;
562*05fe58fdSRyusuke Konishi 
563*05fe58fdSRyusuke Konishi 	raw_inode = nilfs_ifile_map_inode(sbi->s_ifile, ino, ibh);
564*05fe58fdSRyusuke Konishi 
565*05fe58fdSRyusuke Konishi 	/* The buffer is guarded with lock_buffer() by the caller */
566*05fe58fdSRyusuke Konishi 	if (test_and_clear_bit(NILFS_I_NEW, &ii->i_state))
567*05fe58fdSRyusuke Konishi 		memset(raw_inode, 0, NILFS_MDT(sbi->s_ifile)->mi_entry_size);
568*05fe58fdSRyusuke Konishi 	set_bit(NILFS_I_INODE_DIRTY, &ii->i_state);
569*05fe58fdSRyusuke Konishi 
570*05fe58fdSRyusuke Konishi 	nilfs_write_inode_common(inode, raw_inode, 0);
571*05fe58fdSRyusuke Konishi 		/* XXX: call with has_bmap = 0 is a workaround to avoid
572*05fe58fdSRyusuke Konishi 		   deadlock of bmap. This delays update of i_bmap to just
573*05fe58fdSRyusuke Konishi 		   before writing */
574*05fe58fdSRyusuke Konishi 	nilfs_ifile_unmap_inode(sbi->s_ifile, ino, ibh);
575*05fe58fdSRyusuke Konishi }
576*05fe58fdSRyusuke Konishi 
577*05fe58fdSRyusuke Konishi #define NILFS_MAX_TRUNCATE_BLOCKS	16384  /* 64MB for 4KB block */
578*05fe58fdSRyusuke Konishi 
579*05fe58fdSRyusuke Konishi static void nilfs_truncate_bmap(struct nilfs_inode_info *ii,
580*05fe58fdSRyusuke Konishi 				unsigned long from)
581*05fe58fdSRyusuke Konishi {
582*05fe58fdSRyusuke Konishi 	unsigned long b;
583*05fe58fdSRyusuke Konishi 	int ret;
584*05fe58fdSRyusuke Konishi 
585*05fe58fdSRyusuke Konishi 	if (!test_bit(NILFS_I_BMAP, &ii->i_state))
586*05fe58fdSRyusuke Konishi 		return;
587*05fe58fdSRyusuke Konishi  repeat:
588*05fe58fdSRyusuke Konishi 	ret = nilfs_bmap_last_key(ii->i_bmap, &b);
589*05fe58fdSRyusuke Konishi 	if (ret == -ENOENT)
590*05fe58fdSRyusuke Konishi 		return;
591*05fe58fdSRyusuke Konishi 	else if (ret < 0)
592*05fe58fdSRyusuke Konishi 		goto failed;
593*05fe58fdSRyusuke Konishi 
594*05fe58fdSRyusuke Konishi 	if (b < from)
595*05fe58fdSRyusuke Konishi 		return;
596*05fe58fdSRyusuke Konishi 
597*05fe58fdSRyusuke Konishi 	b -= min_t(unsigned long, NILFS_MAX_TRUNCATE_BLOCKS, b - from);
598*05fe58fdSRyusuke Konishi 	ret = nilfs_bmap_truncate(ii->i_bmap, b);
599*05fe58fdSRyusuke Konishi 	nilfs_relax_pressure_in_lock(ii->vfs_inode.i_sb);
600*05fe58fdSRyusuke Konishi 	if (!ret || (ret == -ENOMEM &&
601*05fe58fdSRyusuke Konishi 		     nilfs_bmap_truncate(ii->i_bmap, b) == 0))
602*05fe58fdSRyusuke Konishi 		goto repeat;
603*05fe58fdSRyusuke Konishi 
604*05fe58fdSRyusuke Konishi  failed:
605*05fe58fdSRyusuke Konishi 	if (ret == -EINVAL)
606*05fe58fdSRyusuke Konishi 		nilfs_error(ii->vfs_inode.i_sb, __func__,
607*05fe58fdSRyusuke Konishi 			    "bmap is broken (ino=%lu)", ii->vfs_inode.i_ino);
608*05fe58fdSRyusuke Konishi 	else
609*05fe58fdSRyusuke Konishi 		nilfs_warning(ii->vfs_inode.i_sb, __func__,
610*05fe58fdSRyusuke Konishi 			      "failed to truncate bmap (ino=%lu, err=%d)",
611*05fe58fdSRyusuke Konishi 			      ii->vfs_inode.i_ino, ret);
612*05fe58fdSRyusuke Konishi }
613*05fe58fdSRyusuke Konishi 
614*05fe58fdSRyusuke Konishi void nilfs_truncate(struct inode *inode)
615*05fe58fdSRyusuke Konishi {
616*05fe58fdSRyusuke Konishi 	unsigned long blkoff;
617*05fe58fdSRyusuke Konishi 	unsigned int blocksize;
618*05fe58fdSRyusuke Konishi 	struct nilfs_transaction_info ti;
619*05fe58fdSRyusuke Konishi 	struct super_block *sb = inode->i_sb;
620*05fe58fdSRyusuke Konishi 	struct nilfs_inode_info *ii = NILFS_I(inode);
621*05fe58fdSRyusuke Konishi 	int ret;
622*05fe58fdSRyusuke Konishi 
623*05fe58fdSRyusuke Konishi 	if (!test_bit(NILFS_I_BMAP, &ii->i_state))
624*05fe58fdSRyusuke Konishi 		return;
625*05fe58fdSRyusuke Konishi 	if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
626*05fe58fdSRyusuke Konishi 		return;
627*05fe58fdSRyusuke Konishi 
628*05fe58fdSRyusuke Konishi 	blocksize = sb->s_blocksize;
629*05fe58fdSRyusuke Konishi 	blkoff = (inode->i_size + blocksize - 1) >> sb->s_blocksize_bits;
630*05fe58fdSRyusuke Konishi 	ret = nilfs_transaction_begin(sb, &ti, 0);
631*05fe58fdSRyusuke Konishi 	BUG_ON(ret);
632*05fe58fdSRyusuke Konishi 
633*05fe58fdSRyusuke Konishi 	block_truncate_page(inode->i_mapping, inode->i_size, nilfs_get_block);
634*05fe58fdSRyusuke Konishi 
635*05fe58fdSRyusuke Konishi 	nilfs_truncate_bmap(ii, blkoff);
636*05fe58fdSRyusuke Konishi 
637*05fe58fdSRyusuke Konishi 	inode->i_mtime = inode->i_ctime = CURRENT_TIME;
638*05fe58fdSRyusuke Konishi 	if (IS_SYNC(inode))
639*05fe58fdSRyusuke Konishi 		nilfs_set_transaction_flag(NILFS_TI_SYNC);
640*05fe58fdSRyusuke Konishi 
641*05fe58fdSRyusuke Konishi 	nilfs_set_file_dirty(NILFS_SB(sb), inode, 0);
642*05fe58fdSRyusuke Konishi 	nilfs_transaction_end(sb, 1);
643*05fe58fdSRyusuke Konishi 	/* May construct a logical segment and may fail in sync mode.
644*05fe58fdSRyusuke Konishi 	   But truncate has no return value. */
645*05fe58fdSRyusuke Konishi }
646*05fe58fdSRyusuke Konishi 
647*05fe58fdSRyusuke Konishi void nilfs_delete_inode(struct inode *inode)
648*05fe58fdSRyusuke Konishi {
649*05fe58fdSRyusuke Konishi 	struct nilfs_transaction_info ti;
650*05fe58fdSRyusuke Konishi 	struct super_block *sb = inode->i_sb;
651*05fe58fdSRyusuke Konishi 	struct nilfs_inode_info *ii = NILFS_I(inode);
652*05fe58fdSRyusuke Konishi 	int err;
653*05fe58fdSRyusuke Konishi 
654*05fe58fdSRyusuke Konishi 	if (unlikely(is_bad_inode(inode))) {
655*05fe58fdSRyusuke Konishi 		if (inode->i_data.nrpages)
656*05fe58fdSRyusuke Konishi 			truncate_inode_pages(&inode->i_data, 0);
657*05fe58fdSRyusuke Konishi 		clear_inode(inode);
658*05fe58fdSRyusuke Konishi 		return;
659*05fe58fdSRyusuke Konishi 	}
660*05fe58fdSRyusuke Konishi 	err = nilfs_transaction_begin(sb, &ti, 0);
661*05fe58fdSRyusuke Konishi 	BUG_ON(err);
662*05fe58fdSRyusuke Konishi 	if (inode->i_data.nrpages)
663*05fe58fdSRyusuke Konishi 		truncate_inode_pages(&inode->i_data, 0);
664*05fe58fdSRyusuke Konishi 
665*05fe58fdSRyusuke Konishi 	nilfs_truncate_bmap(ii, 0);
666*05fe58fdSRyusuke Konishi 	nilfs_free_inode(inode);
667*05fe58fdSRyusuke Konishi 	/* nilfs_free_inode() marks inode buffer dirty */
668*05fe58fdSRyusuke Konishi 	if (IS_SYNC(inode))
669*05fe58fdSRyusuke Konishi 		nilfs_set_transaction_flag(NILFS_TI_SYNC);
670*05fe58fdSRyusuke Konishi 	nilfs_transaction_end(sb, 1);
671*05fe58fdSRyusuke Konishi 	/* May construct a logical segment and may fail in sync mode.
672*05fe58fdSRyusuke Konishi 	   But delete_inode has no return value. */
673*05fe58fdSRyusuke Konishi }
674*05fe58fdSRyusuke Konishi 
675*05fe58fdSRyusuke Konishi int nilfs_setattr(struct dentry *dentry, struct iattr *iattr)
676*05fe58fdSRyusuke Konishi {
677*05fe58fdSRyusuke Konishi 	struct nilfs_transaction_info ti;
678*05fe58fdSRyusuke Konishi 	struct inode *inode = dentry->d_inode;
679*05fe58fdSRyusuke Konishi 	struct super_block *sb = inode->i_sb;
680*05fe58fdSRyusuke Konishi 	int err, err2;
681*05fe58fdSRyusuke Konishi 
682*05fe58fdSRyusuke Konishi 	err = inode_change_ok(inode, iattr);
683*05fe58fdSRyusuke Konishi 	if (err)
684*05fe58fdSRyusuke Konishi 		return err;
685*05fe58fdSRyusuke Konishi 
686*05fe58fdSRyusuke Konishi 	err = nilfs_transaction_begin(sb, &ti, 0);
687*05fe58fdSRyusuke Konishi 	if (unlikely(err))
688*05fe58fdSRyusuke Konishi 		return err;
689*05fe58fdSRyusuke Konishi 	err = inode_setattr(inode, iattr);
690*05fe58fdSRyusuke Konishi 	if (!err && (iattr->ia_valid & ATTR_MODE))
691*05fe58fdSRyusuke Konishi 		err = nilfs_acl_chmod(inode);
692*05fe58fdSRyusuke Konishi 	err2 = nilfs_transaction_end(sb, 1);
693*05fe58fdSRyusuke Konishi 	return err ? : err2;
694*05fe58fdSRyusuke Konishi }
695*05fe58fdSRyusuke Konishi 
696*05fe58fdSRyusuke Konishi int nilfs_load_inode_block(struct nilfs_sb_info *sbi, struct inode *inode,
697*05fe58fdSRyusuke Konishi 			   struct buffer_head **pbh)
698*05fe58fdSRyusuke Konishi {
699*05fe58fdSRyusuke Konishi 	struct nilfs_inode_info *ii = NILFS_I(inode);
700*05fe58fdSRyusuke Konishi 	int err;
701*05fe58fdSRyusuke Konishi 
702*05fe58fdSRyusuke Konishi 	spin_lock(&sbi->s_inode_lock);
703*05fe58fdSRyusuke Konishi 	/* Caller of this function MUST lock s_inode_lock */
704*05fe58fdSRyusuke Konishi 	if (ii->i_bh == NULL) {
705*05fe58fdSRyusuke Konishi 		spin_unlock(&sbi->s_inode_lock);
706*05fe58fdSRyusuke Konishi 		err = nilfs_ifile_get_inode_block(sbi->s_ifile, inode->i_ino,
707*05fe58fdSRyusuke Konishi 						  pbh);
708*05fe58fdSRyusuke Konishi 		if (unlikely(err))
709*05fe58fdSRyusuke Konishi 			return err;
710*05fe58fdSRyusuke Konishi 		spin_lock(&sbi->s_inode_lock);
711*05fe58fdSRyusuke Konishi 		if (ii->i_bh == NULL)
712*05fe58fdSRyusuke Konishi 			ii->i_bh = *pbh;
713*05fe58fdSRyusuke Konishi 		else {
714*05fe58fdSRyusuke Konishi 			brelse(*pbh);
715*05fe58fdSRyusuke Konishi 			*pbh = ii->i_bh;
716*05fe58fdSRyusuke Konishi 		}
717*05fe58fdSRyusuke Konishi 	} else
718*05fe58fdSRyusuke Konishi 		*pbh = ii->i_bh;
719*05fe58fdSRyusuke Konishi 
720*05fe58fdSRyusuke Konishi 	get_bh(*pbh);
721*05fe58fdSRyusuke Konishi 	spin_unlock(&sbi->s_inode_lock);
722*05fe58fdSRyusuke Konishi 	return 0;
723*05fe58fdSRyusuke Konishi }
724*05fe58fdSRyusuke Konishi 
725*05fe58fdSRyusuke Konishi int nilfs_inode_dirty(struct inode *inode)
726*05fe58fdSRyusuke Konishi {
727*05fe58fdSRyusuke Konishi 	struct nilfs_inode_info *ii = NILFS_I(inode);
728*05fe58fdSRyusuke Konishi 	struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb);
729*05fe58fdSRyusuke Konishi 	int ret = 0;
730*05fe58fdSRyusuke Konishi 
731*05fe58fdSRyusuke Konishi 	if (!list_empty(&ii->i_dirty)) {
732*05fe58fdSRyusuke Konishi 		spin_lock(&sbi->s_inode_lock);
733*05fe58fdSRyusuke Konishi 		ret = test_bit(NILFS_I_DIRTY, &ii->i_state) ||
734*05fe58fdSRyusuke Konishi 			test_bit(NILFS_I_BUSY, &ii->i_state);
735*05fe58fdSRyusuke Konishi 		spin_unlock(&sbi->s_inode_lock);
736*05fe58fdSRyusuke Konishi 	}
737*05fe58fdSRyusuke Konishi 	return ret;
738*05fe58fdSRyusuke Konishi }
739*05fe58fdSRyusuke Konishi 
740*05fe58fdSRyusuke Konishi int nilfs_set_file_dirty(struct nilfs_sb_info *sbi, struct inode *inode,
741*05fe58fdSRyusuke Konishi 			 unsigned nr_dirty)
742*05fe58fdSRyusuke Konishi {
743*05fe58fdSRyusuke Konishi 	struct nilfs_inode_info *ii = NILFS_I(inode);
744*05fe58fdSRyusuke Konishi 
745*05fe58fdSRyusuke Konishi 	atomic_add(nr_dirty, &sbi->s_nilfs->ns_ndirtyblks);
746*05fe58fdSRyusuke Konishi 
747*05fe58fdSRyusuke Konishi 	if (test_and_set_bit(NILFS_I_DIRTY, &ii->i_state) ||
748*05fe58fdSRyusuke Konishi 	    unlikely(inode->i_ino == NILFS_SKETCH_INO))
749*05fe58fdSRyusuke Konishi 		return 0;
750*05fe58fdSRyusuke Konishi 
751*05fe58fdSRyusuke Konishi 	spin_lock(&sbi->s_inode_lock);
752*05fe58fdSRyusuke Konishi 	if (!test_bit(NILFS_I_QUEUED, &ii->i_state) &&
753*05fe58fdSRyusuke Konishi 	    !test_bit(NILFS_I_BUSY, &ii->i_state)) {
754*05fe58fdSRyusuke Konishi 		/* Because this routine may race with nilfs_dispose_list(),
755*05fe58fdSRyusuke Konishi 		   we have to check NILFS_I_QUEUED here, too. */
756*05fe58fdSRyusuke Konishi 		if (list_empty(&ii->i_dirty) && igrab(inode) == NULL) {
757*05fe58fdSRyusuke Konishi 			/* This will happen when somebody is freeing
758*05fe58fdSRyusuke Konishi 			   this inode. */
759*05fe58fdSRyusuke Konishi 			nilfs_warning(sbi->s_super, __func__,
760*05fe58fdSRyusuke Konishi 				      "cannot get inode (ino=%lu)\n",
761*05fe58fdSRyusuke Konishi 				      inode->i_ino);
762*05fe58fdSRyusuke Konishi 			spin_unlock(&sbi->s_inode_lock);
763*05fe58fdSRyusuke Konishi 			return -EINVAL; /* NILFS_I_DIRTY may remain for
764*05fe58fdSRyusuke Konishi 					   freeing inode */
765*05fe58fdSRyusuke Konishi 		}
766*05fe58fdSRyusuke Konishi 		list_del(&ii->i_dirty);
767*05fe58fdSRyusuke Konishi 		list_add_tail(&ii->i_dirty, &sbi->s_dirty_files);
768*05fe58fdSRyusuke Konishi 		set_bit(NILFS_I_QUEUED, &ii->i_state);
769*05fe58fdSRyusuke Konishi 	}
770*05fe58fdSRyusuke Konishi 	spin_unlock(&sbi->s_inode_lock);
771*05fe58fdSRyusuke Konishi 	return 0;
772*05fe58fdSRyusuke Konishi }
773*05fe58fdSRyusuke Konishi 
774*05fe58fdSRyusuke Konishi int nilfs_mark_inode_dirty(struct inode *inode)
775*05fe58fdSRyusuke Konishi {
776*05fe58fdSRyusuke Konishi 	struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb);
777*05fe58fdSRyusuke Konishi 	struct buffer_head *ibh;
778*05fe58fdSRyusuke Konishi 	int err;
779*05fe58fdSRyusuke Konishi 
780*05fe58fdSRyusuke Konishi 	err = nilfs_load_inode_block(sbi, inode, &ibh);
781*05fe58fdSRyusuke Konishi 	if (unlikely(err)) {
782*05fe58fdSRyusuke Konishi 		nilfs_warning(inode->i_sb, __func__,
783*05fe58fdSRyusuke Konishi 			      "failed to reget inode block.\n");
784*05fe58fdSRyusuke Konishi 		return err;
785*05fe58fdSRyusuke Konishi 	}
786*05fe58fdSRyusuke Konishi 	lock_buffer(ibh);
787*05fe58fdSRyusuke Konishi 	nilfs_update_inode(inode, ibh);
788*05fe58fdSRyusuke Konishi 	unlock_buffer(ibh);
789*05fe58fdSRyusuke Konishi 	nilfs_mdt_mark_buffer_dirty(ibh);
790*05fe58fdSRyusuke Konishi 	nilfs_mdt_mark_dirty(sbi->s_ifile);
791*05fe58fdSRyusuke Konishi 	brelse(ibh);
792*05fe58fdSRyusuke Konishi 	return 0;
793*05fe58fdSRyusuke Konishi }
794*05fe58fdSRyusuke Konishi 
795*05fe58fdSRyusuke Konishi /**
796*05fe58fdSRyusuke Konishi  * nilfs_dirty_inode - reflect changes on given inode to an inode block.
797*05fe58fdSRyusuke Konishi  * @inode: inode of the file to be registered.
798*05fe58fdSRyusuke Konishi  *
799*05fe58fdSRyusuke Konishi  * nilfs_dirty_inode() loads a inode block containing the specified
800*05fe58fdSRyusuke Konishi  * @inode and copies data from a nilfs_inode to a corresponding inode
801*05fe58fdSRyusuke Konishi  * entry in the inode block. This operation is excluded from the segment
802*05fe58fdSRyusuke Konishi  * construction. This function can be called both as a single operation
803*05fe58fdSRyusuke Konishi  * and as a part of indivisible file operations.
804*05fe58fdSRyusuke Konishi  */
805*05fe58fdSRyusuke Konishi void nilfs_dirty_inode(struct inode *inode)
806*05fe58fdSRyusuke Konishi {
807*05fe58fdSRyusuke Konishi 	struct nilfs_transaction_info ti;
808*05fe58fdSRyusuke Konishi 
809*05fe58fdSRyusuke Konishi 	if (is_bad_inode(inode)) {
810*05fe58fdSRyusuke Konishi 		nilfs_warning(inode->i_sb, __func__,
811*05fe58fdSRyusuke Konishi 			      "tried to mark bad_inode dirty. ignored.\n");
812*05fe58fdSRyusuke Konishi 		dump_stack();
813*05fe58fdSRyusuke Konishi 		return;
814*05fe58fdSRyusuke Konishi 	}
815*05fe58fdSRyusuke Konishi 	nilfs_transaction_begin(inode->i_sb, &ti, 0);
816*05fe58fdSRyusuke Konishi 	if (likely(inode->i_ino != NILFS_SKETCH_INO))
817*05fe58fdSRyusuke Konishi 		nilfs_mark_inode_dirty(inode);
818*05fe58fdSRyusuke Konishi 	nilfs_transaction_end(inode->i_sb, 1); /* never fails */
819*05fe58fdSRyusuke Konishi }
820