xattr.c 26.0 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
/*
 * linux/fs/reiserfs/xattr.c
 *
 * Copyright (c) 2002 by Jeff Mahoney, <jeffm@suse.com>
 *
 */

/*
 * In order to implement EA/ACLs in a clean, backwards compatible manner,
 * they are implemented as files in a "private" directory.
 * Each EA is in it's own file, with the directory layout like so (/ is assumed
 * to be relative to fs root). Inside the /.reiserfs_priv/xattrs directory,
 * directories named using the capital-hex form of the objectid and
 * generation number are used. Inside each directory are individual files
 * named with the name of the extended attribute.
 *
 * So, for objectid 12648430, we could have:
 * /.reiserfs_priv/xattrs/C0FFEE.0/system.posix_acl_access
 * /.reiserfs_priv/xattrs/C0FFEE.0/system.posix_acl_default
 * /.reiserfs_priv/xattrs/C0FFEE.0/user.Content-Type
 * .. or similar.
 *
 * The file contents are the text of the EA. The size is known based on the
 * stat data describing the file.
 *
 * In the case of system.posix_acl_access and system.posix_acl_default, since
 * these are special cases for filesystem ACLs, they are interpreted by the
 * kernel, in addition, they are negatively and positively cached and attached
 * to the inode so that unnecessary lookups are avoided.
30 31
 *
 * Locking works like so:
32 33
 * Directory components (xattr root, xattr dir) are protectd by their i_mutex.
 * The xattrs themselves are protected by the xattr_sem.
L
Linus Torvalds 已提交
34 35 36
 */

#include <linux/reiserfs_fs.h>
37
#include <linux/capability.h>
L
Linus Torvalds 已提交
38 39 40 41 42 43 44 45 46 47
#include <linux/dcache.h>
#include <linux/namei.h>
#include <linux/errno.h>
#include <linux/fs.h>
#include <linux/file.h>
#include <linux/pagemap.h>
#include <linux/xattr.h>
#include <linux/reiserfs_xattr.h>
#include <linux/reiserfs_acl.h>
#include <asm/uaccess.h>
48
#include <net/checksum.h>
L
Linus Torvalds 已提交
49 50
#include <linux/smp_lock.h>
#include <linux/stat.h>
51
#include <linux/quotaops.h>
L
Linus Torvalds 已提交
52 53 54 55 56

#define PRIVROOT_NAME ".reiserfs_priv"
#define XAROOT_NAME   "xattrs"


57 58 59 60
/* Helpers for inode ops. We do this so that we don't have all the VFS
 * overhead and also for proper i_mutex annotation.
 * dir->i_mutex must be held for all of them. */
static int xattr_create(struct inode *dir, struct dentry *dentry, int mode)
L
Linus Torvalds 已提交
61
{
62
	BUG_ON(!mutex_is_locked(&dir->i_mutex));
63
	vfs_dq_init(dir);
64 65
	return dir->i_op->create(dir, dentry, mode, NULL);
}
66

67 68 69
static int xattr_mkdir(struct inode *dir, struct dentry *dentry, int mode)
{
	BUG_ON(!mutex_is_locked(&dir->i_mutex));
70
	vfs_dq_init(dir);
71 72
	return dir->i_op->mkdir(dir, dentry, mode);
}
73

74 75 76 77 78 79 80 81
/* We use I_MUTEX_CHILD here to silence lockdep. It's safe because xattr
 * mutation ops aren't called during rename or splace, which are the
 * only other users of I_MUTEX_CHILD. It violates the ordering, but that's
 * better than allocating another subclass just for this code. */
static int xattr_unlink(struct inode *dir, struct dentry *dentry)
{
	int error;
	BUG_ON(!mutex_is_locked(&dir->i_mutex));
82
	vfs_dq_init(dir);
83

84 85 86 87 88 89 90 91 92 93 94 95 96
	mutex_lock_nested(&dentry->d_inode->i_mutex, I_MUTEX_CHILD);
	error = dir->i_op->unlink(dir, dentry);
	mutex_unlock(&dentry->d_inode->i_mutex);

	if (!error)
		d_delete(dentry);
	return error;
}

static int xattr_rmdir(struct inode *dir, struct dentry *dentry)
{
	int error;
	BUG_ON(!mutex_is_locked(&dir->i_mutex));
97
	vfs_dq_init(dir);
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124

	mutex_lock_nested(&dentry->d_inode->i_mutex, I_MUTEX_CHILD);
	dentry_unhash(dentry);
	error = dir->i_op->rmdir(dir, dentry);
	if (!error)
		dentry->d_inode->i_flags |= S_DEAD;
	mutex_unlock(&dentry->d_inode->i_mutex);
	if (!error)
		d_delete(dentry);
	dput(dentry);

	return error;
}

#define xattr_may_create(flags)	(!flags || flags & XATTR_CREATE)

