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