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