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 38
#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 "ops_inode.h"
#include "quota.h"
#include "rgrp.h"
#include "trans.h"
39
#include "util.h"
D
David Teigland 已提交
40

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

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

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

54 55 56 57
	return 0;
}

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

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

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

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

80 81 82 83 84 85 86 87 88 89
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;

90
	if (ip->i_no_addr == data->no_addr && test_bit(GIF_USER, &ip->i_flags)){
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
		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;
109
	set_bit(GIF_USER, &ip->i_flags);
110 111 112 113 114 115 116 117 118 119 120 121 122 123
	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);
}

124 125 126 127 128 129 130 131 132 133 134 135
/**
 * 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)
{
136
	struct gfs2_sbd *sdp = GFS2_SB(inode);
137 138 139 140
	umode_t mode = inode->i_mode;

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

	unlock_new_inode(inode);
}

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

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

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

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

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

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

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

203
		set_bit(GIF_INVALID, &ip->i_flags);
204 205 206
		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 已提交
207
		ip->i_iopen_gh.gh_gl->gl_object = ip;
D
David Teigland 已提交
208

209
		gfs2_glock_put(io_gl);
210

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

		inode->i_mode = DT2IF(type);

216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231
		/*
		 * 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);
		}

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

235
gfs2_nfsbypass:
D
David Teigland 已提交
236
	return inode;
237 238
fail_glock:
	gfs2_glock_dq(&ip->i_iopen_gh);
239 240 241 242 243 244
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 已提交
245
	iget_failed(inode);
246
	return ERR_PTR(error);
D
David Teigland 已提交
247 248
}

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

256 257
	if (unlikely(ip->i_no_addr != be64_to_cpu(str->di_num.no_addr)))
		goto corrupt;
258
	ip->i_no_formal_ino = be64_to_cpu(str->di_num.no_formal_ino);
259
	ip->i_inode.i_mode = be32_to_cpu(str->di_mode);
260
	ip->i_inode.i_rdev = 0;
261
	switch (ip->i_inode.i_mode & S_IFMT) {
262 263 264 265 266 267 268
	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;
	};

269 270
	ip->i_inode.i_uid = be32_to_cpu(str->di_uid);
	ip->i_inode.i_gid = be32_to_cpu(str->di_gid);
271 272 273 274 275 276
	/*
	 * 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);
277
	di->di_size = be64_to_cpu(str->di_size);
278
	i_size_write(&ip->i_inode, di->di_size);
279
	gfs2_set_inode_blocks(&ip->i_inode, be64_to_cpu(str->di_blocks));
280 281 282 283
	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;
284
	ip->i_inode.i_mtime.tv_sec = be64_to_cpu(str->di_mtime);
285
	ip->i_inode.i_mtime.tv_nsec = be32_to_cpu(str->di_mtime_nsec);
286
	ip->i_inode.i_ctime.tv_sec = be64_to_cpu(str->di_ctime);
287
	ip->i_inode.i_ctime.tv_nsec = be32_to_cpu(str->di_ctime_nsec);
288

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

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

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

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

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

D
David Teigland 已提交
316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331
/**
 * 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;

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

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

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

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

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

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

	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;

369
	rgd = gfs2_blk2rgrpd(sdp, ip->i_no_addr);
D
David Teigland 已提交
370 371 372 373 374 375 376 377 378 379 380
	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;

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

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

	gfs2_free_di(rgd, ip);

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

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

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

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

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

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

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

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

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

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

447 448 449
	return error;
}

450 451 452
struct inode *gfs2_lookup_simple(struct inode *dip, const char *name)
{
	struct qstr qstr;
453
	struct inode *inode;
454
	gfs2_str2qstr(&qstr, name);
455
	inode = gfs2_lookupi(dip, &qstr, 1);
456 457 458 459 460 461 462 463 464
	/* 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;
465 466 467
}


D
David Teigland 已提交
468 469 470 471 472 473 474
/**
 * 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
 *
475 476 477 478
 * 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 已提交
479 480 481 482
 *
 * Returns: errno
 */

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

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

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

503
	if (gfs2_glock_is_locked_by_me(dip->i_gl) == NULL) {
504 505 506 507 508
		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 已提交
509 510

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

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

527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542
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);
}

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

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

	error = gfs2_meta_inode_buffer(ip, &bh);
	if (error) {
557
		mutex_unlock(&sdp->sd_inum_mutex);
D
David Teigland 已提交
558 559 560 561 562 563 564 565 566
		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--;
567
		gfs2_trans_add_bh(ip->i_gl, bh, 1);
D
David Teigland 已提交
568 569 570
		gfs2_inum_range_out(&ir,
				    bh->b_data + sizeof(struct gfs2_dinode));
		brelse(bh);
571
		mutex_unlock(&sdp->sd_inum_mutex);
D
David Teigland 已提交
572 573 574 575 576 577
		gfs2_trans_end(sdp);
		return 0;
	}

	brelse(bh);

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

	return 1;
}

