inode.c 30.8 KB
Newer Older
D
David Teigland 已提交
1 2
/*
 * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
B
Bob Peterson 已提交
3
 * Copyright (C) 2004-2008 Red Hat, Inc.  All rights reserved.
D
David Teigland 已提交
4 5 6
 *
 * This copyrighted material is made available to anyone wishing to use,
 * modify, copy, or redistribute it subject to the terms and conditions
7
 * of the GNU General Public License version 2.
D
David Teigland 已提交
8 9 10 11 12 13 14 15 16
 */

#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/spinlock.h>
#include <linux/completion.h>
#include <linux/buffer_head.h>
#include <linux/posix_acl.h>
#include <linux/sort.h>
17
#include <linux/gfs2_ondisk.h>
18
#include <linux/crc32.h>
19
#include <linux/lm_interface.h>
20
#include <linux/security.h>
21
#include <linux/time.h>
D
David Teigland 已提交
22 23

#include "gfs2.h"
24
#include "incore.h"
D
David Teigland 已提交
25 26 27 28 29 30 31 32 33 34 35 36 37
#include "acl.h"
#include "bmap.h"
#include "dir.h"
#include "eattr.h"
#include "glock.h"
#include "glops.h"
#include "inode.h"
#include "log.h"
#include "meta_io.h"
#include "ops_address.h"
#include "quota.h"
#include "rgrp.h"
#include "trans.h"
38
#include "util.h"
D
David Teigland 已提交
39

40 41 42 43 44
struct gfs2_inum_range_host {
	u64 ir_start;
	u64 ir_length;
};

45 46 47
static int iget_test(struct inode *inode, void *opaque)
{
	struct gfs2_inode *ip = GFS2_I(inode);
48
	u64 *no_addr = opaque;
49

50
	if (ip->i_no_addr == *no_addr && test_bit(GIF_USER, &ip->i_flags))
51
		return 1;
D
David Teigland 已提交
52

53 54 55 56
	return 0;
}

static int iget_set(struct inode *inode, void *opaque)
D
David Teigland 已提交
57
{
58
	struct gfs2_inode *ip = GFS2_I(inode);
59
	u64 *no_addr = opaque;
D
David Teigland 已提交
60

61 62
	inode->i_ino = (unsigned long)*no_addr;
	ip->i_no_addr = *no_addr;
63
	set_bit(GIF_USER, &ip->i_flags);
64 65
	return 0;
}
D
David Teigland 已提交
66

67
struct inode *gfs2_ilookup(struct super_block *sb, u64 no_addr)
68
{
69 70
	unsigned long hash = (unsigned long)no_addr;
	return ilookup5(sb, hash, iget_test, &no_addr);
71
}
D
David Teigland 已提交
72

73
static struct inode *gfs2_iget(struct super_block *sb, u64 no_addr)
74
{
75 76
	unsigned long hash = (unsigned long)no_addr;
	return iget5_locked(sb, hash, iget_test, iget_set, &no_addr);
D
David Teigland 已提交
77 78
}

79 80 81 82 83 84 85 86 87 88
struct gfs2_skip_data {
	u64	no_addr;
	int	skipped;
};

static int iget_skip_test(struct inode *inode, void *opaque)
{
	struct gfs2_inode *ip = GFS2_I(inode);
	struct gfs2_skip_data *data = opaque;

89
	if (ip->i_no_addr == data->no_addr && test_bit(GIF_USER, &ip->i_flags)){
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
		if (inode->i_state & (I_FREEING|I_CLEAR|I_WILL_FREE)){
			data->skipped = 1;
			return 0;
		}
		return 1;
	}
	return 0;
}

static int iget_skip_set(struct inode *inode, void *opaque)
{
	struct gfs2_inode *ip = GFS2_I(inode);
	struct gfs2_skip_data *data = opaque;

	if (data->skipped)
		return 1;
	inode->i_ino = (unsigned long)(data->no_addr);
	ip->i_no_addr = data->no_addr;
108
	set_bit(GIF_USER, &ip->i_flags);
109 110 111 112 113 114 115 116 117 118 119 120 121 122
	return 0;
}

static struct inode *gfs2_iget_skip(struct super_block *sb,
				    u64 no_addr)
{
	struct gfs2_skip_data data;
	unsigned long hash = (unsigned long)no_addr;

	data.no_addr = no_addr;
	data.skipped = 0;
	return iget5_locked(sb, hash, iget_skip_test, iget_skip_set, &data);
}

123 124 125 126 127 128 129 130 131 132 133 134
/**
 * GFS2 lookup code fills in vfs inode contents based on info obtained
 * from directory entry inside gfs2_inode_lookup(). This has caused issues
 * with NFS code path since its get_dentry routine doesn't have the relevant
 * directory entry when gfs2_inode_lookup() is invoked. Part of the code
 * segment inside gfs2_inode_lookup code needs to get moved around.
 *
 * Clean up I_LOCK and I_NEW as well.
 **/

void gfs2_set_iop(struct inode *inode)
{
135
	struct gfs2_sbd *sdp = GFS2_SB(inode);
136 137 138 139
	umode_t mode = inode->i_mode;

	if (S_ISREG(mode)) {
		inode->i_op = &gfs2_file_iops;
140 141 142 143
		if (sdp->sd_args.ar_localflocks)
			inode->i_fop = &gfs2_file_fops_nolock;
		else
			inode->i_fop = &gfs2_file_fops;
144 145
	} else if (S_ISDIR(mode)) {
		inode->i_op = &gfs2_dir_iops;
146 147 148 149
		if (sdp->sd_args.ar_localflocks)
			inode->i_fop = &gfs2_dir_fops_nolock;
		else
			inode->i_fop = &gfs2_dir_fops;
150 151 152
	} else if (S_ISLNK(mode)) {
		inode->i_op = &gfs2_symlink_iops;
	} else {
D
Denis Cheng 已提交
153
		inode->i_op = &gfs2_file_iops;
D
Denis Cheng 已提交
154
		init_special_inode(inode, inode->i_mode, inode->i_rdev);
155 156 157 158 159
	}

	unlock_new_inode(inode);
}

D
David Teigland 已提交
160
/**
161 162
 * gfs2_inode_lookup - Lookup an inode
 * @sb: The super block
163
 * @no_addr: The inode number
164
 * @type: The type of the inode
165
 * @skip_freeing: set this not return an inode if it is currently being freed.
D
David Teigland 已提交
166
 *
167
 * Returns: A VFS inode, or an error
D
David Teigland 已提交
168 169
 */

170
struct inode *gfs2_inode_lookup(struct super_block *sb,
171 172
				unsigned int type,
				u64 no_addr,
173
				u64 no_formal_ino, int skip_freeing)