/* Returns and possibly creates the xattr dir. */
static struct dentry *lookup_or_create_dir(struct dentry *parent,
					    const char *name, int flags)
{
	struct dentry *dentry;
	BUG_ON(!parent);

	dentry = lookup_one_len(name, parent, strlen(name));
	if (IS_ERR(dentry))
		return dentry;
	else if (!dentry->d_inode) {
125
		int err = -ENODATA;
126 127 128 129 130 131 132 133

		if (xattr_may_create(flags)) {
			mutex_lock_nested(&parent->d_inode->i_mutex,
					  I_MUTEX_XATTR);
			err = xattr_mkdir(parent->d_inode, dentry, 0700);
			mutex_unlock(&parent->d_inode->i_mutex);
		}

134
		if (err) {
135 136
			dput(dentry);
			dentry = ERR_PTR(err);
137
		}
138 139
	}

140 141 142 143 144 145 146 147 148
	return dentry;
}

static struct dentry *open_xa_root(struct super_block *sb, int flags)
{
	struct dentry *privroot = REISERFS_SB(sb)->priv_root;
	if (!privroot)
		return ERR_PTR(-ENODATA);
	return lookup_or_create_dir(privroot, XAROOT_NAME, flags);
L
Linus Torvalds 已提交
149 150
}

151
static struct dentry *open_xa_dir(const struct inode *inode, int flags)
L
Linus Torvalds 已提交
152
{
153 154 155
	struct dentry *xaroot, *xadir;
	char namebuf[17];

156
	xaroot = open_xa_root(inode->i_sb, flags);
157
	if (IS_ERR(xaroot))
158 159 160 161 162 163
		return xaroot;

	snprintf(namebuf, sizeof(namebuf), "%X.%X",
		 le32_to_cpu(INODE_PKEY(inode)->k_objectid),
		 inode->i_generation);

164
	xadir = lookup_or_create_dir(xaroot, namebuf, flags);
165 166
	dput(xaroot);
	return xadir;
167

L
Linus Torvalds 已提交
168 169
}

170 171 172
/* The following are side effects of other operations that aren't explicitly
 * modifying extended attributes. This includes operations such as permissions
 * or ownership changes, object deletions, etc. */
173 174 175 176 177
struct reiserfs_dentry_buf {
	struct dentry *xadir;
	int count;
	struct dentry *dentries[8];
};
178

179
static int
180 181
fill_with_dentries(void *buf, const char *name, int namelen, loff_t offset,
		    u64 ino, unsigned int d_type)
182
{
183
	struct reiserfs_dentry_buf *dbuf = buf;
184
	struct dentry *dentry;
185

186 187
	if (dbuf->count == ARRAY_SIZE(dbuf->dentries))
		return -ENOSPC;
188

189 190 191
	if (name[0] == '.' && (name[1] == '\0' ||
			       (name[1] == '.' && name[2] == '\0')))
		return 0;
192

193
	dentry = lookup_one_len(name, dbuf->xadir, namelen);
194
	if (IS_ERR(dentry)) {
195
		return PTR_ERR(dentry);
196
	} else if (!dentry->d_inode) {
197 198 199 200 201 202 203
		/* A directory entry exists, but no file? */
		reiserfs_error(dentry->d_sb, "xattr-20003",
			       "Corrupted directory: xattr %s listed but "
			       "not found for file %s.\n",
			       dentry->d_name.name, dbuf->xadir->d_name.name);
		dput(dentry);
		return -EIO;
204
	}
L
Linus Torvalds 已提交
205

206 207
	dbuf->dentries[dbuf->count++] = dentry;
	return 0;
L
Linus Torvalds 已提交
208 209
}

210 211
static void
cleanup_dentry_buf(struct reiserfs_dentry_buf *buf)
L
Linus Torvalds 已提交
212
{
213 214 215 216
	int i;
	for (i = 0; i < buf->count; i++)
		if (buf->dentries[i])
			dput(buf->dentries[i]);
217 218
}

219 220 221
static int reiserfs_for_each_xattr(struct inode *inode,
				   int (*action)(struct dentry *, void *),
				   void *data)
222
{
223 224 225 226 227 228
	struct dentry *dir;
	int i, err = 0;
	loff_t pos = 0;
	struct reiserfs_dentry_buf buf = {
		.count = 0,
	};
L
Linus Torvalds 已提交
229

230 231 232
	/* Skip out, an xattr has no xattrs associated with it */
	if (IS_PRIVATE(inode) || get_inode_sd_version(inode) == STAT_DATA_V1)
		return 0;
L
Linus Torvalds 已提交
233

234
	dir = open_xa_dir(inode, XATTR_REPLACE);
235 236 237 238
	if (IS_ERR(dir)) {
		err = PTR_ERR(dir);
		goto out;
	} else if (!dir->d_inode) {
239 240
		err = 0;
		goto out_dir;
241
	}
L
Linus Torvalds 已提交
242

243
	mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_XATTR);
244 245 246 247
	buf.xadir = dir;
	err = reiserfs_readdir_dentry(dir, &buf, fill_with_dentries, &pos);
	while ((err == 0 || err == -ENOSPC) && buf.count) {
		err = 0;
L
Linus Torvalds 已提交
248

249 250 251
		for (i = 0; i < buf.count && buf.dentries[i]; i++) {
			int lerr = 0;
			struct dentry *dentry = buf.dentries[i];
L
Linus Torvalds 已提交
252

253 254
			if (err == 0 && !S_ISDIR(dentry->d_inode->i_mode))
				lerr = action(dentry, data);
L
Linus Torvalds 已提交
255

256 257 258
			dput(dentry);
			buf.dentries[i] = NULL;
			err = lerr ?: err;
259
		}
260 261 262 263
		buf.count = 0;
		if (!err)
			err = reiserfs_readdir_dentry(dir, &buf,
						      fill_with_dentries, &pos);
264
	}