584
static int pick_formal_ino_2(struct gfs2_sbd *sdp, u64 *formal_ino)
D
David Teigland 已提交
585
{
586 587
	struct gfs2_inode *ip = GFS2_I(sdp->sd_ir_inode);
	struct gfs2_inode *m_ip = GFS2_I(sdp->sd_inum_inode);
D
David Teigland 已提交
588 589
	struct gfs2_holder gh;
	struct buffer_head *bh;
590
	struct gfs2_inum_range_host ir;
D
David Teigland 已提交
591 592 593 594 595 596 597 598 599
	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;
600
	mutex_lock(&sdp->sd_inum_mutex);
D
David Teigland 已提交
601 602 603 604

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

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

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

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

A
Al Viro 已提交
617 618
		z = *(__be64 *)(m_bh->b_data + sizeof(struct gfs2_dinode));
		x = y = be64_to_cpu(z);
D
David Teigland 已提交
619 620 621 622 623
		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 已提交
624
		z = cpu_to_be64(x);
625
		gfs2_trans_add_bh(m_ip->i_gl, m_bh, 1);
A
Al Viro 已提交
626
		*(__be64 *)(m_bh->b_data + sizeof(struct gfs2_dinode)) = z;
D
David Teigland 已提交
627 628 629 630 631 632 633

		brelse(m_bh);
	}

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

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

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

647
static int pick_formal_ino(struct gfs2_sbd *sdp, u64 *inum)
D
David Teigland 已提交
648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668
{
	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
 */

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

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

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

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

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

	return 0;
}

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

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

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

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

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

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

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

	gfs2_trans_end(sdp);

S
Steven Whitehouse 已提交
743
out_ipreserv:
D
David Teigland 已提交
744
	gfs2_inplace_release(dip);
S
Steven Whitehouse 已提交
745
out:
D
David Teigland 已提交
746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761
	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 已提交
762
			const struct gfs2_inum_host *inum, unsigned int mode,
S
Steven Whitehouse 已提交
763
			unsigned int uid, unsigned int gid,
764
			const u64 *generation, dev_t dev, struct buffer_head **bhp)
D
David Teigland 已提交
765
{
766
	struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
767
	struct gfs2_dinode *di;
D
David Teigland 已提交
768
	struct buffer_head *dibh;
769
	struct timespec tv = CURRENT_TIME;
D
David Teigland 已提交
770 771

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

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

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

801
	di->__pad1 = 0;
802
	di->di_payload_format = cpu_to_be32(S_ISDIR(mode) ? GFS2_FORMAT_DE : 0);
803
	di->di_height = 0;
804 805
	di->__pad2 = 0;
	di->__pad3 = 0;
806 807
	di->di_depth = 0;
	di->di_entries = 0;
808
	memset(&di->__pad4, 0, sizeof(di->__pad4));
809
	di->di_eattr = 0;
810 811 812
	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);
813
	memset(&di->di_reserved, 0, sizeof(di->di_reserved));
814 815
	
	set_buffer_uptodate(dibh);
816

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

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

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

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

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

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

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

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

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

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

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

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

		al->al_requested = sdp->sd_max_dirres;

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

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

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

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

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

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

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

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

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 958
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 已提交
959 960 961 962 963 964 965 966 967
/**
 * 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
 *
968
 * If the return value is not NULL, the glocks on both the directory and the new
D
David Teigland 已提交
969 970 971
 * file are held.  A transaction has been started and an inplace reservation
 * is held, as well.
 *
972
 * Returns: An inode
D
David Teigland 已提交
973 974
 */

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

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

	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;

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

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

1007 1008 1009 1010
	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 已提交
1011

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

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

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

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

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

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

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

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

/**
 * 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
 */

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

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

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

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

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

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

1095 1096 1097 1098 1099 1100
	/* 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 已提交
1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117
	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
 */

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

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

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

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

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

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

1164 1165
	gfs2_holder_init(ip->i_gl, LM_ST_SHARED, 0, &i_gh);
	error = gfs2_glock_nq(&i_gh);
D
David Teigland 已提交
1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182
	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 已提交
1183
		*buf = kmalloc(x, GFP_NOFS);
D
David Teigland 已提交
1184 1185 1186 1187 1188 1189 1190 1191 1192
		if (!*buf) {
			error = -ENOMEM;
			goto out_brelse;
		}
	}

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

1193
out_brelse:
D
David Teigland 已提交
1194
	brelse(dibh);
1195
out:
D
David Teigland 已提交
1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207
	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) {
1208 1209
		error = inode_setattr(&ip->i_inode, attr);
		gfs2_assert_warn(GFS2_SB(&ip->i_inode), !error);
1210
		gfs2_trans_add_bh(ip->i_gl, dibh, 1);
1211
		gfs2_dinode_out(ip, dibh->b_data);
D
David Teigland 已提交
1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230
		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;

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

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

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

1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259
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);
1260
	str->di_blocks = cpu_to_be64(gfs2_get_inode_blocks(&ip->i_inode));
1261 1262 1263 1264
	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);

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

	str->di_flags = cpu_to_be32(di->di_flags);
1270
	str->di_height = cpu_to_be16(ip->i_height);
1271 1272 1273
	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);
1274
	str->di_depth = cpu_to_be16(ip->i_depth);
1275 1276 1277
	str->di_entries = cpu_to_be32(di->di_entries);

	str->di_eattr = cpu_to_be64(di->di_eattr);
1278 1279 1280
	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);
1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291
}

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