overlayfs: Implement splice-read
[linux-block.git] / fs / reiserfs / xattr.c
CommitLineData
b2441318 1// SPDX-License-Identifier: GPL-2.0
1da177e4
LT
2/*
3 * linux/fs/reiserfs/xattr.c
4 *
5 * Copyright (c) 2002 by Jeff Mahoney, <jeffm@suse.com>
6 *
7 */
8
9/*
10 * In order to implement EA/ACLs in a clean, backwards compatible manner,
11 * they are implemented as files in a "private" directory.
12 * Each EA is in it's own file, with the directory layout like so (/ is assumed
13 * to be relative to fs root). Inside the /.reiserfs_priv/xattrs directory,
14 * directories named using the capital-hex form of the objectid and
15 * generation number are used. Inside each directory are individual files
16 * named with the name of the extended attribute.
17 *
18 * So, for objectid 12648430, we could have:
19 * /.reiserfs_priv/xattrs/C0FFEE.0/system.posix_acl_access
20 * /.reiserfs_priv/xattrs/C0FFEE.0/system.posix_acl_default
21 * /.reiserfs_priv/xattrs/C0FFEE.0/user.Content-Type
22 * .. or similar.
23 *
24 * The file contents are the text of the EA. The size is known based on the
25 * stat data describing the file.
26 *
27 * In the case of system.posix_acl_access and system.posix_acl_default, since
28 * these are special cases for filesystem ACLs, they are interpreted by the
29 * kernel, in addition, they are negatively and positively cached and attached
30 * to the inode so that unnecessary lookups are avoided.
d984561b
JM
31 *
32 * Locking works like so:
8b6dd72a
JM
33 * Directory components (xattr root, xattr dir) are protectd by their i_mutex.
34 * The xattrs themselves are protected by the xattr_sem.
1da177e4
LT
35 */
36
f466c6fd 37#include "reiserfs.h"
16f7e0fe 38#include <linux/capability.h>
1da177e4
LT
39#include <linux/dcache.h>
40#include <linux/namei.h>
41#include <linux/errno.h>
5a0e3ad6 42#include <linux/gfp.h>
1da177e4
LT
43#include <linux/fs.h>
44#include <linux/file.h>
45#include <linux/pagemap.h>
46#include <linux/xattr.h>
c45ac888 47#include "xattr.h"
a3063ab8 48#include "acl.h"
17093991 49#include <linux/uaccess.h>
3277c39f 50#include <net/checksum.h>
1da177e4 51#include <linux/stat.h>
6c17675e 52#include <linux/quotaops.h>
431547b3 53#include <linux/security.h>
47f70d08 54#include <linux/posix_acl_xattr.h>
387b96a5 55#include <linux/xattr.h>
1da177e4 56
1da177e4
LT
57#define PRIVROOT_NAME ".reiserfs_priv"
58#define XAROOT_NAME "xattrs"
59
1da177e4 60
098297b2
JM
61/*
62 * Helpers for inode ops. We do this so that we don't have all the VFS
6c17675e 63 * overhead and also for proper i_mutex annotation.
098297b2
JM
64 * dir->i_mutex must be held for all of them.
65 */
3a355cc6 66#ifdef CONFIG_REISERFS_FS_XATTR
6c17675e 67static int xattr_create(struct inode *dir, struct dentry *dentry, int mode)
1da177e4 68{
5955102c 69 BUG_ON(!inode_is_locked(dir));
6c960e68 70 return dir->i_op->create(&nop_mnt_idmap, dir, dentry, mode, true);
6c17675e 71}
3a355cc6 72#endif
bd4c625c 73
18bb1db3 74static int xattr_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
6c17675e 75{
5955102c 76 BUG_ON(!inode_is_locked(dir));
c54bd91e 77 return dir->i_op->mkdir(&nop_mnt_idmap, dir, dentry, mode);
6c17675e 78}
bd4c625c 79
098297b2
JM
80/*
81 * We use I_MUTEX_CHILD here to silence lockdep. It's safe because xattr
6c17675e
JM
82 * mutation ops aren't called during rename or splace, which are the
83 * only other users of I_MUTEX_CHILD. It violates the ordering, but that's
098297b2
JM
84 * better than allocating another subclass just for this code.
85 */
6c17675e
JM
86static int xattr_unlink(struct inode *dir, struct dentry *dentry)
87{
88 int error;
f3fb9e27 89
5955102c 90 BUG_ON(!inode_is_locked(dir));
bd4c625c 91
5955102c 92 inode_lock_nested(d_inode(dentry), I_MUTEX_CHILD);
6c17675e 93 error = dir->i_op->unlink(dir, dentry);
5955102c 94 inode_unlock(d_inode(dentry));
6c17675e
JM
95
96 if (!error)
97 d_delete(dentry);
98 return error;
99}
100
101static int xattr_rmdir(struct inode *dir, struct dentry *dentry)
102{
103 int error;
f3fb9e27 104
5955102c 105 BUG_ON(!inode_is_locked(dir));
6c17675e 106
5955102c 107 inode_lock_nested(d_inode(dentry), I_MUTEX_CHILD);
6c17675e
JM
108 error = dir->i_op->rmdir(dir, dentry);
109 if (!error)
2b0143b5 110 d_inode(dentry)->i_flags |= S_DEAD;
5955102c 111 inode_unlock(d_inode(dentry));
6c17675e
JM
112 if (!error)
113 d_delete(dentry);
6c17675e
JM
114
115 return error;
116}
117
6c17675e
JM
118#define xattr_may_create(flags) (!flags || flags & XATTR_CREATE)
119
ab17c4f0 120static struct dentry *open_xa_root(struct super_block *sb, int flags)
6c17675e 121{
ab17c4f0
JM
122 struct dentry *privroot = REISERFS_SB(sb)->priv_root;
123 struct dentry *xaroot;
f3fb9e27 124
2b0143b5 125 if (d_really_is_negative(privroot))
60e4cf67 126 return ERR_PTR(-EOPNOTSUPP);
6c17675e 127
5955102c 128 inode_lock_nested(d_inode(privroot), I_MUTEX_XATTR);
6c17675e 129
ab17c4f0 130 xaroot = dget(REISERFS_SB(sb)->xattr_root);
ceb5edc4 131 if (!xaroot)
60e4cf67 132 xaroot = ERR_PTR(-EOPNOTSUPP);
2b0143b5 133 else if (d_really_is_negative(xaroot)) {
ab17c4f0 134 int err = -ENODATA;
f3fb9e27 135
5a6059c3 136 if (xattr_may_create(flags))
2b0143b5 137 err = xattr_mkdir(d_inode(privroot), xaroot, 0700);
9b7f3755 138 if (err) {
ab17c4f0
JM
139 dput(xaroot);
140 xaroot = ERR_PTR(err);
9b7f3755 141 }
bd4c625c 142 }
6c17675e 143
5955102c 144 inode_unlock(d_inode(privroot));
ab17c4f0 145 return xaroot;
1da177e4
LT
146}
147
bd4c625c 148static struct dentry *open_xa_dir(const struct inode *inode, int flags)
1da177e4 149{
bd4c625c
LT
150 struct dentry *xaroot, *xadir;
151 char namebuf[17];
152
6c17675e 153 xaroot = open_xa_root(inode->i_sb, flags);
9b7f3755 154 if (IS_ERR(xaroot))
bd4c625c 155 return xaroot;
bd4c625c 156
bd4c625c
LT
157 snprintf(namebuf, sizeof(namebuf), "%X.%X",
158 le32_to_cpu(INODE_PKEY(inode)->k_objectid),
159 inode->i_generation);
bd4c625c 160
5955102c 161 inode_lock_nested(d_inode(xaroot), I_MUTEX_XATTR);
ab17c4f0
JM
162
163 xadir = lookup_one_len(namebuf, xaroot, strlen(namebuf));
2b0143b5 164 if (!IS_ERR(xadir) && d_really_is_negative(xadir)) {
ab17c4f0 165 int err = -ENODATA;
f3fb9e27 166
ab17c4f0 167 if (xattr_may_create(flags))
2b0143b5 168 err = xattr_mkdir(d_inode(xaroot), xadir, 0700);
ab17c4f0
JM
169 if (err) {
170 dput(xadir);
171 xadir = ERR_PTR(err);
172 }
173 }
174
5955102c 175 inode_unlock(d_inode(xaroot));
bd4c625c
LT
176 dput(xaroot);
177 return xadir;
1da177e4
LT
178}
179
098297b2
JM
180/*
181 * The following are side effects of other operations that aren't explicitly
48b32a35 182 * modifying extended attributes. This includes operations such as permissions
098297b2
JM
183 * or ownership changes, object deletions, etc.
184 */
a41f1a47 185struct reiserfs_dentry_buf {
4acf381e 186 struct dir_context ctx;
a41f1a47
JM
187 struct dentry *xadir;
188 int count;
b10298d5 189 int err;
a41f1a47
JM
190 struct dentry *dentries[8];
191};
bd4c625c 192
25885a35 193static bool
ac7576f4
MS
194fill_with_dentries(struct dir_context *ctx, const char *name, int namelen,
195 loff_t offset, u64 ino, unsigned int d_type)
a72bdb1c 196{
ac7576f4
MS
197 struct reiserfs_dentry_buf *dbuf =
198 container_of(ctx, struct reiserfs_dentry_buf, ctx);
a72bdb1c 199 struct dentry *dentry;
f3fb9e27 200
5955102c 201 WARN_ON_ONCE(!inode_is_locked(d_inode(dbuf->xadir)));
bd4c625c 202
a41f1a47 203 if (dbuf->count == ARRAY_SIZE(dbuf->dentries))
25885a35 204 return false;
bd4c625c 205
35e5cbc0
JK
206 if (name[0] == '.' && (namelen < 2 ||
207 (namelen == 2 && name[1] == '.')))
25885a35 208 return true;
bd4c625c 209
a41f1a47 210 dentry = lookup_one_len(name, dbuf->xadir, namelen);
a72bdb1c 211 if (IS_ERR(dentry)) {
b10298d5 212 dbuf->err = PTR_ERR(dentry);
25885a35 213 return false;
2b0143b5 214 } else if (d_really_is_negative(dentry)) {
a41f1a47
JM
215 /* A directory entry exists, but no file? */
216 reiserfs_error(dentry->d_sb, "xattr-20003",
a455589f
AV
217 "Corrupted directory: xattr %pd listed but "
218 "not found for file %pd.\n",
219 dentry, dbuf->xadir);
a41f1a47 220 dput(dentry);
b10298d5 221 dbuf->err = -EIO;
25885a35 222 return false;
bd4c625c 223 }
1da177e4 224
a41f1a47 225 dbuf->dentries[dbuf->count++] = dentry;
25885a35 226 return true;
1da177e4
LT
227}
228
a41f1a47
JM
229static void
230cleanup_dentry_buf(struct reiserfs_dentry_buf *buf)
1da177e4 231{
a41f1a47 232 int i;
f3fb9e27 233
a41f1a47
JM
234 for (i = 0; i < buf->count; i++)
235 if (buf->dentries[i])
236 dput(buf->dentries[i]);
a72bdb1c
JM
237}
238
a41f1a47
JM
239static int reiserfs_for_each_xattr(struct inode *inode,
240 int (*action)(struct dentry *, void *),
241 void *data)
a72bdb1c 242{
a41f1a47
JM
243 struct dentry *dir;
244 int i, err = 0;
a41f1a47 245 struct reiserfs_dentry_buf buf = {
4acf381e 246 .ctx.actor = fill_with_dentries,
a41f1a47 247 };
1da177e4 248
a72bdb1c
JM
249 /* Skip out, an xattr has no xattrs associated with it */
250 if (IS_PRIVATE(inode) || get_inode_sd_version(inode) == STAT_DATA_V1)
251 return 0;
1da177e4 252
6c17675e 253 dir = open_xa_dir(inode, XATTR_REPLACE);
a72bdb1c
JM
254 if (IS_ERR(dir)) {
255 err = PTR_ERR(dir);
256 goto out;
2b0143b5 257 } else if (d_really_is_negative(dir)) {
a41f1a47
JM
258 err = 0;
259 goto out_dir;
a72bdb1c 260 }
1da177e4 261
5955102c 262 inode_lock_nested(d_inode(dir), I_MUTEX_XATTR);
27026a05 263
a41f1a47 264 buf.xadir = dir;
cd62cdae 265 while (1) {
2b0143b5 266 err = reiserfs_readdir_inode(d_inode(dir), &buf.ctx);
cd62cdae
AV
267 if (err)
268 break;
b10298d5
JH
269 if (buf.err) {
270 err = buf.err;
271 break;
272 }
cd62cdae
AV
273 if (!buf.count)
274 break;
275 for (i = 0; !err && i < buf.count && buf.dentries[i]; i++) {
a41f1a47 276 struct dentry *dentry = buf.dentries[i];
1da177e4 277
e36cb0b8 278 if (!d_is_dir(dentry))
cd62cdae 279 err = action(dentry, data);
1da177e4 280
a41f1a47
JM
281 dput(dentry);
282 buf.dentries[i] = NULL;
bd4c625c 283 }
cd62cdae
AV
284 if (err)
285 break;
a41f1a47 286 buf.count = 0;
8b6dd72a 287 }
5955102c 288 inode_unlock(d_inode(dir));
1da177e4 289
a41f1a47 290 cleanup_dentry_buf(&buf);
1da177e4 291
d984561b 292 if (!err) {
098297b2
JM
293 /*
294 * We start a transaction here to avoid a ABBA situation
a41f1a47
JM
295 * between the xattr root's i_mutex and the journal lock.
296 * This doesn't incur much additional overhead since the
297 * new transaction will just nest inside the
098297b2
JM
298 * outer transaction.
299 */
a41f1a47
JM
300 int blocks = JOURNAL_PER_BALANCE_CNT * 2 + 2 +
301 4 * REISERFS_QUOTA_TRANS_BLOCKS(inode->i_sb);
302 struct reiserfs_transaction_handle th;
f3fb9e27 303
4c05141d 304 reiserfs_write_lock(inode->i_sb);
a41f1a47 305 err = journal_begin(&th, inode->i_sb, blocks);
4c05141d 306 reiserfs_write_unlock(inode->i_sb);
a41f1a47
JM
307 if (!err) {
308 int jerror;
f3fb9e27 309
5955102c 310 inode_lock_nested(d_inode(dir->d_parent),
4c05141d 311 I_MUTEX_XATTR);
a41f1a47 312 err = action(dir, data);
4c05141d 313 reiserfs_write_lock(inode->i_sb);
58d85426 314 jerror = journal_end(&th);
4c05141d 315 reiserfs_write_unlock(inode->i_sb);
5955102c 316 inode_unlock(d_inode(dir->d_parent));
a41f1a47
JM
317 err = jerror ?: err;
318 }
a72bdb1c 319 }
a41f1a47
JM
320out_dir:
321 dput(dir);
a72bdb1c 322out:
394440d4
JM
323 /*
324 * -ENODATA: this object doesn't have any xattrs
325 * -EOPNOTSUPP: this file system doesn't have xattrs enabled on disk.
326 * Neither are errors
327 */
328 if (err == -ENODATA || err == -EOPNOTSUPP)
a41f1a47 329 err = 0;
a72bdb1c
JM
330 return err;
331}
1da177e4 332
a41f1a47 333static int delete_one_xattr(struct dentry *dentry, void *data)
a72bdb1c 334{
2b0143b5 335 struct inode *dir = d_inode(dentry->d_parent);
1da177e4 336
a41f1a47 337 /* This is the xattr dir, handle specially. */
e36cb0b8 338 if (d_is_dir(dentry))
a41f1a47 339 return xattr_rmdir(dir, dentry);
1da177e4 340
a41f1a47
JM
341 return xattr_unlink(dir, dentry);
342}
bd4c625c 343
a41f1a47
JM
344static int chown_one_xattr(struct dentry *dentry, void *data)
345{
346 struct iattr *attrs = data;
4a857011
JM
347 int ia_valid = attrs->ia_valid;
348 int err;
349
350 /*
351 * We only want the ownership bits. Otherwise, we'll do
352 * things like change a directory to a regular file if
353 * ATTR_MODE is set.
354 */
355 attrs->ia_valid &= (ATTR_UID|ATTR_GID);
c1632a0f 356 err = reiserfs_setattr(&nop_mnt_idmap, dentry, attrs);
4a857011
JM
357 attrs->ia_valid = ia_valid;
358
359 return err;
a41f1a47 360}
1da177e4 361
a41f1a47
JM
362/* No i_mutex, but the inode is unconnected. */
363int reiserfs_delete_xattrs(struct inode *inode)
364{
365 int err = reiserfs_for_each_xattr(inode, delete_one_xattr, NULL);
f3fb9e27 366
a41f1a47
JM
367 if (err)
368 reiserfs_warning(inode->i_sb, "jdm-20004",
369 "Couldn't delete all xattrs (%d)\n", err);
a72bdb1c
JM
370 return err;
371}
1da177e4 372
a41f1a47 373/* inode->i_mutex: down */
a72bdb1c
JM
374int reiserfs_chown_xattrs(struct inode *inode, struct iattr *attrs)
375{
a41f1a47 376 int err = reiserfs_for_each_xattr(inode, chown_one_xattr, attrs);
f3fb9e27 377
8b6dd72a
JM
378 if (err)
379 reiserfs_warning(inode->i_sb, "jdm-20007",
380 "Couldn't chown all xattrs (%d)\n", err);
a72bdb1c 381 return err;
1da177e4
LT
382}
383
a72bdb1c 384#ifdef CONFIG_REISERFS_FS_XATTR
098297b2
JM
385/*
386 * Returns a dentry corresponding to a specific extended attribute file
a72bdb1c 387 * for the inode. If flags allow, the file is created. Otherwise, a
098297b2
JM
388 * valid or negative dentry, or an error is returned.
389 */
48b32a35
JM
390static struct dentry *xattr_lookup(struct inode *inode, const char *name,
391 int flags)
1da177e4 392{
a72bdb1c
JM
393 struct dentry *xadir, *xafile;
394 int err = 0;
395
396 xadir = open_xa_dir(inode, flags);
6c17675e 397 if (IS_ERR(xadir))
a72bdb1c 398 return ERR_CAST(xadir);
a72bdb1c 399
5955102c 400 inode_lock_nested(d_inode(xadir), I_MUTEX_XATTR);
a72bdb1c
JM
401 xafile = lookup_one_len(name, xadir, strlen(name));
402 if (IS_ERR(xafile)) {
6c17675e
JM
403 err = PTR_ERR(xafile);
404 goto out;
bd4c625c 405 }
a72bdb1c 406
2b0143b5 407 if (d_really_is_positive(xafile) && (flags & XATTR_CREATE))
6c17675e 408 err = -EEXIST;
a72bdb1c 409
2b0143b5 410 if (d_really_is_negative(xafile)) {
6c17675e 411 err = -ENODATA;
5a6059c3 412 if (xattr_may_create(flags))
2b0143b5 413 err = xattr_create(d_inode(xadir), xafile,
6c17675e 414 0700|S_IFREG);
a72bdb1c
JM
415 }
416
6c17675e
JM
417 if (err)
418 dput(xafile);
a72bdb1c 419out:
5955102c 420 inode_unlock(d_inode(xadir));
a72bdb1c
JM
421 dput(xadir);
422 if (err)
6c17675e 423 return ERR_PTR(err);
a72bdb1c 424 return xafile;
1da177e4
LT
425}
426
1da177e4 427/* Internal operations on file data */
bd4c625c 428static inline void reiserfs_put_page(struct page *page)
1da177e4 429{
bd4c625c 430 kunmap(page);
09cbfeaf 431 put_page(page);
1da177e4
LT
432}
433
ec6ea56b 434static struct page *reiserfs_get_page(struct inode *dir, size_t n)
1da177e4 435{
bd4c625c
LT
436 struct address_space *mapping = dir->i_mapping;
437 struct page *page;
098297b2
JM
438 /*
439 * We can deadlock if we try to free dentries,
440 * and an unlink/rmdir has just occurred - GFP_NOFS avoids this
441 */
c4cdd038 442 mapping_set_gfp_mask(mapping, GFP_NOFS);
09cbfeaf 443 page = read_mapping_page(mapping, n >> PAGE_SHIFT, NULL);
b0c971e7 444 if (!IS_ERR(page))
bd4c625c 445 kmap(page);
bd4c625c 446 return page;
1da177e4
LT
447}
448
bd4c625c 449static inline __u32 xattr_hash(const char *msg, int len)
1da177e4 450{
672cdd56
BV
451 /*
452 * csum_partial() gives different results for little-endian and
453 * big endian hosts. Images created on little-endian hosts and
454 * mounted on big-endian hosts(and vice versa) will see csum mismatches
455 * when trying to fetch xattrs. Treating the hash as __wsum_t would
456 * lower the frequency of mismatch. This is an endianness bug in
457 * reiserfs. The return statement would result in a sparse warning. Do
458 * not fix the sparse warning so as to not hide a reminder of the bug.
459 */
bd4c625c 460 return csum_partial(msg, len, 0);
1da177e4
LT
461}
462
ba9d8cec
VS
463int reiserfs_commit_write(struct file *f, struct page *page,
464 unsigned from, unsigned to);
ba9d8cec 465
48b32a35
JM
466static void update_ctime(struct inode *inode)
467{
95582b00 468 struct timespec64 now = current_time(inode);
f3fb9e27 469
1d3382cb 470 if (inode_unhashed(inode) || !inode->i_nlink ||
95582b00 471 timespec64_equal(&inode->i_ctime, &now))
48b32a35
JM
472 return;
473
02027d42 474 inode->i_ctime = current_time(inode);
48b32a35
JM
475 mark_inode_dirty(inode);
476}
477
478static int lookup_and_delete_xattr(struct inode *inode, const char *name)
479{
480 int err = 0;
481 struct dentry *dentry, *xadir;
482
483 xadir = open_xa_dir(inode, XATTR_REPLACE);
484 if (IS_ERR(xadir))
485 return PTR_ERR(xadir);
486
5955102c 487 inode_lock_nested(d_inode(xadir), I_MUTEX_XATTR);
48b32a35
JM
488 dentry = lookup_one_len(name, xadir, strlen(name));
489 if (IS_ERR(dentry)) {
490 err = PTR_ERR(dentry);
491 goto out_dput;
492 }
493
2b0143b5
DH
494 if (d_really_is_positive(dentry)) {
495 err = xattr_unlink(d_inode(xadir), dentry);
48b32a35
JM
496 update_ctime(inode);
497 }
498
499 dput(dentry);
500out_dput:
5955102c 501 inode_unlock(d_inode(xadir));
48b32a35
JM
502 dput(xadir);
503 return err;
504}
505
ba9d8cec 506
1da177e4
LT
507/* Generic extended attribute operations that can be used by xa plugins */
508
509/*
1b1dcc1b 510 * inode->i_mutex: down
1da177e4
LT
511 */
512int
0ab2621e
JM
513reiserfs_xattr_set_handle(struct reiserfs_transaction_handle *th,
514 struct inode *inode, const char *name,
515 const void *buffer, size_t buffer_size, int flags)
1da177e4 516{
bd4c625c 517 int err = 0;
3227e14c 518 struct dentry *dentry;
bd4c625c
LT
519 struct page *page;
520 char *data;
bd4c625c
LT
521 size_t file_pos = 0;
522 size_t buffer_pos = 0;
48b32a35 523 size_t new_size;
bd4c625c
LT
524 __u32 xahash = 0;
525
bd4c625c
LT
526 if (get_inode_sd_version(inode) == STAT_DATA_V1)
527 return -EOPNOTSUPP;
528
4f3be1b5
FW
529 if (!buffer) {
530 err = lookup_and_delete_xattr(inode, name);
4f3be1b5
FW
531 return err;
532 }
533
48b32a35 534 dentry = xattr_lookup(inode, name, flags);
4c05141d 535 if (IS_ERR(dentry))
48b32a35 536 return PTR_ERR(dentry);
3f14fea6 537
f3e22f48 538 down_write(&REISERFS_I(inode)->i_xattr_sem);
bd4c625c 539
8b6dd72a 540 xahash = xattr_hash(buffer, buffer_size);
bd4c625c
LT
541 while (buffer_pos < buffer_size || buffer_pos == 0) {
542 size_t chunk;
543 size_t skip = 0;
09cbfeaf 544 size_t page_offset = (file_pos & (PAGE_SIZE - 1));
f3fb9e27 545
09cbfeaf
KS
546 if (buffer_size - buffer_pos > PAGE_SIZE)
547 chunk = PAGE_SIZE;
bd4c625c
LT
548 else
549 chunk = buffer_size - buffer_pos;
550
2b0143b5 551 page = reiserfs_get_page(d_inode(dentry), file_pos);
bd4c625c
LT
552 if (IS_ERR(page)) {
553 err = PTR_ERR(page);
48b32a35 554 goto out_unlock;
bd4c625c
LT
555 }
556
557 lock_page(page);
558 data = page_address(page);
559
560 if (file_pos == 0) {
561 struct reiserfs_xattr_header *rxh;
f3fb9e27 562
bd4c625c 563 skip = file_pos = sizeof(struct reiserfs_xattr_header);
09cbfeaf
KS
564 if (chunk + skip > PAGE_SIZE)
565 chunk = PAGE_SIZE - skip;
bd4c625c
LT
566 rxh = (struct reiserfs_xattr_header *)data;
567 rxh->h_magic = cpu_to_le32(REISERFS_XATTR_MAGIC);
568 rxh->h_hash = cpu_to_le32(xahash);
569 }
570
4c05141d 571 reiserfs_write_lock(inode->i_sb);
ebdec241 572 err = __reiserfs_write_begin(page, page_offset, chunk + skip);
bd4c625c
LT
573 if (!err) {
574 if (buffer)
575 memcpy(data + skip, buffer + buffer_pos, chunk);
3227e14c
JM
576 err = reiserfs_commit_write(NULL, page, page_offset,
577 page_offset + chunk +
578 skip);
bd4c625c 579 }
4c05141d 580 reiserfs_write_unlock(inode->i_sb);
bd4c625c
LT
581 unlock_page(page);
582 reiserfs_put_page(page);
583 buffer_pos += chunk;
584 file_pos += chunk;
585 skip = 0;
586 if (err || buffer_size == 0 || !buffer)
587 break;
588 }
589
48b32a35 590 new_size = buffer_size + sizeof(struct reiserfs_xattr_header);
2b0143b5 591 if (!err && new_size < i_size_read(d_inode(dentry))) {
48b32a35 592 struct iattr newattrs = {
02027d42 593 .ia_ctime = current_time(inode),
fb2162df 594 .ia_size = new_size,
48b32a35
JM
595 .ia_valid = ATTR_SIZE | ATTR_CTIME,
596 };
31370f62 597
5955102c 598 inode_lock_nested(d_inode(dentry), I_MUTEX_XATTR);
2b0143b5 599 inode_dio_wait(d_inode(dentry));
31370f62 600
c1632a0f 601 err = reiserfs_setattr(&nop_mnt_idmap, dentry, &newattrs);
5955102c 602 inode_unlock(d_inode(dentry));
48b32a35
JM
603 } else
604 update_ctime(inode);
605out_unlock:
8b6dd72a 606 up_write(&REISERFS_I(inode)->i_xattr_sem);
3227e14c 607 dput(dentry);
48b32a35
JM
608 return err;
609}
bd4c625c 610
0ab2621e
JM
611/* We need to start a transaction to maintain lock ordering */
612int reiserfs_xattr_set(struct inode *inode, const char *name,
613 const void *buffer, size_t buffer_size, int flags)
48b32a35 614{
0ab2621e
JM
615
616 struct reiserfs_transaction_handle th;
617 int error, error2;
618 size_t jbegin_count = reiserfs_xattr_nblocks(inode, buffer_size);
619
60e4cf67
JM
620 /* Check before we start a transaction and then do nothing. */
621 if (!d_really_is_positive(REISERFS_SB(inode->i_sb)->priv_root))
622 return -EOPNOTSUPP;
623
0ab2621e
JM
624 if (!(flags & XATTR_REPLACE))
625 jbegin_count += reiserfs_xattr_jcreate_nblocks(inode);
626
627 reiserfs_write_lock(inode->i_sb);
628 error = journal_begin(&th, inode->i_sb, jbegin_count);
4c05141d 629 reiserfs_write_unlock(inode->i_sb);
0ab2621e 630 if (error) {
0ab2621e 631 return error;
1da177e4 632 }
bd4c625c 633
0ab2621e
JM
634 error = reiserfs_xattr_set_handle(&th, inode, name,
635 buffer, buffer_size, flags);
bd4c625c 636
4c05141d 637 reiserfs_write_lock(inode->i_sb);
58d85426 638 error2 = journal_end(&th);
4c05141d 639 reiserfs_write_unlock(inode->i_sb);
0ab2621e
JM
640 if (error == 0)
641 error = error2;
0ab2621e
JM
642
643 return error;
1da177e4
LT
644}
645
646/*
1b1dcc1b 647 * inode->i_mutex: down
1da177e4
LT
648 */
649int
48b32a35 650reiserfs_xattr_get(struct inode *inode, const char *name, void *buffer,
bd4c625c 651 size_t buffer_size)
1da177e4 652{
bd4c625c 653 ssize_t err = 0;
3227e14c 654 struct dentry *dentry;
bd4c625c
LT
655 size_t isize;
656 size_t file_pos = 0;
657 size_t buffer_pos = 0;
658 struct page *page;
bd4c625c
LT
659 __u32 hash = 0;
660
661 if (name == NULL)
662 return -EINVAL;
663
098297b2
JM
664 /*
665 * We can't have xattrs attached to v1 items since they don't have
666 * generation numbers
667 */
bd4c625c
LT
668 if (get_inode_sd_version(inode) == STAT_DATA_V1)
669 return -EOPNOTSUPP;
670
c2bb80b8
JK
671 /*
672 * priv_root needn't be initialized during mount so allow initial
673 * lookups to succeed.
674 */
675 if (!REISERFS_SB(inode->i_sb)->priv_root)
676 return 0;
677
48b32a35 678 dentry = xattr_lookup(inode, name, XATTR_REPLACE);
3227e14c
JM
679 if (IS_ERR(dentry)) {
680 err = PTR_ERR(dentry);
bd4c625c
LT
681 goto out;
682 }
683
8b6dd72a 684 down_read(&REISERFS_I(inode)->i_xattr_sem);
d984561b 685
2b0143b5 686 isize = i_size_read(d_inode(dentry));
bd4c625c
LT
687
688 /* Just return the size needed */
689 if (buffer == NULL) {
690 err = isize - sizeof(struct reiserfs_xattr_header);
8b6dd72a 691 goto out_unlock;
bd4c625c
LT
692 }
693
694 if (buffer_size < isize - sizeof(struct reiserfs_xattr_header)) {
695 err = -ERANGE;
8b6dd72a 696 goto out_unlock;
bd4c625c
LT
697 }
698
699 while (file_pos < isize) {
700 size_t chunk;
701 char *data;
702 size_t skip = 0;
f3fb9e27 703
09cbfeaf
KS
704 if (isize - file_pos > PAGE_SIZE)
705 chunk = PAGE_SIZE;
bd4c625c
LT
706 else
707 chunk = isize - file_pos;
708
2b0143b5 709 page = reiserfs_get_page(d_inode(dentry), file_pos);
bd4c625c
LT
710 if (IS_ERR(page)) {
711 err = PTR_ERR(page);
8b6dd72a 712 goto out_unlock;
bd4c625c
LT
713 }
714
715 lock_page(page);
716 data = page_address(page);
717 if (file_pos == 0) {
718 struct reiserfs_xattr_header *rxh =
719 (struct reiserfs_xattr_header *)data;
720 skip = file_pos = sizeof(struct reiserfs_xattr_header);
721 chunk -= skip;
722 /* Magic doesn't match up.. */
723 if (rxh->h_magic != cpu_to_le32(REISERFS_XATTR_MAGIC)) {
724 unlock_page(page);
725 reiserfs_put_page(page);
a72bdb1c 726 reiserfs_warning(inode->i_sb, "jdm-20001",
bd4c625c
LT
727 "Invalid magic for xattr (%s) "
728 "associated with %k", name,
729 INODE_PKEY(inode));
730 err = -EIO;
8b6dd72a 731 goto out_unlock;
bd4c625c
LT
732 }
733 hash = le32_to_cpu(rxh->h_hash);
734 }
735 memcpy(buffer + buffer_pos, data + skip, chunk);
736 unlock_page(page);
737 reiserfs_put_page(page);
738 file_pos += chunk;
739 buffer_pos += chunk;
740 skip = 0;
741 }
742 err = isize - sizeof(struct reiserfs_xattr_header);
743
744 if (xattr_hash(buffer, isize - sizeof(struct reiserfs_xattr_header)) !=
745 hash) {
a72bdb1c 746 reiserfs_warning(inode->i_sb, "jdm-20002",
bd4c625c
LT
747 "Invalid hash for xattr (%s) associated "
748 "with %k", name, INODE_PKEY(inode));
749 err = -EIO;
750 }
751
8b6dd72a
JM
752out_unlock:
753 up_read(&REISERFS_I(inode)->i_xattr_sem);
3227e14c 754 dput(dentry);
bd4c625c 755
a72bdb1c 756out:
bd4c625c 757 return err;
1da177e4
LT
758}
759
48b32a35
JM
760/*
761 * In order to implement different sets of xattr operations for each xattr
762 * prefix with the generic xattr API, a filesystem should create a
763 * null-terminated array of struct xattr_handler (one for each prefix) and
764 * hang a pointer to it off of the s_xattr field of the superblock.
765 *
766 * The generic_fooxattr() functions will use this list to dispatch xattr
767 * operations to the correct xattr_handler.
768 */
769#define for_each_xattr_handler(handlers, handler) \
770 for ((handler) = *(handlers)++; \
771 (handler) != NULL; \
772 (handler) = *(handlers)++)
1da177e4 773
387b96a5
CB
774static inline bool reiserfs_posix_acl_list(const char *name,
775 struct dentry *dentry)
776{
777 return (posix_acl_type(name) >= 0) &&
778 IS_POSIXACL(d_backing_inode(dentry));
779}
780
48b32a35 781/* This is the implementation for the xattr plugin infrastructure */
387b96a5
CB
782static inline bool reiserfs_xattr_list(const struct xattr_handler **handlers,
783 const char *name, struct dentry *dentry)
1da177e4 784{
387b96a5
CB
785 if (handlers) {
786 const struct xattr_handler *xah = NULL;
bd4c625c 787
387b96a5
CB
788 for_each_xattr_handler(handlers, xah) {
789 const char *prefix = xattr_prefix(xah);
bd4c625c 790
387b96a5
CB
791 if (strncmp(prefix, name, strlen(prefix)))
792 continue;
793
794 if (!xattr_handler_can_list(xah, dentry))
795 return false;
796
797 return true;
798 }
bd4c625c
LT
799 }
800
387b96a5 801 return reiserfs_posix_acl_list(name, dentry);
bd4c625c 802}
1da177e4 803
48b32a35 804struct listxattr_buf {
4acf381e 805 struct dir_context ctx;
48b32a35
JM
806 size_t size;
807 size_t pos;
808 char *buf;
431547b3 809 struct dentry *dentry;
1da177e4
LT
810};
811
25885a35 812static bool listxattr_filler(struct dir_context *ctx, const char *name,
ac7576f4
MS
813 int namelen, loff_t offset, u64 ino,
814 unsigned int d_type)
1da177e4 815{
ac7576f4
MS
816 struct listxattr_buf *b =
817 container_of(ctx, struct listxattr_buf, ctx);
48b32a35 818 size_t size;
f3fb9e27 819
48b32a35
JM
820 if (name[0] != '.' ||
821 (namelen != 1 && (name[1] != '.' || namelen != 2))) {
387b96a5
CB
822 if (!reiserfs_xattr_list(b->dentry->d_sb->s_xattr, name,
823 b->dentry))
25885a35 824 return true;
764a5c6b 825 size = namelen + 1;
48b32a35 826 if (b->buf) {
a13f085d
JH
827 if (b->pos + size > b->size) {
828 b->pos = -ERANGE;
25885a35 829 return false;
a13f085d 830 }
764a5c6b
AG
831 memcpy(b->buf + b->pos, name, namelen);
832 b->buf[b->pos + namelen] = 0;
bd4c625c 833 }
48b32a35
JM
834 b->pos += size;
835 }
25885a35 836 return true;
1da177e4 837}
bd4c625c 838
1da177e4
LT
839/*
840 * Inode operation listxattr()
841 *
48b32a35
JM
842 * We totally ignore the generic listxattr here because it would be stupid
843 * not to. Since the xattrs are organized in a directory, we can just
844 * readdir to find them.
1da177e4 845 */
bd4c625c 846ssize_t reiserfs_listxattr(struct dentry * dentry, char *buffer, size_t size)
1da177e4 847{
bd4c625c
LT
848 struct dentry *dir;
849 int err = 0;
48b32a35 850 struct listxattr_buf buf = {
4acf381e 851 .ctx.actor = listxattr_filler,
431547b3 852 .dentry = dentry,
48b32a35
JM
853 .buf = buffer,
854 .size = buffer ? size : 0,
855 };
bd4c625c 856
2b0143b5 857 if (d_really_is_negative(dentry))
bd4c625c
LT
858 return -EINVAL;
859
60e4cf67 860 if (get_inode_sd_version(d_inode(dentry)) == STAT_DATA_V1)
bd4c625c
LT
861 return -EOPNOTSUPP;
862
2b0143b5 863 dir = open_xa_dir(d_inode(dentry), XATTR_REPLACE);
bd4c625c
LT
864 if (IS_ERR(dir)) {
865 err = PTR_ERR(dir);
866 if (err == -ENODATA)
48b32a35 867 err = 0; /* Not an error if there aren't any xattrs */
bd4c625c
LT
868 goto out;
869 }
870
5955102c 871 inode_lock_nested(d_inode(dir), I_MUTEX_XATTR);
2b0143b5 872 err = reiserfs_readdir_inode(d_inode(dir), &buf.ctx);
5955102c 873 inode_unlock(d_inode(dir));
bd4c625c 874
48b32a35
JM
875 if (!err)
876 err = buf.pos;
bd4c625c 877
3227e14c 878 dput(dir);
8b6dd72a 879out:
bd4c625c 880 return err;
1da177e4
LT
881}
882
a72bdb1c 883static int create_privroot(struct dentry *dentry)
1da177e4 884{
a72bdb1c 885 int err;
2b0143b5 886 struct inode *inode = d_inode(dentry->d_parent);
f3fb9e27 887
5955102c 888 WARN_ON_ONCE(!inode_is_locked(inode));
5a6059c3 889
6c17675e 890 err = xattr_mkdir(inode, dentry, 0700);
2b0143b5 891 if (err || d_really_is_negative(dentry)) {
edcc37a0
AV
892 reiserfs_warning(dentry->d_sb, "jdm-20006",
893 "xattrs/ACLs enabled and couldn't "
894 "find/create .reiserfs_priv. "
895 "Failing mount.");
896 return -EOPNOTSUPP;
bd4c625c
LT
897 }
898
d9f892b9 899 reiserfs_init_priv_inode(d_inode(dentry));
edcc37a0
AV
900 reiserfs_info(dentry->d_sb, "Created %s - reserved for xattr "
901 "storage.\n", PRIVROOT_NAME);
bd4c625c 902
edcc37a0 903 return 0;
1da177e4
LT
904}
905
12abb35a
JM
906#else
907int __init reiserfs_xattr_register_handlers(void) { return 0; }
908void reiserfs_xattr_unregister_handlers(void) {}
909static int create_privroot(struct dentry *dentry) { return 0; }
910#endif
911
912/* Actual operations that are exported to VFS-land */
60e4cf67 913const struct xattr_handler *reiserfs_xattr_handlers[] = {
12abb35a
JM
914#ifdef CONFIG_REISERFS_FS_XATTR
915 &reiserfs_xattr_user_handler,
916 &reiserfs_xattr_trusted_handler,
917#endif
918#ifdef CONFIG_REISERFS_FS_SECURITY
919 &reiserfs_xattr_security_handler,
12abb35a
JM
920#endif
921 NULL
922};
923
a72bdb1c 924static int xattr_mount_check(struct super_block *s)
1da177e4 925{
098297b2
JM
926 /*
927 * We need generation numbers to ensure that the oid mapping is correct
928 * v3.5 filesystems don't have them.
929 */
48b32a35
JM
930 if (old_format_only(s)) {
931 if (reiserfs_xattrs_optional(s)) {
098297b2
JM
932 /*
933 * Old format filesystem, but optional xattrs have
934 * been enabled. Error out.
935 */
48b32a35
JM
936 reiserfs_warning(s, "jdm-2005",
937 "xattrs/ACLs not supported "
938 "on pre-v3.6 format filesystems. "
939 "Failing mount.");
940 return -EOPNOTSUPP;
941 }
a72bdb1c
JM
942 }
943
944 return 0;
1da177e4
LT
945}
946
4609e1f1 947int reiserfs_permission(struct mnt_idmap *idmap, struct inode *inode,
549c7297 948 int mask)
b83674c0
JM
949{
950 /*
951 * We don't do permission checks on the internal objects.
952 * Permissions are determined by the "owning" object.
953 */
954 if (IS_PRIVATE(inode))
955 return 0;
956
4609e1f1 957 return generic_permission(&nop_mnt_idmap, inode, mask);
b83674c0
JM
958}
959
0b728e19 960static int xattr_hide_revalidate(struct dentry *dentry, unsigned int flags)
1da177e4 961{
cac36f70 962 return -EPERM;
1da177e4
LT
963}
964
e16404ed 965static const struct dentry_operations xattr_lookup_poison_ops = {
cac36f70 966 .d_revalidate = xattr_hide_revalidate,
1da177e4
LT
967};
968
edcc37a0
AV
969int reiserfs_lookup_privroot(struct super_block *s)
970{
971 struct dentry *dentry;
972 int err = 0;
973
974 /* If we don't have the privroot located yet - go find it */
5955102c 975 inode_lock(d_inode(s->s_root));
edcc37a0
AV
976 dentry = lookup_one_len(PRIVROOT_NAME, s->s_root,
977 strlen(PRIVROOT_NAME));
978 if (!IS_ERR(dentry)) {
979 REISERFS_SB(s)->priv_root = dentry;
fb045adb 980 d_set_d_op(dentry, &xattr_lookup_poison_ops);
d9f892b9
CB
981 if (d_really_is_positive(dentry))
982 reiserfs_init_priv_inode(d_inode(dentry));
edcc37a0
AV
983 } else
984 err = PTR_ERR(dentry);
5955102c 985 inode_unlock(d_inode(s->s_root));
edcc37a0
AV
986
987 return err;
988}
989
098297b2
JM
990/*
991 * We need to take a copy of the mount flags since things like
1751e8a6 992 * SB_RDONLY don't get set until *after* we're called.
098297b2
JM
993 * mount_flags != mount_options
994 */
bd4c625c 995int reiserfs_xattr_init(struct super_block *s, int mount_flags)
1da177e4 996{
bd4c625c 997 int err = 0;
ab17c4f0 998 struct dentry *privroot = REISERFS_SB(s)->priv_root;
bd4c625c 999
a72bdb1c
JM
1000 err = xattr_mount_check(s);
1001 if (err)
bd4c625c 1002 goto error;
bd4c625c 1003
1751e8a6 1004 if (d_really_is_negative(privroot) && !(mount_flags & SB_RDONLY)) {
5955102c 1005 inode_lock(d_inode(s->s_root));
edcc37a0 1006 err = create_privroot(REISERFS_SB(s)->priv_root);
5955102c 1007 inode_unlock(d_inode(s->s_root));
bd4c625c 1008 }
ab17c4f0 1009
2b0143b5 1010 if (d_really_is_positive(privroot)) {
5955102c 1011 inode_lock(d_inode(privroot));
ab17c4f0
JM
1012 if (!REISERFS_SB(s)->xattr_root) {
1013 struct dentry *dentry;
f3fb9e27 1014
ab17c4f0
JM
1015 dentry = lookup_one_len(XAROOT_NAME, privroot,
1016 strlen(XAROOT_NAME));
1017 if (!IS_ERR(dentry))
1018 REISERFS_SB(s)->xattr_root = dentry;
1019 else
1020 err = PTR_ERR(dentry);
1021 }
5955102c 1022 inode_unlock(d_inode(privroot));
ab17c4f0 1023 }
48b32a35 1024
a72bdb1c 1025error:
bd4c625c 1026 if (err) {
a228bf8f
JM
1027 clear_bit(REISERFS_XATTRS_USER, &REISERFS_SB(s)->s_mount_opt);
1028 clear_bit(REISERFS_POSIXACL, &REISERFS_SB(s)->s_mount_opt);
bd4c625c
LT
1029 }
1030
1751e8a6 1031 /* The super_block SB_POSIXACL must mirror the (no)acl mount option. */
bd4c625c 1032 if (reiserfs_posixacl(s))
1751e8a6 1033 s->s_flags |= SB_POSIXACL;
ab17c4f0 1034 else
1751e8a6 1035 s->s_flags &= ~SB_POSIXACL;
bd4c625c
LT
1036
1037 return err;
1da177e4 1038}