265
	mutex_unlock(&dir->d_inode->i_mutex);
L
Linus Torvalds 已提交
266

267 268
	/* Clean up after a failed readdir */
	cleanup_dentry_buf(&buf);
L
Linus Torvalds 已提交
269

270
	if (!err) {
271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288
		/* We start a transaction here to avoid a ABBA situation
		 * between the xattr root's i_mutex and the journal lock.
		 * This doesn't incur much additional overhead since the
		 * new transaction will just nest inside the
		 * outer transaction. */
		int blocks = JOURNAL_PER_BALANCE_CNT * 2 + 2 +
			     4 * REISERFS_QUOTA_TRANS_BLOCKS(inode->i_sb);
		struct reiserfs_transaction_handle th;
		err = journal_begin(&th, inode->i_sb, blocks);
		if (!err) {
			int jerror;
			mutex_lock_nested(&dir->d_parent->d_inode->i_mutex,
					  I_MUTEX_XATTR);
			err = action(dir, data);
			jerror = journal_end(&th, inode->i_sb, blocks);
			mutex_unlock(&dir->d_parent->d_inode->i_mutex);
			err = jerror ?: err;
		}
289
	}
290 291
out_dir:
	dput(dir);
292
out:
293 294 295
	/* -ENODATA isn't an error */
	if (err == -ENODATA)
		err = 0;
296 297
	return err;
}
L
Linus Torvalds 已提交
298

299
static int delete_one_xattr(struct dentry *dentry, void *data)
300
{
301
	struct inode *dir = dentry->d_parent->d_inode;
L
Linus Torvalds 已提交
302

303 304 305
	/* This is the xattr dir, handle specially. */
	if (S_ISDIR(dentry->d_inode->i_mode))
		return xattr_rmdir(dir, dentry);
L
Linus Torvalds 已提交
306

307 308
	return xattr_unlink(dir, dentry);
}
309

310 311 312 313 314
static int chown_one_xattr(struct dentry *dentry, void *data)
{
	struct iattr *attrs = data;
	return reiserfs_setattr(dentry, attrs);
}
L
Linus Torvalds 已提交
315

316 317 318 319 320 321 322
/* No i_mutex, but the inode is unconnected. */
int reiserfs_delete_xattrs(struct inode *inode)
{
	int err = reiserfs_for_each_xattr(inode, delete_one_xattr, NULL);
	if (err)
		reiserfs_warning(inode->i_sb, "jdm-20004",
				 "Couldn't delete all xattrs (%d)\n", err);
323 324
	return err;
}
L
Linus Torvalds 已提交
325

326
/* inode->i_mutex: down */
327 328
int reiserfs_chown_xattrs(struct inode *inode, struct iattr *attrs)
{
329
	int err = reiserfs_for_each_xattr(inode, chown_one_xattr, attrs);
330 331 332
	if (err)
		reiserfs_warning(inode->i_sb, "jdm-20007",
				 "Couldn't chown all xattrs (%d)\n", err);
333
	return err;
L
Linus Torvalds 已提交
334 335
}

336 337 338 339
#ifdef CONFIG_REISERFS_FS_XATTR
/* Returns a dentry corresponding to a specific extended attribute file
 * for the inode. If flags allow, the file is created. Otherwise, a
 * valid or negative dentry, or an error is returned. */
340 341
static struct dentry *xattr_lookup(struct inode *inode, const char *name,
				    int flags)
L
Linus Torvalds 已提交
342
{
343 344 345 346
	struct dentry *xadir, *xafile;
	int err = 0;

	xadir = open_xa_dir(inode, flags);
347
	if (IS_ERR(xadir))
348 349 350 351
		return ERR_CAST(xadir);

	xafile = lookup_one_len(name, xadir, strlen(name));
	if (IS_ERR(xafile)) {
352 353
		err = PTR_ERR(xafile);
		goto out;
354
	}
355

356 357
	if (xafile->d_inode && (flags & XATTR_CREATE))
		err = -EEXIST;
358

359 360 361 362 363 364 365 366
	if (!xafile->d_inode) {
		err = -ENODATA;
		if (xattr_may_create(flags)) {
			mutex_lock_nested(&xadir->d_inode->i_mutex,
					  I_MUTEX_XATTR);
			err = xattr_create(xadir->d_inode, xafile,
					      0700|S_IFREG);
			mutex_unlock(&xadir->d_inode->i_mutex);
367 368 369
		}
	}

370 371
	if (err)
		dput(xafile);
372 373 374
out:
	dput(xadir);
	if (err)
375
		return ERR_PTR(err);
376
	return xafile;
L
Linus Torvalds 已提交
377 378 379
}

/* Internal operations on file data */
380
static inline void reiserfs_put_page(struct page *page)
L
Linus Torvalds 已提交
381
{
382 383
	kunmap(page);
	page_cache_release(page);
L
Linus Torvalds 已提交
384 385
}