D
David Teigland 已提交
174
{
175 176
	struct inode *inode;
	struct gfs2_inode *ip;
177 178
	struct gfs2_glock *io_gl;
	int error;
D
David Teigland 已提交
179

180 181 182 183 184 185
	if (skip_freeing)
		inode = gfs2_iget_skip(sb, no_addr);
	else
		inode = gfs2_iget(sb, no_addr);
	ip = GFS2_I(inode);

S
Steven Whitehouse 已提交
186 187 188
	if (!inode)
		return ERR_PTR(-ENOBUFS);

189 190
	if (inode->i_state & I_NEW) {
		struct gfs2_sbd *sdp = GFS2_SB(inode);
191
		ip->i_no_formal_ino = no_formal_ino;
D
David Teigland 已提交
192

193
		error = gfs2_glock_get(sdp, no_addr, &gfs2_inode_glops, CREATE, &ip->i_gl);
194 195 196
		if (unlikely(error))
			goto fail;
		ip->i_gl->gl_object = ip;
D
David Teigland 已提交
197

198
		error = gfs2_glock_get(sdp, no_addr, &gfs2_iopen_glops, CREATE, &io_gl);
199 200
		if (unlikely(error))
			goto fail_put;
D
David Teigland 已提交
201

202
		set_bit(GIF_INVALID, &ip->i_flags);
203 204 205
		error = gfs2_glock_nq_init(io_gl, LM_ST_SHARED, GL_EXACT, &ip->i_iopen_gh);
		if (unlikely(error))
			goto fail_iopen;
A
Abhijith Das 已提交
206
		ip->i_iopen_gh.gh_gl->gl_object = ip;
D
David Teigland 已提交
207

208
		gfs2_glock_put(io_gl);
209

210 211 212 213 214
		if ((type == DT_UNKNOWN) && (no_formal_ino == 0))
			goto gfs2_nfsbypass;

		inode->i_mode = DT2IF(type);

215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230
		/*
		 * We must read the inode in order to work out its type in
		 * this case. Note that this doesn't happen often as we normally
		 * know the type beforehand. This code path only occurs during
		 * unlinked inode recovery (where it is safe to do this glock,
		 * which is not true in the general case).
		 */
		if (type == DT_UNKNOWN) {
			struct gfs2_holder gh;
			error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
			if (unlikely(error))
				goto fail_glock;
			/* Inode is now uptodate */
			gfs2_glock_dq_uninit(&gh);
		}

231
		gfs2_set_iop(inode);
232
	}
D
David Teigland 已提交
233

234
gfs2_nfsbypass:
D
David Teigland 已提交
235
	return inode;
236 237
fail_glock:
	gfs2_glock_dq(&ip->i_iopen_gh);
238 239 240 241 242 243
fail_iopen:
	gfs2_glock_put(io_gl);
fail_put:
	ip->i_gl->gl_object = NULL;
	gfs2_glock_put(ip->i_gl);
fail:
D
David Howells 已提交
244
	iget_failed(inode);
245
	return ERR_PTR(error);
D
David Teigland 已提交
246 247
}

248
static int gfs2_dinode_in(struct gfs2_inode *ip, const void *buf)
249 250 251
{
	struct gfs2_dinode_host *di = &ip->i_di;
	const struct gfs2_dinode *str = buf;
252
	struct timespec atime;
253
	u16 height, depth;
254

255 256
	if (unlikely(ip->i_no_addr != be64_to_cpu(str->di_num.no_addr)))
		goto corrupt;
257
	ip->i_no_formal_ino = be64_to_cpu(str->di_num.no_formal_ino);
258
	ip->i_inode.i_mode = be32_to_cpu(str->di_mode);
259
	ip->i_inode.i_rdev = 0;
260
	switch (ip->i_inode.i_mode & S_IFMT) {
261 262 263 264 265 266 267
	case S_IFBLK:
	case S_IFCHR:
		ip->i_inode.i_rdev = MKDEV(be32_to_cpu(str->di_major),
					   be32_to_cpu(str->di_minor));
		break;
	};

268 269
	ip->i_inode.i_uid = be32_to_cpu(str->di_uid);
	ip->i_inode.i_gid = be32_to_cpu(str->di_gid);
270 271 272 273 274 275
	/*
	 * We will need to review setting the nlink count here in the
	 * light of the forthcoming ro bind mount work. This is a reminder
	 * to do that.
	 */
	ip->i_inode.i_nlink = be32_to_cpu(str->di_nlink);
276
	di->di_size = be64_to_cpu(str->di_size);
277
	i_size_write(&ip->i_inode, di->di_size);
278
	gfs2_set_inode_blocks(&ip->i_inode, be64_to_cpu(str->di_blocks));
279 280 281 282
	atime.tv_sec = be64_to_cpu(str->di_atime);
	atime.tv_nsec = be32_to_cpu(str->di_atime_nsec);
	if (timespec_compare(&ip->i_inode.i_atime, &atime) < 0)
		ip->i_inode.i_atime = atime;
283
	ip->i_inode.i_mtime.tv_sec = be64_to_cpu(str->di_mtime);
284
	ip->i_inode.i_mtime.tv_nsec = be32_to_cpu(str->di_mtime_nsec);
285
	ip->i_inode.i_ctime.tv_sec = be64_to_cpu(str->di_ctime);
286
	ip->i_inode.i_ctime.tv_nsec = be32_to_cpu(str->di_ctime_nsec);
287

288
	ip->i_goal = be64_to_cpu(str->di_goal_meta);
289 290 291
	di->di_generation = be64_to_cpu(str->di_generation);

	di->di_flags = be32_to_cpu(str->di_flags);
292
	gfs2_set_inode_flags(&ip->i_inode);
293 294 295 296
	height = be16_to_cpu(str->di_height);
	if (unlikely(height > GFS2_MAX_META_HEIGHT))
		goto corrupt;
	ip->i_height = (u8)height;
297

298 299 300 301
	depth = be16_to_cpu(str->di_depth);
	if (unlikely(depth > GFS2_DIR_MAX_DEPTH))
		goto corrupt;
	ip->i_depth = (u8)depth;
302 303 304
	di->di_entries = be32_to_cpu(str->di_entries);

	di->di_eattr = be64_to_cpu(str->di_eattr);
305 306 307
	if (S_ISREG(ip->i_inode.i_mode))
		gfs2_set_aops(&ip->i_inode);

308
	return 0;
309 310 311 312
corrupt:
	if (gfs2_consist_inode(ip))
		gfs2_dinode_print(ip);
	return -EIO;
313 314
}

D
David Teigland 已提交
315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330
/**
 * gfs2_inode_refresh - Refresh the incore copy of the dinode
 * @ip: The GFS2 inode
 *
 * Returns: errno
 */