386
static struct page *reiserfs_get_page(struct inode *dir, size_t n)
L
Linus Torvalds 已提交
387
{
388 389 390 391
	struct address_space *mapping = dir->i_mapping;
	struct page *page;
	/* We can deadlock if we try to free dentries,
	   and an unlink/rmdir has just occured - GFP_NOFS avoids this */
392
	mapping_set_gfp_mask(mapping, GFP_NOFS);
393
	page = read_mapping_page(mapping, n >> PAGE_CACHE_SHIFT, NULL);
394 395 396 397 398 399 400 401 402 403
	if (!IS_ERR(page)) {
		kmap(page);
		if (PageError(page))
			goto fail;
	}
	return page;

      fail:
	reiserfs_put_page(page);
	return ERR_PTR(-EIO);
L
Linus Torvalds 已提交
404 405
}

406
static inline __u32 xattr_hash(const char *msg, int len)
L
Linus Torvalds 已提交
407
{
408
	return csum_partial(msg, len, 0);
L
Linus Torvalds 已提交
409 410
}

V
Vladimir Saveliev 已提交
411 412 413 414 415
int reiserfs_commit_write(struct file *f, struct page *page,
			  unsigned from, unsigned to);
int reiserfs_prepare_write(struct file *f, struct page *page,
			   unsigned from, unsigned to);

416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454
static void update_ctime(struct inode *inode)
{
	struct timespec now = current_fs_time(inode->i_sb);
	if (hlist_unhashed(&inode->i_hash) || !inode->i_nlink ||
	    timespec_equal(&inode->i_ctime, &now))
		return;

	inode->i_ctime = CURRENT_TIME_SEC;
	mark_inode_dirty(inode);
}

static int lookup_and_delete_xattr(struct inode *inode, const char *name)
{
	int err = 0;
	struct dentry *dentry, *xadir;

	xadir = open_xa_dir(inode, XATTR_REPLACE);
	if (IS_ERR(xadir))
		return PTR_ERR(xadir);

	dentry = lookup_one_len(name, xadir, strlen(name));
	if (IS_ERR(dentry)) {
		err = PTR_ERR(dentry);
		goto out_dput;
	}

	if (dentry->d_inode) {
		mutex_lock_nested(&xadir->d_inode->i_mutex, I_MUTEX_XATTR);
		err = xattr_unlink(xadir->d_inode, dentry);
		mutex_unlock(&xadir->d_inode->i_mutex);
		update_ctime(inode);
	}

	dput(dentry);
out_dput:
	dput(xadir);
	return err;
}

V
Vladimir Saveliev 已提交
455

L
Linus Torvalds 已提交
456 457 458
/* Generic extended attribute operations that can be used by xa plugins */

/*
459
 * inode->i_mutex: down
L
Linus Torvalds 已提交
460 461
 */
int
J
Jeff Mahoney 已提交
462 463 464
reiserfs_xattr_set_handle(struct reiserfs_transaction_handle *th,
			  struct inode *inode, const char *name,
			  const void *buffer, size_t buffer_size, int flags)
L
Linus Torvalds 已提交
465
{
466
	int err = 0;
467
	struct dentry *dentry;
468 469 470 471
	struct page *page;
	char *data;
	size_t file_pos = 0;
	size_t buffer_pos = 0;
472
	size_t new_size;
473 474 475 476 477
	__u32 xahash = 0;

	if (get_inode_sd_version(inode) == STAT_DATA_V1)
		return -EOPNOTSUPP;

478
	if (!buffer)
479
		return lookup_and_delete_xattr(inode, name);
480

481 482 483
	dentry = xattr_lookup(inode, name, flags);
	if (IS_ERR(dentry))
		return PTR_ERR(dentry);
484

485
	down_write(&REISERFS_I(inode)->i_xattr_sem);
486

487
	xahash = xattr_hash(buffer, buffer_size);
488 489 490 491 492 493 494 495 496
	while (buffer_pos < buffer_size || buffer_pos == 0) {
		size_t chunk;
		size_t skip = 0;
		size_t page_offset = (file_pos & (PAGE_CACHE_SIZE - 1));
		if (buffer_size - buffer_pos > PAGE_CACHE_SIZE)
			chunk = PAGE_CACHE_SIZE;
		else
			chunk = buffer_size - buffer_pos;

497
		page = reiserfs_get_page(dentry->d_inode, file_pos);
498 499
		if (IS_ERR(page)) {
			err = PTR_ERR(page);
500
			goto out_unlock;
501 502 503 504 505 506 507 508 509 510 511 512 513 514 515
		}

		lock_page(page);
		data = page_address(page);

		if (file_pos == 0) {
			struct reiserfs_xattr_header *rxh;
			skip = file_pos = sizeof(struct reiserfs_xattr_header);
			if (chunk + skip > PAGE_CACHE_SIZE)
				chunk = PAGE_CACHE_SIZE - skip;
			rxh = (struct reiserfs_xattr_header *)data;
			rxh->h_magic = cpu_to_le32(REISERFS_XATTR_MAGIC);
			rxh->h_hash = cpu_to_le32(xahash);
		}

516
		err = reiserfs_prepare_write(NULL, page, page_offset,
V
Vladimir Saveliev 已提交
517
					    page_offset + chunk + skip);
518 519 520
		if (!err) {
			if (buffer)
				memcpy(data + skip, buffer + buffer_pos, chunk);
521 522 523
			err = reiserfs_commit_write(NULL, page, page_offset,
						    page_offset + chunk +
						    skip);
524 525 526 527 528 529 530 531 532 533
		}
		unlock_page(page);
		reiserfs_put_page(page);
		buffer_pos += chunk;
		file_pos += chunk;
		skip = 0;
		if (err || buffer_size == 0 || !buffer)
			break;
	}

534 535 536 537 538 539 540 541 542 543 544 545 546 547 548
	new_size = buffer_size + sizeof(struct reiserfs_xattr_header);
	if (!err && new_size < i_size_read(dentry->d_inode)) {
		struct iattr newattrs = {
			.ia_ctime = current_fs_time(inode->i_sb),
			.ia_size = buffer_size,
			.ia_valid = ATTR_SIZE | ATTR_CTIME,
		};
		mutex_lock_nested(&dentry->d_inode->i_mutex, I_MUTEX_XATTR);
		down_write(&dentry->d_inode->i_alloc_sem);
		err = reiserfs_setattr(dentry, &newattrs);
		up_write(&dentry->d_inode->i_alloc_sem);
		mutex_unlock(&dentry->d_inode->i_mutex);
	} else
		update_ctime(inode);
out_unlock:
549
	up_write(&REISERFS_I(inode)->i_xattr_sem);
550
	dput(dentry);
551 552
	return err;
}
553

J
Jeff Mahoney 已提交
554 555 556
/* We need to start a transaction to maintain lock ordering */
int reiserfs_xattr_set(struct inode *inode, const char *name,
		       const void *buffer, size_t buffer_size, int flags)
557
{
J
Jeff Mahoney 已提交
558 559 560 561 562 563 564 565 566 567 568 569 570

	struct reiserfs_transaction_handle th;
	int error, error2;
	size_t jbegin_count = reiserfs_xattr_nblocks(inode, buffer_size);

	if (!(flags & XATTR_REPLACE))
		jbegin_count += reiserfs_xattr_jcreate_nblocks(inode);

	reiserfs_write_lock(inode->i_sb);
	error = journal_begin(&th, inode->i_sb, jbegin_count);
	if (error) {
		reiserfs_write_unlock(inode->i_sb);
		return error;
L
Linus Torvalds 已提交
571
	}
572

J
Jeff Mahoney 已提交
573 574
	error = reiserfs_xattr_set_handle(&th, inode, name,
					  buffer, buffer_size, flags);
575

J
Jeff Mahoney 已提交
576 577 578 579 580 581
	error2 = journal_end(&th, inode->i_sb, jbegin_count);
	if (error == 0)
		error = error2;
	reiserfs_write_unlock(inode->i_sb);

	return error;
L
Linus Torvalds 已提交
582 583 584
}

/*
585
 * inode->i_mutex: down
L
Linus Torvalds 已提交
586 587
 */
int
588
reiserfs_xattr_get(struct inode *inode, const char *name, void *buffer,
589
		   size_t buffer_size)
L
Linus Torvalds 已提交
590
{
591
	ssize_t err = 0;
592
	struct dentry *dentry;
593 594 595 596 597 598 599 600 601 602 603 604 605 606
	size_t isize;
	size_t file_pos = 0;
	size_t buffer_pos = 0;
	struct page *page;
	__u32 hash = 0;

	if (name == NULL)
		return -EINVAL;

	/* We can't have xattrs attached to v1 items since they don't have
	 * generation numbers */
	if (get_inode_sd_version(inode) == STAT_DATA_V1)
		return -EOPNOTSUPP;

607
	dentry = xattr_lookup(inode, name, XATTR_REPLACE);
608 609
	if (IS_ERR(dentry)) {
		err = PTR_ERR(dentry);
610 611 612
		goto out;
	}

613
	down_read(&REISERFS_I(inode)->i_xattr_sem);
614

J
Jeff Mahoney 已提交
615
	isize = i_size_read(dentry->d_inode);
616 617 618 619

	/* Just return the size needed */
	if (buffer == NULL) {
		err = isize - sizeof(struct reiserfs_xattr_header);
620
		goto out_unlock;
621 622 623 624
	}

	if (buffer_size < isize - sizeof(struct reiserfs_xattr_header)) {
		err = -ERANGE;
625
		goto out_unlock;
626 627 628 629 630 631 632 633 634 635 636
	}

	while (file_pos < isize) {
		size_t chunk;
		char *data;
		size_t skip = 0;
		if (isize - file_pos > PAGE_CACHE_SIZE)
			chunk = PAGE_CACHE_SIZE;
		else
			chunk = isize - file_pos;

637
		page = reiserfs_get_page(dentry->d_inode, file_pos);
638 639
		if (IS_ERR(page)) {
			err = PTR_ERR(page);
640
			goto out_unlock;
641 642 643 644 645 646 647 648 649 650 651 652 653
		}

		lock_page(page);
		data = page_address(page);
		if (file_pos == 0) {
			struct reiserfs_xattr_header *rxh =
			    (struct reiserfs_xattr_header *)data;
			skip = file_pos = sizeof(struct reiserfs_xattr_header);
			chunk -= skip;
			/* Magic doesn't match up.. */
			if (rxh->h_magic != cpu_to_le32(REISERFS_XATTR_MAGIC)) {
				unlock_page(page);
				reiserfs_put_page(page);
654
				reiserfs_warning(inode->i_sb, "jdm-20001",
655 656 657 658
						 "Invalid magic for xattr (%s) "
						 "associated with %k", name,
						 INODE_PKEY(inode));
				err = -EIO;
659
				goto out_unlock;
660 661 662 663 664 665 666 667 668 669 670 671 672 673
			}
			hash = le32_to_cpu(rxh->h_hash);
		}
		memcpy(buffer + buffer_pos, data + skip, chunk);
		unlock_page(page);
		reiserfs_put_page(page);
		file_pos += chunk;
		buffer_pos += chunk;
		skip = 0;
	}
	err = isize - sizeof(struct reiserfs_xattr_header);

	if (xattr_hash(buffer, isize - sizeof(struct reiserfs_xattr_header)) !=
	    hash) {
674
		reiserfs_warning(inode->i_sb, "jdm-20002",
675 676 677 678 679
				 "Invalid hash for xattr (%s) associated "
				 "with %k", name, INODE_PKEY(inode));
		err = -EIO;
	}

680 681
out_unlock:
	up_read(&REISERFS_I(inode)->i_xattr_sem);
682
	dput(dentry);
683

684
out:
685
	return err;
L
Linus Torvalds 已提交
686 687
}