int gfs2_inode_refresh(struct gfs2_inode *ip)
{
	struct buffer_head *dibh;
	int error;

	error = gfs2_meta_inode_buffer(ip, &dibh);
	if (error)
		return error;

331
	if (gfs2_metatype_check(GFS2_SB(&ip->i_inode), dibh, GFS2_METATYPE_DI)) {
D
David Teigland 已提交
332 333 334 335
		brelse(dibh);
		return -EIO;
	}

336
	error = gfs2_dinode_in(ip, dibh->b_data);
D
David Teigland 已提交
337
	brelse(dibh);
338
	clear_bit(GIF_INVALID, &ip->i_flags);
D
David Teigland 已提交
339

340
	return error;
D
David Teigland 已提交
341 342
}

343
int gfs2_dinode_dealloc(struct gfs2_inode *ip)
D
David Teigland 已提交
344
{
345
	struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
D
David Teigland 已提交
346 347 348 349
	struct gfs2_alloc *al;
	struct gfs2_rgrpd *rgd;
	int error;

350
	if (gfs2_get_inode_blocks(&ip->i_inode) != 1) {
D
David Teigland 已提交
351
		if (gfs2_consist_inode(ip))
352
			gfs2_dinode_print(ip);
D
David Teigland 已提交
353 354 355 356
		return -EIO;
	}

	al = gfs2_alloc_get(ip);
357 358
	if (!al)
		return -ENOMEM;
D
David Teigland 已提交
359 360 361 362 363 364 365 366 367

	error = gfs2_quota_hold(ip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
	if (error)
		goto out;

	error = gfs2_rindex_hold(sdp, &al->al_ri_gh);
	if (error)
		goto out_qs;

368
	rgd = gfs2_blk2rgrpd(sdp, ip->i_no_addr);
D
David Teigland 已提交
369 370 371 372 373 374 375 376 377 378 379
	if (!rgd) {
		gfs2_consist_inode(ip);
		error = -EIO;
		goto out_rindex_relse;
	}

	error = gfs2_glock_nq_init(rgd->rd_gl, LM_ST_EXCLUSIVE, 0,
				   &al->al_rgd_gh);
	if (error)
		goto out_rindex_relse;

380
	error = gfs2_trans_begin(sdp, RES_RG_BIT + RES_STATFS + RES_QUOTA, 1);
D
David Teigland 已提交
381 382 383
	if (error)
		goto out_rg_gunlock;

384 385
	set_bit(GLF_DIRTY, &ip->i_gl->gl_flags);
	set_bit(GLF_LFLUSH, &ip->i_gl->gl_flags);
D
David Teigland 已提交
386 387 388 389 390 391

	gfs2_free_di(rgd, ip);

	gfs2_trans_end(sdp);
	clear_bit(GLF_STICKY, &ip->i_gl->gl_flags);

392
out_rg_gunlock:
D
David Teigland 已提交
393
	gfs2_glock_dq_uninit(&al->al_rgd_gh);
394
out_rindex_relse:
D
David Teigland 已提交
395
	gfs2_glock_dq_uninit(&al->al_ri_gh);
396
out_qs:
D
David Teigland 已提交
397
	gfs2_quota_unhold(ip);
398
out:
399
	gfs2_alloc_put(ip);
D
David Teigland 已提交
400 401 402 403
	return error;
}

/**
S
S. Wendy Cheng 已提交
404
 * gfs2_change_nlink - Change nlink count on inode
D
David Teigland 已提交
405 406 407 408 409
 * @ip: The GFS2 inode
 * @diff: The change in the nlink count required
 *
 * Returns: errno
 */
S
S. Wendy Cheng 已提交
410
int gfs2_change_nlink(struct gfs2_inode *ip, int diff)
D
David Teigland 已提交
411 412
{
	struct buffer_head *dibh;
413
	u32 nlink;
D
David Teigland 已提交
414 415
	int error;

416 417
	BUG_ON(diff != 1 && diff != -1);
	nlink = ip->i_inode.i_nlink + diff;
D
David Teigland 已提交
418 419 420

	/* If we are reducing the nlink count, but the new value ends up being
	   bigger than the old one, we must have underflowed. */
421
	if (diff < 0 && nlink > ip->i_inode.i_nlink) {
D
David Teigland 已提交
422
		if (gfs2_consist_inode(ip))
423
			gfs2_dinode_print(ip);
D
David Teigland 已提交
424 425 426 427 428 429 430
		return -EIO;
	}

	error = gfs2_meta_inode_buffer(ip, &dibh);
	if (error)
		return error;

431 432 433 434 435
	if (diff > 0)
		inc_nlink(&ip->i_inode);
	else
		drop_nlink(&ip->i_inode);

436
	ip->i_inode.i_ctime = CURRENT_TIME;
D
David Teigland 已提交
437

438
	gfs2_trans_add_bh(ip->i_gl, dibh, 1);
439
	gfs2_dinode_out(ip, dibh->b_data);
D
David Teigland 已提交
440
	brelse(dibh);
441
	mark_inode_dirty(&ip->i_inode);
D
David Teigland 已提交
442

S
S. Wendy Cheng 已提交
443
	if (ip->i_inode.i_nlink == 0)
R
Russell Cattelan 已提交
444
		gfs2_unlink_di(&ip->i_inode); /* mark inode unlinked */
S
S. Wendy Cheng 已提交
445

446 447 448
	return error;
}

449 450 451
struct inode *gfs2_lookup_simple(struct inode *dip, const char *name)
{
	struct qstr qstr;
452
	struct inode *inode;
453
	gfs2_str2qstr(&qstr, name);
454
	inode = gfs2_lookupi(dip, &qstr, 1);
455 456 457 458 459 460 461 462 463
	/* gfs2_lookupi has inconsistent callers: vfs
	 * related routines expect NULL for no entry found,
	 * gfs2_lookup_simple callers expect ENOENT
	 * and do not check for NULL.
	 */
	if (inode == NULL)
		return ERR_PTR(-ENOENT);
	else
		return inode;
464 465 466
}


D
David Teigland 已提交
467 468 469 470 471 472 473
/**
 * gfs2_lookupi - Look up a filename in a directory and return its inode
 * @d_gh: An initialized holder for the directory glock
 * @name: The name of the inode to look for
 * @is_root: If 1, ignore the caller's permissions
 * @i_gh: An uninitialized holder for the new inode glock
 *
474 475 476 477
 * This can be called via the VFS filldir function when NFS is doing
 * a readdirplus and the inode which its intending to stat isn't
 * already in cache. In this case we must not take the directory glock
 * again, since the readdir call will have already taken that lock.
D
David Teigland 已提交
478 479 480 481
 *
 * Returns: errno
 */

482
struct inode *gfs2_lookupi(struct inode *dir, const struct qstr *name,
483
			   int is_root)
D
David Teigland 已提交
484
{
S
Steven Whitehouse 已提交
485
	struct super_block *sb = dir->i_sb;
486
	struct gfs2_inode *dip = GFS2_I(dir);
D
David Teigland 已提交
487
	struct gfs2_holder d_gh;
488
	int error = 0;
489
	struct inode *inode = NULL;
490
	int unlock = 0;
D
David Teigland 已提交
491 492

	if (!name->len || name->len > GFS2_FNAMESIZE)
493
		return ERR_PTR(-ENAMETOOLONG);
D
David Teigland 已提交
494

495 496 497
	if ((name->len == 1 && memcmp(name->name, ".", 1) == 0) ||
	    (name->len == 2 && memcmp(name->name, "..", 2) == 0 &&
	     dir == sb->s_root->d_inode)) {
498 499
		igrab(dir);
		return dir;
D
David Teigland 已提交
500 501
	}

502
	if (gfs2_glock_is_locked_by_me(dip->i_gl) == NULL) {
503 504 505 506 507
		error = gfs2_glock_nq_init(dip->i_gl, LM_ST_SHARED, 0, &d_gh);
		if (error)
			return ERR_PTR(error);
		unlock = 1;
	}
D
David Teigland 已提交
508 509

	if (!is_root) {
M
Miklos Szeredi 已提交
510
		error = gfs2_permission(dir, MAY_EXEC);
D
David Teigland 已提交
511 512 513 514
		if (error)
			goto out;
	}

515 516 517
	inode = gfs2_dir_search(dir, name);
	if (IS_ERR(inode))
		error = PTR_ERR(inode);
518
out:
519 520
	if (unlock)
		gfs2_glock_dq_uninit(&d_gh);
521 522
	if (error == -ENOENT)
		return NULL;
523
	return inode ? inode : ERR_PTR(error);
D
David Teigland 已提交
524 525
}

526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541
static void gfs2_inum_range_in(struct gfs2_inum_range_host *ir, const void *buf)
{
	const struct gfs2_inum_range *str = buf;

	ir->ir_start = be64_to_cpu(str->ir_start);
	ir->ir_length = be64_to_cpu(str->ir_length);
}

static void gfs2_inum_range_out(const struct gfs2_inum_range_host *ir, void *buf)
{
	struct gfs2_inum_range *str = buf;

	str->ir_start = cpu_to_be64(ir->ir_start);
	str->ir_length = cpu_to_be64(ir->ir_length);
}

542
static int pick_formal_ino_1(struct gfs2_sbd *sdp, u64 *formal_ino)
D
David Teigland 已提交
543
{
544
	struct gfs2_inode *ip = GFS2_I(sdp->sd_ir_inode);
D
David Teigland 已提交
545
	struct buffer_head *bh;
546
	struct gfs2_inum_range_host ir;
D
David Teigland 已提交
547 548 549 550 551
	int error;

	error = gfs2_trans_begin(sdp, RES_DINODE, 0);
	if (error)
		return error;
552
	mutex_lock(&sdp->sd_inum_mutex);
D
David Teigland 已提交
553 554 555

	error = gfs2_meta_inode_buffer(ip, &bh);
	if (error) {
556
		mutex_unlock(&sdp->sd_inum_mutex);
D
David Teigland 已提交
557 558 559 560 561 562 563 564 565
		gfs2_trans_end(sdp);
		return error;
	}

	gfs2_inum_range_in(&ir, bh->b_data + sizeof(struct gfs2_dinode));

	if (ir.ir_length) {
		*formal_ino = ir.ir_start++;
		ir.ir_length--;
566
		gfs2_trans_add_bh(ip->i_gl, bh, 1);
D
David Teigland 已提交
567 568 569
		gfs2_inum_range_out(&ir,
				    bh->b_data + sizeof(struct gfs2_dinode));
		brelse(bh);
570
		mutex_unlock(&sdp->sd_inum_mutex);
D
David Teigland 已提交
571 572 573 574 575 576
		gfs2_trans_end(sdp);
		return 0;
	}

	brelse(bh);

577
	mutex_unlock(&sdp->sd_inum_mutex);
D
David Teigland 已提交
578 579 580 581 582
	gfs2_trans_end(sdp);

	return 1;
}

583
static int pick_formal_ino_2(struct gfs2_sbd *sdp, u64 *formal_ino)
D
David Teigland 已提交
584
{
585 586
	struct gfs2_inode *ip = GFS2_I(sdp->sd_ir_inode);
	struct gfs2_inode *m_ip = GFS2_I(sdp->sd_inum_inode);
D
David Teigland 已提交
587 588
	struct gfs2_holder gh;
	struct buffer_head *bh;
589
	struct gfs2_inum_range_host ir;
D
David Teigland 已提交
590 591 592 593 594 595 596 597 598
	int error;

	error = gfs2_glock_nq_init(m_ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
	if (error)
		return error;

	error = gfs2_trans_begin(sdp, 2 * RES_DINODE, 0);
	if (error)
		goto out;
599
	mutex_lock(&sdp->sd_inum_mutex);
D
David Teigland 已提交
600 601 602 603

	error = gfs2_meta_inode_buffer(ip, &bh);
	if (error)
		goto out_end_trans;
604

D
David Teigland 已提交
605 606 607 608
	gfs2_inum_range_in(&ir, bh->b_data + sizeof(struct gfs2_dinode));

	if (!ir.ir_length) {
		struct buffer_head *m_bh;
609
		u64 x, y;
A
Al Viro 已提交
610
		__be64 z;
D
David Teigland 已提交
611 612 613 614 615

		error = gfs2_meta_inode_buffer(m_ip, &m_bh);
		if (error)
			goto out_brelse;

A
Al Viro 已提交
616 617
		z = *(__be64 *)(m_bh->b_data + sizeof(struct gfs2_dinode));
		x = y = be64_to_cpu(z);
D
David Teigland 已提交
618 619 620 621 622
		ir.ir_start = x;
		ir.ir_length = GFS2_INUM_QUANTUM;
		x += GFS2_INUM_QUANTUM;
		if (x < y)
			gfs2_consist_inode(m_ip);
A
Al Viro 已提交
623
		z = cpu_to_be64(x);
624
		gfs2_trans_add_bh(m_ip->i_gl, m_bh, 1);
A
Al Viro 已提交
625
		*(__be64 *)(m_bh->b_data + sizeof(struct gfs2_dinode)) = z;
D
David Teigland 已提交
626 627 628 629 630 631 632

		brelse(m_bh);
	}

	*formal_ino = ir.ir_start++;
	ir.ir_length--;

633
	gfs2_trans_add_bh(ip->i_gl, bh, 1);
D
David Teigland 已提交
634 635
	gfs2_inum_range_out(&ir, bh->b_data + sizeof(struct gfs2_dinode));

636
out_brelse:
D
David Teigland 已提交
637
	brelse(bh);
638
out_end_trans:
639
	mutex_unlock(&sdp->sd_inum_mutex);
D
David Teigland 已提交
640
	gfs2_trans_end(sdp);
641
out:
D
David Teigland 已提交
642 643 644 645
	gfs2_glock_dq_uninit(&gh);
	return error;
}

646
static int pick_formal_ino(struct gfs2_sbd *sdp, u64 *inum)
D
David Teigland 已提交
647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667
{
	int error;

	error = pick_formal_ino_1(sdp, inum);
	if (error <= 0)
		return error;

	error = pick_formal_ino_2(sdp, inum);

	return error;
}

/**
 * create_ok - OK to create a new on-disk inode here?
 * @dip:  Directory in which dinode is to be created
 * @name:  Name of new dinode
 * @mode:
 *
 * Returns: errno
 */

668
static int create_ok(struct gfs2_inode *dip, const struct qstr *name,
D
David Teigland 已提交
669 670 671 672
		     unsigned int mode)
{
	int error;

M
Miklos Szeredi 已提交
673
	error = gfs2_permission(&dip->i_inode, MAY_WRITE | MAY_EXEC);
D
David Teigland 已提交
674 675 676 677
	if (error)
		return error;

	/*  Don't create entries in an unlinked directory  */
678
	if (!dip->i_inode.i_nlink)
D
David Teigland 已提交
679 680
		return -EPERM;

681
	error = gfs2_dir_check(&dip->i_inode, name, NULL);
D
David Teigland 已提交
682 683 684 685 686 687 688 689 690 691
	switch (error) {
	case -ENOENT:
		error = 0;
		break;
	case 0:
		return -EEXIST;
	default:
		return error;
	}

692
	if (dip->i_di.di_entries == (u32)-1)
D
David Teigland 已提交
693
		return -EFBIG;
694
	if (S_ISDIR(mode) && dip->i_inode.i_nlink == (u32)-1)
D
David Teigland 已提交
695 696 697 698 699 700 701 702
		return -EMLINK;

	return 0;
}

static void munge_mode_uid_gid(struct gfs2_inode *dip, unsigned int *mode,
			       unsigned int *uid, unsigned int *gid)
{
703
	if (GFS2_SB(&dip->i_inode)->sd_args.ar_suiddir &&
704
	    (dip->i_inode.i_mode & S_ISUID) && dip->i_inode.i_uid) {
D
David Teigland 已提交
705 706
		if (S_ISDIR(*mode))
			*mode |= S_ISUID;
707
		else if (dip->i_inode.i_uid != current_fsuid())
D
David Teigland 已提交
708
			*mode &= ~07111;
709
		*uid = dip->i_inode.i_uid;
D
David Teigland 已提交
710
	} else
711
		*uid = current_fsuid();
D
David Teigland 已提交
712

713
	if (dip->i_inode.i_mode & S_ISGID) {
D
David Teigland 已提交
714 715
		if (S_ISDIR(*mode))
			*mode |= S_ISGID;
716
		*gid = dip->i_inode.i_gid;
D
David Teigland 已提交
717
	} else
718
		*gid = current_fsgid();
D
David Teigland 已提交
719 720
}

721
static int alloc_dinode(struct gfs2_inode *dip, u64 *no_addr, u64 *generation)
D
David Teigland 已提交
722
{
723
	struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
D
David Teigland 已提交
724 725
	int error;

726 727
	if (gfs2_alloc_get(dip) == NULL)
		return -ENOMEM;
D
David Teigland 已提交
728

729
	dip->i_alloc->al_requested = RES_DINODE;
D
David Teigland 已提交
730 731 732 733
	error = gfs2_inplace_reserve(dip);
	if (error)
		goto out;

734
	error = gfs2_trans_begin(sdp, RES_RG_BIT + RES_STATFS, 0);
D
David Teigland 已提交
735 736 737
	if (error)
		goto out_ipreserv;

738
	*no_addr = gfs2_alloc_di(dip, generation);
D
David Teigland 已提交
739 740 741

	gfs2_trans_end(sdp);

S
Steven Whitehouse 已提交
742
out_ipreserv:
D
David Teigland 已提交
743
	gfs2_inplace_release(dip);
S
Steven Whitehouse 已提交
744
out:
D
David Teigland 已提交
745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760
	gfs2_alloc_put(dip);
	return error;
}

/**
 * init_dinode - Fill in a new dinode structure
 * @dip: the directory this inode is being created in
 * @gl: The glock covering the new inode
 * @inum: the inode number
 * @mode: the file permissions
 * @uid:
 * @gid:
 *
 */

static void init_dinode(struct gfs2_inode *dip, struct gfs2_glock *gl,
A
Al Viro 已提交
761
			const struct gfs2_inum_host *inum, unsigned int mode,
S
Steven Whitehouse 已提交
762
			unsigned int uid, unsigned int gid,
763
			const u64 *generation, dev_t dev, struct buffer_head **bhp)
D
David Teigland 已提交
764
{
765
	struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
766
	struct gfs2_dinode *di;
D
David Teigland 已提交
767
	struct buffer_head *dibh;
768
	struct timespec tv = CURRENT_TIME;
D
David Teigland 已提交
769 770

	dibh = gfs2_meta_new(gl, inum->no_addr);
771
	gfs2_trans_add_bh(gl, dibh, 1);
D
David Teigland 已提交
772 773
	gfs2_metatype_set(dibh, GFS2_METATYPE_DI, GFS2_FORMAT_DI);
	gfs2_buffer_clear_tail(dibh, sizeof(struct gfs2_dinode));
774 775
	di = (struct gfs2_dinode *)dibh->b_data;

776 777
	di->di_num.no_formal_ino = cpu_to_be64(inum->no_formal_ino);
	di->di_num.no_addr = cpu_to_be64(inum->no_addr);
778 779 780
	di->di_mode = cpu_to_be32(mode);
	di->di_uid = cpu_to_be32(uid);
	di->di_gid = cpu_to_be32(gid);
781 782
	di->di_nlink = 0;
	di->di_size = 0;
783
	di->di_blocks = cpu_to_be64(1);
784
	di->di_atime = di->di_mtime = di->di_ctime = cpu_to_be64(tv.tv_sec);
785 786
	di->di_major = cpu_to_be32(MAJOR(dev));
	di->di_minor = cpu_to_be32(MINOR(dev));
787
	di->di_goal_meta = di->di_goal_data = cpu_to_be64(inum->no_addr);
S
Steven Whitehouse 已提交
788
	di->di_generation = cpu_to_be64(*generation);
789
	di->di_flags = 0;
D
David Teigland 已提交
790 791 792 793

	if (S_ISREG(mode)) {
		if ((dip->i_di.di_flags & GFS2_DIF_INHERIT_JDATA) ||
		    gfs2_tune_get(sdp, gt_new_files_jdata))
794
			di->di_flags |= cpu_to_be32(GFS2_DIF_JDATA);
D
David Teigland 已提交
795
	} else if (S_ISDIR(mode)) {
796 797
		di->di_flags |= cpu_to_be32(dip->i_di.di_flags &
					    GFS2_DIF_INHERIT_JDATA);
D
David Teigland 已提交
798 799
	}

800
	di->__pad1 = 0;
801
	di->di_payload_format = cpu_to_be32(S_ISDIR(mode) ? GFS2_FORMAT_DE : 0);
802
	di->di_height = 0;
803 804
	di->__pad2 = 0;
	di->__pad3 = 0;
805 806
	di->di_depth = 0;
	di->di_entries = 0;
807
	memset(&di->__pad4, 0, sizeof(di->__pad4));
808
	di->di_eattr = 0;
809 810 811
	di->di_atime_nsec = cpu_to_be32(tv.tv_nsec);
	di->di_mtime_nsec = cpu_to_be32(tv.tv_nsec);
	di->di_ctime_nsec = cpu_to_be32(tv.tv_nsec);
812
	memset(&di->di_reserved, 0, sizeof(di->di_reserved));
813 814
	
	set_buffer_uptodate(dibh);
815

816
	*bhp = dibh;
D
David Teigland 已提交
817 818 819
}

static int make_dinode(struct gfs2_inode *dip, struct gfs2_glock *gl,
A
Al Viro 已提交
820
		       unsigned int mode, const struct gfs2_inum_host *inum,
821
		       const u64 *generation, dev_t dev, struct buffer_head **bhp)
D
David Teigland 已提交
822
{
823
	struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
D
David Teigland 已提交
824 825 826 827
	unsigned int uid, gid;
	int error;

	munge_mode_uid_gid(dip, &mode, &uid, &gid);
828 829
	if (!gfs2_alloc_get(dip))
		return -ENOMEM;
D
David Teigland 已提交
830 831 832 833 834 835 836 837 838

	error = gfs2_quota_lock(dip, uid, gid);
	if (error)
		goto out;

	error = gfs2_quota_check(dip, uid, gid);
	if (error)
		goto out_quota;

839
	error = gfs2_trans_begin(sdp, RES_DINODE + RES_QUOTA, 0);
D
David Teigland 已提交
840 841 842
	if (error)
		goto out_quota;

843
	init_dinode(dip, gl, inum, mode, uid, gid, generation, dev, bhp);
D
David Teigland 已提交
844 845 846
	gfs2_quota_change(dip, +1, uid, gid);
	gfs2_trans_end(sdp);

847
out_quota:
D
David Teigland 已提交
848
	gfs2_quota_unlock(dip);
849
out:
D
David Teigland 已提交
850 851 852 853
	gfs2_alloc_put(dip);
	return error;
}

854 855
static int link_dinode(struct gfs2_inode *dip, const struct qstr *name,
		       struct gfs2_inode *ip)
D
David Teigland 已提交
856
{
857
	struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
D
David Teigland 已提交
858 859 860 861 862 863
	struct gfs2_alloc *al;
	int alloc_required;
	struct buffer_head *dibh;
	int error;

	al = gfs2_alloc_get(dip);
864 865
	if (!al)
		return -ENOMEM;
D
David Teigland 已提交
866 867 868 869 870

	error = gfs2_quota_lock(dip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
	if (error)
		goto fail;

871
	error = alloc_required = gfs2_diradd_alloc_required(&dip->i_inode, name);
872
	if (alloc_required < 0)
B
Bob Peterson 已提交
873
		goto fail_quota_locks;
D
David Teigland 已提交
874
	if (alloc_required) {
875
		error = gfs2_quota_check(dip, dip->i_inode.i_uid, dip->i_inode.i_gid);
D
David Teigland 已提交
876 877 878 879 880 881 882 883 884
		if (error)
			goto fail_quota_locks;

		al->al_requested = sdp->sd_max_dirres;

		error = gfs2_inplace_reserve(dip);
		if (error)
			goto fail_quota_locks;

885
		error = gfs2_trans_begin(sdp, sdp->sd_max_dirres +
886
					 al->al_rgd->rd_length +
887
					 2 * RES_DINODE +
D
David Teigland 已提交
888 889 890 891
					 RES_STATFS + RES_QUOTA, 0);
		if (error)
			goto fail_ipreserv;
	} else {
892
		error = gfs2_trans_begin(sdp, RES_LEAF + 2 * RES_DINODE, 0);
D
David Teigland 已提交
893 894 895 896
		if (error)
			goto fail_quota_locks;
	}

897
	error = gfs2_dir_add(&dip->i_inode, name, ip, IF2DT(ip->i_inode.i_mode));
D
David Teigland 已提交
898 899 900 901 902 903
	if (error)
		goto fail_end_trans;

	error = gfs2_meta_inode_buffer(ip, &dibh);
	if (error)
		goto fail_end_trans;
904
	ip->i_inode.i_nlink = 1;
905
	gfs2_trans_add_bh(ip->i_gl, dibh, 1);
906
	gfs2_dinode_out(ip, dibh->b_data);
D
David Teigland 已提交
907 908 909
	brelse(dibh);
	return 0;

910
fail_end_trans:
D
David Teigland 已提交
911 912
	gfs2_trans_end(sdp);

913
fail_ipreserv:
914
	if (dip->i_alloc->al_rgd)
D
David Teigland 已提交
915 916
		gfs2_inplace_release(dip);

917
fail_quota_locks:
D
David Teigland 已提交
918 919
	gfs2_quota_unlock(dip);

920
fail:
D
David Teigland 已提交
921 922 923 924
	gfs2_alloc_put(dip);
	return error;
}

925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957
static int gfs2_security_init(struct gfs2_inode *dip, struct gfs2_inode *ip)
{
	int err;
	size_t len;
	void *value;
	char *name;
	struct gfs2_ea_request er;

	err = security_inode_init_security(&ip->i_inode, &dip->i_inode,
					   &name, &value, &len);

	if (err) {
		if (err == -EOPNOTSUPP)
			return 0;
		return err;
	}

	memset(&er, 0, sizeof(struct gfs2_ea_request));

	er.er_type = GFS2_EATYPE_SECURITY;
	er.er_name = name;
	er.er_data = value;
	er.er_name_len = strlen(name);
	er.er_data_len = len;

	err = gfs2_ea_set_i(ip, &er);

	kfree(value);
	kfree(name);

	return err;
}

D
David Teigland 已提交
958 959 960 961 962 963 964 965 966
/**
 * gfs2_createi - Create a new inode
 * @ghs: An array of two holders
 * @name: The name of the new file
 * @mode: the permissions on the new inode
 *
 * @ghs[0] is an initialized holder for the directory
 * @ghs[1] is the holder for the inode lock
 *
967
 * If the return value is not NULL, the glocks on both the directory and the new
D
David Teigland 已提交
968 969 970
 * file are held.  A transaction has been started and an inplace reservation
 * is held, as well.
 *
971
 * Returns: An inode
D
David Teigland 已提交
972 973
 */

974
struct inode *gfs2_createi(struct gfs2_holder *ghs, const struct qstr *name,
975
			   unsigned int mode, dev_t dev)
D
David Teigland 已提交
976
{
977
	struct inode *inode = NULL;
978
	struct gfs2_inode *dip = ghs->gh_gl->gl_object;
979 980
	struct inode *dir = &dip->i_inode;
	struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
981
	struct gfs2_inum_host inum = { .no_addr = 0, .no_formal_ino = 0 };
D
David Teigland 已提交
982
	int error;
S
Steven Whitehouse 已提交
983
	u64 generation;
984
	struct buffer_head *bh = NULL;
D
David Teigland 已提交
985 986

	if (!name->len || name->len > GFS2_FNAMESIZE)
987
		return ERR_PTR(-ENAMETOOLONG);
D
David Teigland 已提交
988 989 990 991 992 993 994 995 996 997

	gfs2_holder_reinit(LM_ST_EXCLUSIVE, 0, ghs);
	error = gfs2_glock_nq(ghs);
	if (error)
		goto fail;

	error = create_ok(dip, name, mode);
	if (error)
		goto fail_gunlock;

998
	error = pick_formal_ino(sdp, &inum.no_formal_ino);
D
David Teigland 已提交
999 1000 1001
	if (error)
		goto fail_gunlock;

1002
	error = alloc_dinode(dip, &inum.no_addr, &generation);
D
David Teigland 已提交
1003 1004 1005
	if (error)
		goto fail_gunlock;

1006 1007 1008 1009
	error = gfs2_glock_nq_num(sdp, inum.no_addr, &gfs2_inode_glops,
				  LM_ST_EXCLUSIVE, GL_SKIP, ghs + 1);
	if (error)
		goto fail_gunlock;
D
David Teigland 已提交
1010

1011
	error = make_dinode(dip, ghs[1].gh_gl, mode, &inum, &generation, dev, &bh);
D
David Teigland 已提交
1012 1013 1014
	if (error)
		goto fail_gunlock2;

1015 1016
	inode = gfs2_inode_lookup(dir->i_sb, IF2DT(mode),
					inum.no_addr,
1017
					inum.no_formal_ino, 0);
1018
	if (IS_ERR(inode))
D
David Teigland 已提交
1019 1020
		goto fail_gunlock2;

1021
	error = gfs2_inode_refresh(GFS2_I(inode));
D
David Teigland 已提交
1022
	if (error)
1023
		goto fail_gunlock2;
D
David Teigland 已提交
1024

1025
	error = gfs2_acl_create(dip, GFS2_I(inode));
D
David Teigland 已提交
1026
	if (error)
1027
		goto fail_gunlock2;
D
David Teigland 已提交
1028

1029 1030
	error = gfs2_security_init(dip, GFS2_I(inode));
	if (error)
1031
		goto fail_gunlock2;
1032

1033
	error = link_dinode(dip, name, GFS2_I(inode));
D
David Teigland 已提交
1034
	if (error)
1035
		goto fail_gunlock2;
D
David Teigland 已提交
1036

1037 1038
	if (bh)
		brelse(bh);
1039
	return inode;
D
David Teigland 已提交
1040

1041
fail_gunlock2:
D
David Teigland 已提交
1042
	gfs2_glock_dq_uninit(ghs + 1);
1043
	if (inode && !IS_ERR(inode))
1044
		iput(inode);
1045
fail_gunlock:
D
David Teigland 已提交
1046
	gfs2_glock_dq(ghs);
1047
fail:
1048 1049
	if (bh)
		brelse(bh);
1050
	return ERR_PTR(error);
D
David Teigland 已提交
1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063
}

/**
 * gfs2_rmdiri - Remove a directory
 * @dip: The parent directory of the directory to be removed
 * @name: The name of the directory to be removed
 * @ip: The GFS2 inode of the directory to be removed
 *
 * Assumes Glocks on dip and ip are held
 *
 * Returns: errno
 */

1064 1065
int gfs2_rmdiri(struct gfs2_inode *dip, const struct qstr *name,
		struct gfs2_inode *ip)
D
David Teigland 已提交
1066 1067 1068 1069 1070 1071
{
	struct qstr dotname;
	int error;

	if (ip->i_di.di_entries != 2) {
		if (gfs2_consist_inode(ip))
1072
			gfs2_dinode_print(ip);
D
David Teigland 已提交
1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083
		return -EIO;
	}

	error = gfs2_dir_del(dip, name);
	if (error)
		return error;

	error = gfs2_change_nlink(dip, -1);
	if (error)
		return error;

1084
	gfs2_str2qstr(&dotname, ".");
D
David Teigland 已提交
1085 1086 1087 1088
	error = gfs2_dir_del(ip, &dotname);
	if (error)
		return error;

1089
	gfs2_str2qstr(&dotname, "..");
D
David Teigland 已提交
1090 1091 1092 1093
	error = gfs2_dir_del(ip, &dotname);
	if (error)
		return error;

1094 1095 1096 1097 1098 1099
	/* It looks odd, but it really should be done twice */
	error = gfs2_change_nlink(ip, -1);
	if (error)
		return error;

	error = gfs2_change_nlink(ip, -1);
D
David Teigland 已提交
1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116
	if (error)
		return error;

	return error;
}

/*
 * gfs2_unlink_ok - check to see that a inode is still in a directory
 * @dip: the directory
 * @name: the name of the file
 * @ip: the inode
 *
 * Assumes that the lock on (at least) @dip is held.
 *
 * Returns: 0 if the parent/child relationship is correct, errno if it isn't
 */

1117
int gfs2_unlink_ok(struct gfs2_inode *dip, const struct qstr *name,
1118
		   const struct gfs2_inode *ip)
D
David Teigland 已提交
1119 1120 1121
{
	int error;

1122
	if (IS_IMMUTABLE(&ip->i_inode) || IS_APPEND(&ip->i_inode))
D
David Teigland 已提交
1123 1124
		return -EPERM;

1125
	if ((dip->i_inode.i_mode & S_ISVTX) &&
1126 1127
	    dip->i_inode.i_uid != current_fsuid() &&
	    ip->i_inode.i_uid != current_fsuid() && !capable(CAP_FOWNER))
D
David Teigland 已提交
1128 1129
		return -EPERM;

1130
	if (IS_APPEND(&dip->i_inode))
D
David Teigland 已提交
1131 1132
		return -EPERM;

M
Miklos Szeredi 已提交
1133
	error = gfs2_permission(&dip->i_inode, MAY_WRITE | MAY_EXEC);
D
David Teigland 已提交
1134 1135 1136
	if (error)
		return error;

1137
	error = gfs2_dir_check(&dip->i_inode, name, ip);
D
David Teigland 已提交
1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162
	if (error)
		return error;

	return 0;
}

/**
 * gfs2_readlinki - return the contents of a symlink
 * @ip: the symlink's inode
 * @buf: a pointer to the buffer to be filled
 * @len: a pointer to the length of @buf
 *
 * If @buf is too small, a piece of memory is kmalloc()ed and needs
 * to be freed by the caller.
 *
 * Returns: errno
 */

int gfs2_readlinki(struct gfs2_inode *ip, char **buf, unsigned int *len)
{
	struct gfs2_holder i_gh;
	struct buffer_head *dibh;
	unsigned int x;
	int error;

1163 1164
	gfs2_holder_init(ip->i_gl, LM_ST_SHARED, 0, &i_gh);
	error = gfs2_glock_nq(&i_gh);
D
David Teigland 已提交
1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181
	if (error) {
		gfs2_holder_uninit(&i_gh);
		return error;
	}

	if (!ip->i_di.di_size) {
		gfs2_consist_inode(ip);
		error = -EIO;
		goto out;
	}

	error = gfs2_meta_inode_buffer(ip, &dibh);
	if (error)
		goto out;

	x = ip->i_di.di_size + 1;
	if (x > *len) {
J
Josef Bacik 已提交
1182
		*buf = kmalloc(x, GFP_NOFS);
D
David Teigland 已提交
1183 1184 1185 1186 1187 1188 1189 1190 1191
		if (!*buf) {
			error = -ENOMEM;
			goto out_brelse;
		}
	}

	memcpy(*buf, dibh->b_data + sizeof(struct gfs2_dinode), x);
	*len = x;

1192
out_brelse:
D
David Teigland 已提交
1193
	brelse(dibh);
1194
out:
D
David Teigland 已提交
1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206
	gfs2_glock_dq_uninit(&i_gh);
	return error;
}

static int
__gfs2_setattr_simple(struct gfs2_inode *ip, struct iattr *attr)
{
	struct buffer_head *dibh;
	int error;

	error = gfs2_meta_inode_buffer(ip, &dibh);
	if (!error) {
1207 1208
		error = inode_setattr(&ip->i_inode, attr);
		gfs2_assert_warn(GFS2_SB(&ip->i_inode), !error);
1209
		gfs2_trans_add_bh(ip->i_gl, dibh, 1);
1210
		gfs2_dinode_out(ip, dibh->b_data);
D
David Teigland 已提交
1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229
		brelse(dibh);
	}
	return error;
}

/**
 * gfs2_setattr_simple -
 * @ip:
 * @attr:
 *
 * Called with a reference on the vnode.
 *
 * Returns: errno
 */

int gfs2_setattr_simple(struct gfs2_inode *ip, struct iattr *attr)
{
	int error;

1230
	if (current->journal_info)
D
David Teigland 已提交
1231 1232
		return __gfs2_setattr_simple(ip, attr);

1233
	error = gfs2_trans_begin(GFS2_SB(&ip->i_inode), RES_DINODE, 0);
D
David Teigland 已提交
1234 1235 1236 1237
	if (error)
		return error;

	error = __gfs2_setattr_simple(ip, attr);
1238
	gfs2_trans_end(GFS2_SB(&ip->i_inode));
D
David Teigland 已提交
1239 1240 1241
	return error;
}

1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258
void gfs2_dinode_out(const struct gfs2_inode *ip, void *buf)
{
	const struct gfs2_dinode_host *di = &ip->i_di;
	struct gfs2_dinode *str = buf;

	str->di_header.mh_magic = cpu_to_be32(GFS2_MAGIC);
	str->di_header.mh_type = cpu_to_be32(GFS2_METATYPE_DI);
	str->di_header.__pad0 = 0;
	str->di_header.mh_format = cpu_to_be32(GFS2_FORMAT_DI);
	str->di_header.__pad1 = 0;
	str->di_num.no_addr = cpu_to_be64(ip->i_no_addr);
	str->di_num.no_formal_ino = cpu_to_be64(ip->i_no_formal_ino);
	str->di_mode = cpu_to_be32(ip->i_inode.i_mode);
	str->di_uid = cpu_to_be32(ip->i_inode.i_uid);
	str->di_gid = cpu_to_be32(ip->i_inode.i_gid);
	str->di_nlink = cpu_to_be32(ip->i_inode.i_nlink);
	str->di_size = cpu_to_be64(di->di_size);
1259
	str->di_blocks = cpu_to_be64(gfs2_get_inode_blocks(&ip->i_inode));
1260 1261 1262 1263
	str->di_atime = cpu_to_be64(ip->i_inode.i_atime.tv_sec);
	str->di_mtime = cpu_to_be64(ip->i_inode.i_mtime.tv_sec);
	str->di_ctime = cpu_to_be64(ip->i_inode.i_ctime.tv_sec);

1264 1265
	str->di_goal_meta = cpu_to_be64(ip->i_goal);
	str->di_goal_data = cpu_to_be64(ip->i_goal);
1266 1267 1268
	str->di_generation = cpu_to_be64(di->di_generation);

	str->di_flags = cpu_to_be32(di->di_flags);
1269
	str->di_height = cpu_to_be16(ip->i_height);
1270 1271 1272
	str->di_payload_format = cpu_to_be32(S_ISDIR(ip->i_inode.i_mode) &&
					     !(ip->i_di.di_flags & GFS2_DIF_EXHASH) ?
					     GFS2_FORMAT_DE : 0);
1273
	str->di_depth = cpu_to_be16(ip->i_depth);
1274 1275 1276
	str->di_entries = cpu_to_be32(di->di_entries);

	str->di_eattr = cpu_to_be64(di->di_eattr);
1277 1278 1279
	str->di_atime_nsec = cpu_to_be32(ip->i_inode.i_atime.tv_nsec);
	str->di_mtime_nsec = cpu_to_be32(ip->i_inode.i_mtime.tv_nsec);
	str->di_ctime_nsec = cpu_to_be32(ip->i_inode.i_ctime.tv_nsec);
1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290
}

void gfs2_dinode_print(const struct gfs2_inode *ip)
{
	const struct gfs2_dinode_host *di = &ip->i_di;

	printk(KERN_INFO "  no_formal_ino = %llu\n",
	       (unsigned long long)ip->i_no_formal_ino);
	printk(KERN_INFO "  no_addr = %llu\n",
	       (unsigned long long)ip->i_no_addr);
	printk(KERN_INFO "  di_size = %llu\n", (unsigned long long)di->di_size);
1291 1292
	printk(KERN_INFO "  blocks = %llu\n",
	       (unsigned long long)gfs2_get_inode_blocks(&ip->i_inode));
1293 1294
	printk(KERN_INFO "  i_goal = %llu\n",
	       (unsigned long long)ip->i_goal);
1295
	printk(KERN_INFO "  di_flags = 0x%.8X\n", di->di_flags);
B
Bob Peterson 已提交
1296
	printk(KERN_INFO "  i_height = %u\n", ip->i_height);
1297
	printk(KERN_INFO "  i_depth = %u\n", ip->i_depth);
1298 1299 1300 1301 1302
	printk(KERN_INFO "  di_entries = %u\n", di->di_entries);
	printk(KERN_INFO "  di_eattr = %llu\n",
	       (unsigned long long)di->di_eattr);
}