688 689 690 691 692 693 694 695 696 697 698 699
/* Actual operations that are exported to VFS-land */
struct xattr_handler *reiserfs_xattr_handlers[] = {
	&reiserfs_xattr_user_handler,
	&reiserfs_xattr_trusted_handler,
#ifdef CONFIG_REISERFS_FS_SECURITY
	&reiserfs_xattr_security_handler,
#endif
#ifdef CONFIG_REISERFS_FS_POSIX_ACL
	&reiserfs_posix_acl_access_handler,
	&reiserfs_posix_acl_default_handler,
#endif
	NULL
L
Linus Torvalds 已提交
700 701
};

702 703 704 705 706 707 708 709 710 711 712 713 714
/*
 * In order to implement different sets of xattr operations for each xattr
 * prefix with the generic xattr API, a filesystem should create a
 * null-terminated array of struct xattr_handler (one for each prefix) and
 * hang a pointer to it off of the s_xattr field of the superblock.
 *
 * The generic_fooxattr() functions will use this list to dispatch xattr
 * operations to the correct xattr_handler.
 */
#define for_each_xattr_handler(handlers, handler)		\
		for ((handler) = *(handlers)++;			\
			(handler) != NULL;			\
			(handler) = *(handlers)++)
L
Linus Torvalds 已提交
715

716 717 718 719
/* This is the implementation for the xattr plugin infrastructure */
static inline struct xattr_handler *
find_xattr_handler_prefix(struct xattr_handler **handlers,
			   const char *name)
L
Linus Torvalds 已提交
720
{
721
	struct xattr_handler *xah;
722

723 724
	if (!handlers)
		return NULL;
725

726 727 728
	for_each_xattr_handler(handlers, xah) {
		if (strncmp(xah->prefix, name, strlen(xah->prefix)) == 0)
			break;
729 730
	}

731
	return xah;
732
}
L
Linus Torvalds 已提交
733 734 735 736 737 738


/*
 * Inode operation getxattr()
 */
ssize_t
739 740
reiserfs_getxattr(struct dentry * dentry, const char *name, void *buffer,
		  size_t size)
L
Linus Torvalds 已提交
741
{
742 743
	struct inode *inode = dentry->d_inode;
	struct xattr_handler *handler;
744

745 746 747
	handler = find_xattr_handler_prefix(inode->i_sb->s_xattr, name);

	if (!handler || get_inode_sd_version(inode) == STAT_DATA_V1)
748 749
		return -EOPNOTSUPP;

750
	return handler->get(inode, name, buffer, size);
L
Linus Torvalds 已提交
751 752 753 754 755
}

/*
 * Inode operation setxattr()
 *
756
 * dentry->d_inode->i_mutex down
L
Linus Torvalds 已提交
757 758
 */
int
759 760
reiserfs_setxattr(struct dentry *dentry, const char *name, const void *value,
		  size_t size, int flags)
L
Linus Torvalds 已提交
761
{
762 763
	struct inode *inode = dentry->d_inode;
	struct xattr_handler *handler;
764

765 766 767
	handler = find_xattr_handler_prefix(inode->i_sb->s_xattr, name);

	if (!handler || get_inode_sd_version(inode) == STAT_DATA_V1)
768 769
		return -EOPNOTSUPP;

770
	return handler->set(inode, name, value, size, flags);
L
Linus Torvalds 已提交
771 772 773 774 775
}

/*
 * Inode operation removexattr()
 *
776
 * dentry->d_inode->i_mutex down
L
Linus Torvalds 已提交
777
 */
778
int reiserfs_removexattr(struct dentry *dentry, const char *name)
L
Linus Torvalds 已提交
779
{
780 781 782
	struct inode *inode = dentry->d_inode;
	struct xattr_handler *handler;
	handler = find_xattr_handler_prefix(inode->i_sb->s_xattr, name);
L
Linus Torvalds 已提交
783

784
	if (!handler || get_inode_sd_version(inode) == STAT_DATA_V1)
785
		return -EOPNOTSUPP;
L
Linus Torvalds 已提交
786

787
	return handler->set(inode, name, NULL, 0, XATTR_REPLACE);
L
Linus Torvalds 已提交
788 789
}

790 791 792 793 794
struct listxattr_buf {
	size_t size;
	size_t pos;
	char *buf;
	struct inode *inode;
L
Linus Torvalds 已提交
795 796
};

797 798
static int listxattr_filler(void *buf, const char *name, int namelen,
			    loff_t offset, u64 ino, unsigned int d_type)
L
Linus Torvalds 已提交
799
{
800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815
	struct listxattr_buf *b = (struct listxattr_buf *)buf;
	size_t size;
	if (name[0] != '.' ||
	    (namelen != 1 && (name[1] != '.' || namelen != 2))) {
		struct xattr_handler *handler;
		handler = find_xattr_handler_prefix(b->inode->i_sb->s_xattr,
						    name);
		if (!handler)	/* Unsupported xattr name */
			return 0;
		if (b->buf) {
			size = handler->list(b->inode, b->buf + b->pos,
					 b->size, name, namelen);
			if (size > b->size)
				return -ERANGE;
		} else {
			size = handler->list(b->inode, NULL, 0, name, namelen);
816 817
		}

818 819
		b->pos += size;
	}
820
	return 0;
L
Linus Torvalds 已提交
821
}
822

L
Linus Torvalds 已提交
823 824 825
/*
 * Inode operation listxattr()
 *
826 827 828
 * We totally ignore the generic listxattr here because it would be stupid
 * not to. Since the xattrs are organized in a directory, we can just
 * readdir to find them.
L
Linus Torvalds 已提交
829
 */
830
ssize_t reiserfs_listxattr(struct dentry * dentry, char *buffer, size_t size)
L
Linus Torvalds 已提交
831
{
832 833
	struct dentry *dir;
	int err = 0;
834
	loff_t pos = 0;
835 836 837 838 839
	struct listxattr_buf buf = {
		.inode = dentry->d_inode,
		.buf = buffer,
		.size = buffer ? size : 0,
	};
840 841 842 843 844 845 846 847

	if (!dentry->d_inode)
		return -EINVAL;

	if (!reiserfs_xattrs(dentry->d_sb) ||
	    get_inode_sd_version(dentry->d_inode) == STAT_DATA_V1)
		return -EOPNOTSUPP;

848
	dir = open_xa_dir(dentry->d_inode, XATTR_REPLACE);
849 850 851
	if (IS_ERR(dir)) {
		err = PTR_ERR(dir);
		if (err == -ENODATA)
852
			err = 0;  /* Not an error if there aren't any xattrs */
853 854 855
		goto out;
	}

856
	mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_XATTR);
857
	err = reiserfs_readdir_dentry(dir, &buf, listxattr_filler, &pos);
858
	mutex_unlock(&dir->d_inode->i_mutex);
859

860 861
	if (!err)
		err = buf.pos;
862

863
	dput(dir);
864
out:
865
	return err;
L
Linus Torvalds 已提交
866 867
}

868
static int reiserfs_check_acl(struct inode *inode, int mask)
L
Linus Torvalds 已提交
869
{
870 871
	struct posix_acl *acl;
	int error = -EAGAIN; /* do regular unix permission checks by default */
872

873 874 875 876 877 878 879 880
	acl = reiserfs_get_acl(inode, ACL_TYPE_ACCESS);

	if (acl) {
		if (!IS_ERR(acl)) {
			error = posix_acl_permission(inode, acl, mask);
			posix_acl_release(acl);
		} else if (PTR_ERR(acl) != -ENODATA)
			error = PTR_ERR(acl);
881 882
	}

883
	return error;
L
Linus Torvalds 已提交
884 885
}

886
int reiserfs_permission(struct inode *inode, int mask)
L
Linus Torvalds 已提交
887
{
888 889 890 891 892 893 894 895 896 897 898 899 900
	/*
	 * We don't do permission checks on the internal objects.
	 * Permissions are determined by the "owning" object.
	 */
	if (IS_PRIVATE(inode))
		return 0;
	/*
	 * Stat data v1 doesn't support ACLs.
	 */
	if (get_inode_sd_version(inode) == STAT_DATA_V1)
		return generic_permission(inode, mask, NULL);
	else
		return generic_permission(inode, mask, reiserfs_check_acl);
L
Linus Torvalds 已提交
901 902
}

903
static int create_privroot(struct dentry *dentry)
L
Linus Torvalds 已提交
904
{
905 906 907
	int err;
	struct inode *inode = dentry->d_parent->d_inode;
	mutex_lock_nested(&inode->i_mutex, I_MUTEX_XATTR);
908
	err = xattr_mkdir(inode, dentry, 0700);
909 910 911 912
	mutex_unlock(&inode->i_mutex);
	if (err) {
		dput(dentry);
		dentry = NULL;
913 914
	}

915 916 917
	if (dentry && dentry->d_inode)
		reiserfs_info(dentry->d_sb, "Created %s - reserved for xattr "
			      "storage.\n", PRIVROOT_NAME);
918 919

	return err;
L
Linus Torvalds 已提交
920 921
}

922
static int xattr_mount_check(struct super_block *s)
L
Linus Torvalds 已提交
923
{
924 925
	/* We need generation numbers to ensure that the oid mapping is correct
	 * v3.5 filesystems don't have them. */
926 927 928 929 930 931 932 933 934 935
	if (old_format_only(s)) {
		if (reiserfs_xattrs_optional(s)) {
			/* Old format filesystem, but optional xattrs have
			 * been enabled. Error out. */
			reiserfs_warning(s, "jdm-2005",
					 "xattrs/ACLs not supported "
					 "on pre-v3.6 format filesystems. "
					 "Failing mount.");
			return -EOPNOTSUPP;
		}
936 937 938
	}

	return 0;
L
Linus Torvalds 已提交
939 940
}

941 942 943 944 945
#else
int __init reiserfs_xattr_register_handlers(void) { return 0; }
void reiserfs_xattr_unregister_handlers(void) {}
#endif

L
Linus Torvalds 已提交
946 947
/* This will catch lookups from the fs root to .reiserfs_priv */
static int
948
xattr_lookup_poison(struct dentry *dentry, struct qstr *q1, struct qstr *name)
L
Linus Torvalds 已提交
949
{
950 951 952 953 954 955 956 957 958
	struct dentry *priv_root = REISERFS_SB(dentry->d_sb)->priv_root;
	if (name->len == priv_root->d_name.len &&
	    name->hash == priv_root->d_name.hash &&
	    !memcmp(name->name, priv_root->d_name.name, name->len)) {
		return -ENOENT;
	} else if (q1->len == name->len &&
		   !memcmp(q1->name, name->name, name->len))
		return 0;
	return 1;
L
Linus Torvalds 已提交
959 960
}

961
static const struct dentry_operations xattr_lookup_poison_ops = {
962
	.d_compare = xattr_lookup_poison,
L
Linus Torvalds 已提交
963 964 965 966 967
};

/* We need to take a copy of the mount flags since things like
 * MS_RDONLY don't get set until *after* we're called.
 * mount_flags != mount_options */
968
int reiserfs_xattr_init(struct super_block *s, int mount_flags)
L
Linus Torvalds 已提交
969
{
970 971
	int err = 0;

972 973 974
#ifdef CONFIG_REISERFS_FS_XATTR
	err = xattr_mount_check(s);
	if (err)
975
		goto error;
976
#endif
977 978

	/* If we don't have the privroot located yet - go find it */
979
	if (!REISERFS_SB(s)->priv_root) {
980 981 982 983
		struct dentry *dentry;
		dentry = lookup_one_len(PRIVROOT_NAME, s->s_root,
					strlen(PRIVROOT_NAME));
		if (!IS_ERR(dentry)) {
984 985 986 987 988
#ifdef CONFIG_REISERFS_FS_XATTR
			if (!(mount_flags & MS_RDONLY) && !dentry->d_inode)
				err = create_privroot(dentry);
#endif
			if (!dentry->d_inode) {
989 990 991 992 993 994 995 996
				dput(dentry);
				dentry = NULL;
			}
		} else
			err = PTR_ERR(dentry);

		if (!err && dentry) {
			s->s_root->d_op = &xattr_lookup_poison_ops;
997
			dentry->d_inode->i_flags |= S_PRIVATE;
998
			REISERFS_SB(s)->priv_root = dentry;
999 1000 1001 1002 1003 1004 1005
#ifdef CONFIG_REISERFS_FS_XATTR
		/* xattrs are unavailable */
		} else if (!(mount_flags & MS_RDONLY)) {
			/* If we're read-only it just means that the dir
			 * hasn't been created. Not an error -- just no
			 * xattrs on the fs. We'll check again if we
			 * go read-write */
J
Jeff Mahoney 已提交
1006 1007 1008 1009
			reiserfs_warning(s, "jdm-20006",
					 "xattrs/ACLs enabled and couldn't "
					 "find/create .reiserfs_priv. "
					 "Failing mount.");
1010
			err = -EOPNOTSUPP;
1011
#endif
1012 1013 1014
		}
	}

1015
#ifdef CONFIG_REISERFS_FS_XATTR
1016 1017 1018
	if (!err)
		s->s_xattr = reiserfs_xattr_handlers;

1019
error:
1020 1021 1022 1023
	if (err) {
		clear_bit(REISERFS_XATTRS_USER, &(REISERFS_SB(s)->s_mount_opt));
		clear_bit(REISERFS_POSIXACL, &(REISERFS_SB(s)->s_mount_opt));
	}
1024
#endif
1025 1026 1027

	/* The super_block MS_POSIXACL must mirror the (no)acl mount option. */
	s->s_flags = s->s_flags & ~MS_POSIXACL;
1028
#ifdef CONFIG_REISERFS_FS_POSIX_ACL
1029 1030
	if (reiserfs_posixacl(s))
		s->s_flags |= MS_POSIXACL;
1031
#endif
1032 1033

	return err;
L
Linus Torvalds 已提交
1034
}