diff options
Diffstat (limited to 'fs/reiserfs/xattr.c')
-rw-r--r-- | fs/reiserfs/xattr.c | 110 |
1 files changed, 30 insertions, 80 deletions
diff --git a/fs/reiserfs/xattr.c b/fs/reiserfs/xattr.c index eba037b3338f..344b9b96cc56 100644 --- a/fs/reiserfs/xattr.c +++ b/fs/reiserfs/xattr.c | |||
@@ -191,28 +191,11 @@ static struct dentry *get_xa_file_dentry(const struct inode *inode, | |||
191 | dput(xadir); | 191 | dput(xadir); |
192 | if (err) | 192 | if (err) |
193 | xafile = ERR_PTR(err); | 193 | xafile = ERR_PTR(err); |
194 | return xafile; | ||
195 | } | ||
196 | |||
197 | /* Opens a file pointer to the attribute associated with inode */ | ||
198 | static struct file *open_xa_file(const struct inode *inode, const char *name, | ||
199 | int flags) | ||
200 | { | ||
201 | struct dentry *xafile; | ||
202 | struct file *fp; | ||
203 | |||
204 | xafile = get_xa_file_dentry(inode, name, flags); | ||
205 | if (IS_ERR(xafile)) | ||
206 | return ERR_PTR(PTR_ERR(xafile)); | ||
207 | else if (!xafile->d_inode) { | 194 | else if (!xafile->d_inode) { |
208 | dput(xafile); | 195 | dput(xafile); |
209 | return ERR_PTR(-ENODATA); | 196 | xafile = ERR_PTR(-ENODATA); |
210 | } | 197 | } |
211 | 198 | return xafile; | |
212 | fp = dentry_open(xafile, NULL, O_RDWR); | ||
213 | /* dentry_open dputs the dentry if it fails */ | ||
214 | |||
215 | return fp; | ||
216 | } | 199 | } |
217 | 200 | ||
218 | /* | 201 | /* |
@@ -228,9 +211,8 @@ static struct file *open_xa_file(const struct inode *inode, const char *name, | |||
228 | * we're called with i_mutex held, so there are no worries about the directory | 211 | * we're called with i_mutex held, so there are no worries about the directory |
229 | * changing underneath us. | 212 | * changing underneath us. |
230 | */ | 213 | */ |
231 | static int __xattr_readdir(struct file *filp, void *dirent, filldir_t filldir) | 214 | static int __xattr_readdir(struct inode *inode, void *dirent, filldir_t filldir) |
232 | { | 215 | { |
233 | struct inode *inode = filp->f_path.dentry->d_inode; | ||
234 | struct cpu_key pos_key; /* key of current position in the directory (key of directory entry) */ | 216 | struct cpu_key pos_key; /* key of current position in the directory (key of directory entry) */ |
235 | INITIALIZE_PATH(path_to_entry); | 217 | INITIALIZE_PATH(path_to_entry); |
236 | struct buffer_head *bh; | 218 | struct buffer_head *bh; |
@@ -374,23 +356,16 @@ static int __xattr_readdir(struct file *filp, void *dirent, filldir_t filldir) | |||
374 | * | 356 | * |
375 | */ | 357 | */ |
376 | static | 358 | static |
377 | int xattr_readdir(struct file *file, filldir_t filler, void *buf) | 359 | int xattr_readdir(struct inode *inode, filldir_t filler, void *buf) |
378 | { | 360 | { |
379 | struct inode *inode = file->f_path.dentry->d_inode; | 361 | int res = -ENOENT; |
380 | int res = -ENOTDIR; | ||
381 | if (!file->f_op || !file->f_op->readdir) | ||
382 | goto out; | ||
383 | mutex_lock_nested(&inode->i_mutex, I_MUTEX_XATTR); | 362 | mutex_lock_nested(&inode->i_mutex, I_MUTEX_XATTR); |
384 | // down(&inode->i_zombie); | ||
385 | res = -ENOENT; | ||
386 | if (!IS_DEADDIR(inode)) { | 363 | if (!IS_DEADDIR(inode)) { |
387 | lock_kernel(); | 364 | lock_kernel(); |
388 | res = __xattr_readdir(file, buf, filler); | 365 | res = __xattr_readdir(inode, buf, filler); |
389 | unlock_kernel(); | 366 | unlock_kernel(); |
390 | } | 367 | } |
391 | // up(&inode->i_zombie); | ||
392 | mutex_unlock(&inode->i_mutex); | 368 | mutex_unlock(&inode->i_mutex); |
393 | out: | ||
394 | return res; | 369 | return res; |
395 | } | 370 | } |
396 | 371 | ||
@@ -442,7 +417,7 @@ reiserfs_xattr_set(struct inode *inode, const char *name, const void *buffer, | |||
442 | size_t buffer_size, int flags) | 417 | size_t buffer_size, int flags) |
443 | { | 418 | { |
444 | int err = 0; | 419 | int err = 0; |
445 | struct file *fp; | 420 | struct dentry *dentry; |
446 | struct page *page; | 421 | struct page *page; |
447 | char *data; | 422 | char *data; |
448 | struct address_space *mapping; | 423 | struct address_space *mapping; |
@@ -460,18 +435,18 @@ reiserfs_xattr_set(struct inode *inode, const char *name, const void *buffer, | |||
460 | xahash = xattr_hash(buffer, buffer_size); | 435 | xahash = xattr_hash(buffer, buffer_size); |
461 | 436 | ||
462 | open_file: | 437 | open_file: |
463 | fp = open_xa_file(inode, name, flags); | 438 | dentry = get_xa_file_dentry(inode, name, flags); |
464 | if (IS_ERR(fp)) { | 439 | if (IS_ERR(dentry)) { |
465 | err = PTR_ERR(fp); | 440 | err = PTR_ERR(dentry); |
466 | goto out; | 441 | goto out; |
467 | } | 442 | } |
468 | 443 | ||
469 | xinode = fp->f_path.dentry->d_inode; | 444 | xinode = dentry->d_inode; |
470 | REISERFS_I(inode)->i_flags |= i_has_xattr_dir; | 445 | REISERFS_I(inode)->i_flags |= i_has_xattr_dir; |
471 | 446 | ||
472 | /* we need to copy it off.. */ | 447 | /* we need to copy it off.. */ |
473 | if (xinode->i_nlink > 1) { | 448 | if (xinode->i_nlink > 1) { |
474 | fput(fp); | 449 | dput(dentry); |
475 | err = reiserfs_xattr_del(inode, name); | 450 | err = reiserfs_xattr_del(inode, name); |
476 | if (err < 0) | 451 | if (err < 0) |
477 | goto out; | 452 | goto out; |
@@ -485,7 +460,7 @@ reiserfs_xattr_set(struct inode *inode, const char *name, const void *buffer, | |||
485 | newattrs.ia_size = buffer_size; | 460 | newattrs.ia_size = buffer_size; |
486 | newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME; | 461 | newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME; |
487 | mutex_lock_nested(&xinode->i_mutex, I_MUTEX_XATTR); | 462 | mutex_lock_nested(&xinode->i_mutex, I_MUTEX_XATTR); |
488 | err = notify_change(fp->f_path.dentry, &newattrs); | 463 | err = notify_change(dentry, &newattrs); |
489 | if (err) | 464 | if (err) |
490 | goto out_filp; | 465 | goto out_filp; |
491 | 466 | ||
@@ -518,15 +493,14 @@ reiserfs_xattr_set(struct inode *inode, const char *name, const void *buffer, | |||
518 | rxh->h_hash = cpu_to_le32(xahash); | 493 | rxh->h_hash = cpu_to_le32(xahash); |
519 | } | 494 | } |
520 | 495 | ||
521 | err = reiserfs_prepare_write(fp, page, page_offset, | 496 | err = reiserfs_prepare_write(NULL, page, page_offset, |
522 | page_offset + chunk + skip); | 497 | page_offset + chunk + skip); |
523 | if (!err) { | 498 | if (!err) { |
524 | if (buffer) | 499 | if (buffer) |
525 | memcpy(data + skip, buffer + buffer_pos, chunk); | 500 | memcpy(data + skip, buffer + buffer_pos, chunk); |
526 | err = | 501 | err = reiserfs_commit_write(NULL, page, page_offset, |
527 | reiserfs_commit_write(fp, page, page_offset, | 502 | page_offset + chunk + |
528 | page_offset + chunk + | 503 | skip); |
529 | skip); | ||
530 | } | 504 | } |
531 | unlock_page(page); | 505 | unlock_page(page); |
532 | reiserfs_put_page(page); | 506 | reiserfs_put_page(page); |
@@ -548,7 +522,7 @@ reiserfs_xattr_set(struct inode *inode, const char *name, const void *buffer, | |||
548 | 522 | ||
549 | out_filp: | 523 | out_filp: |
550 | mutex_unlock(&xinode->i_mutex); | 524 | mutex_unlock(&xinode->i_mutex); |
551 | fput(fp); | 525 | dput(dentry); |
552 | 526 | ||
553 | out: | 527 | out: |
554 | return err; | 528 | return err; |
@@ -562,7 +536,7 @@ reiserfs_xattr_get(const struct inode *inode, const char *name, void *buffer, | |||
562 | size_t buffer_size) | 536 | size_t buffer_size) |
563 | { | 537 | { |
564 | ssize_t err = 0; | 538 | ssize_t err = 0; |
565 | struct file *fp; | 539 | struct dentry *dentry; |
566 | size_t isize; | 540 | size_t isize; |
567 | size_t file_pos = 0; | 541 | size_t file_pos = 0; |
568 | size_t buffer_pos = 0; | 542 | size_t buffer_pos = 0; |
@@ -578,13 +552,13 @@ reiserfs_xattr_get(const struct inode *inode, const char *name, void *buffer, | |||
578 | if (get_inode_sd_version(inode) == STAT_DATA_V1) | 552 | if (get_inode_sd_version(inode) == STAT_DATA_V1) |
579 | return -EOPNOTSUPP; | 553 | return -EOPNOTSUPP; |
580 | 554 | ||
581 | fp = open_xa_file(inode, name, FL_READONLY); | 555 | dentry = get_xa_file_dentry(inode, name, FL_READONLY); |
582 | if (IS_ERR(fp)) { | 556 | if (IS_ERR(dentry)) { |
583 | err = PTR_ERR(fp); | 557 | err = PTR_ERR(dentry); |
584 | goto out; | 558 | goto out; |
585 | } | 559 | } |
586 | 560 | ||
587 | xinode = fp->f_path.dentry->d_inode; | 561 | xinode = dentry->d_inode; |
588 | isize = xinode->i_size; | 562 | isize = xinode->i_size; |
589 | REISERFS_I(inode)->i_flags |= i_has_xattr_dir; | 563 | REISERFS_I(inode)->i_flags |= i_has_xattr_dir; |
590 | 564 | ||
@@ -652,7 +626,7 @@ reiserfs_xattr_get(const struct inode *inode, const char *name, void *buffer, | |||
652 | } | 626 | } |
653 | 627 | ||
654 | out_dput: | 628 | out_dput: |
655 | fput(fp); | 629 | dput(dentry); |
656 | 630 | ||
657 | out: | 631 | out: |
658 | return err; | 632 | return err; |
@@ -742,7 +716,6 @@ reiserfs_delete_xattrs_filler(void *buf, const char *name, int namelen, | |||
742 | /* This is called w/ inode->i_mutex downed */ | 716 | /* This is called w/ inode->i_mutex downed */ |
743 | int reiserfs_delete_xattrs(struct inode *inode) | 717 | int reiserfs_delete_xattrs(struct inode *inode) |
744 | { | 718 | { |
745 | struct file *fp; | ||
746 | struct dentry *dir, *root; | 719 | struct dentry *dir, *root; |
747 | int err = 0; | 720 | int err = 0; |
748 | 721 | ||
@@ -763,15 +736,8 @@ int reiserfs_delete_xattrs(struct inode *inode) | |||
763 | return 0; | 736 | return 0; |
764 | } | 737 | } |
765 | 738 | ||
766 | fp = dentry_open(dir, NULL, O_RDWR); | ||
767 | if (IS_ERR(fp)) { | ||
768 | err = PTR_ERR(fp); | ||
769 | /* dentry_open dputs the dentry if it fails */ | ||
770 | goto out; | ||
771 | } | ||
772 | |||
773 | lock_kernel(); | 739 | lock_kernel(); |
774 | err = xattr_readdir(fp, reiserfs_delete_xattrs_filler, dir); | 740 | err = xattr_readdir(dir->d_inode, reiserfs_delete_xattrs_filler, dir); |
775 | if (err) { | 741 | if (err) { |
776 | unlock_kernel(); | 742 | unlock_kernel(); |
777 | goto out_dir; | 743 | goto out_dir; |
@@ -791,7 +757,7 @@ int reiserfs_delete_xattrs(struct inode *inode) | |||
791 | unlock_kernel(); | 757 | unlock_kernel(); |
792 | 758 | ||
793 | out_dir: | 759 | out_dir: |
794 | fput(fp); | 760 | dput(dir); |
795 | 761 | ||
796 | out: | 762 | out: |
797 | if (!err) | 763 | if (!err) |
@@ -833,7 +799,6 @@ reiserfs_chown_xattrs_filler(void *buf, const char *name, int namelen, | |||
833 | 799 | ||
834 | int reiserfs_chown_xattrs(struct inode *inode, struct iattr *attrs) | 800 | int reiserfs_chown_xattrs(struct inode *inode, struct iattr *attrs) |
835 | { | 801 | { |
836 | struct file *fp; | ||
837 | struct dentry *dir; | 802 | struct dentry *dir; |
838 | int err = 0; | 803 | int err = 0; |
839 | struct reiserfs_chown_buf buf; | 804 | struct reiserfs_chown_buf buf; |
@@ -857,13 +822,6 @@ int reiserfs_chown_xattrs(struct inode *inode, struct iattr *attrs) | |||
857 | goto out; | 822 | goto out; |
858 | } | 823 | } |
859 | 824 | ||
860 | fp = dentry_open(dir, NULL, O_RDWR); | ||
861 | if (IS_ERR(fp)) { | ||
862 | err = PTR_ERR(fp); | ||
863 | /* dentry_open dputs the dentry if it fails */ | ||
864 | goto out; | ||
865 | } | ||
866 | |||
867 | lock_kernel(); | 825 | lock_kernel(); |
868 | 826 | ||
869 | attrs->ia_valid &= (ATTR_UID | ATTR_GID | ATTR_CTIME); | 827 | attrs->ia_valid &= (ATTR_UID | ATTR_GID | ATTR_CTIME); |
@@ -871,7 +829,7 @@ int reiserfs_chown_xattrs(struct inode *inode, struct iattr *attrs) | |||
871 | buf.attrs = attrs; | 829 | buf.attrs = attrs; |
872 | buf.inode = inode; | 830 | buf.inode = inode; |
873 | 831 | ||
874 | err = xattr_readdir(fp, reiserfs_chown_xattrs_filler, &buf); | 832 | err = xattr_readdir(dir->d_inode, reiserfs_chown_xattrs_filler, &buf); |
875 | if (err) { | 833 | if (err) { |
876 | unlock_kernel(); | 834 | unlock_kernel(); |
877 | goto out_dir; | 835 | goto out_dir; |
@@ -881,7 +839,7 @@ int reiserfs_chown_xattrs(struct inode *inode, struct iattr *attrs) | |||
881 | unlock_kernel(); | 839 | unlock_kernel(); |
882 | 840 | ||
883 | out_dir: | 841 | out_dir: |
884 | fput(fp); | 842 | dput(dir); |
885 | 843 | ||
886 | out: | 844 | out: |
887 | attrs->ia_valid = ia_valid; | 845 | attrs->ia_valid = ia_valid; |
@@ -1029,7 +987,6 @@ reiserfs_listxattr_filler(void *buf, const char *name, int namelen, | |||
1029 | */ | 987 | */ |
1030 | ssize_t reiserfs_listxattr(struct dentry * dentry, char *buffer, size_t size) | 988 | ssize_t reiserfs_listxattr(struct dentry * dentry, char *buffer, size_t size) |
1031 | { | 989 | { |
1032 | struct file *fp; | ||
1033 | struct dentry *dir; | 990 | struct dentry *dir; |
1034 | int err = 0; | 991 | int err = 0; |
1035 | struct reiserfs_listxattr_buf buf; | 992 | struct reiserfs_listxattr_buf buf; |
@@ -1052,13 +1009,6 @@ ssize_t reiserfs_listxattr(struct dentry * dentry, char *buffer, size_t size) | |||
1052 | goto out; | 1009 | goto out; |
1053 | } | 1010 | } |
1054 | 1011 | ||
1055 | fp = dentry_open(dir, NULL, O_RDWR); | ||
1056 | if (IS_ERR(fp)) { | ||
1057 | err = PTR_ERR(fp); | ||
1058 | /* dentry_open dputs the dentry if it fails */ | ||
1059 | goto out; | ||
1060 | } | ||
1061 | |||
1062 | buf.r_buf = buffer; | 1012 | buf.r_buf = buffer; |
1063 | buf.r_size = buffer ? size : 0; | 1013 | buf.r_size = buffer ? size : 0; |
1064 | buf.r_pos = 0; | 1014 | buf.r_pos = 0; |
@@ -1066,7 +1016,7 @@ ssize_t reiserfs_listxattr(struct dentry * dentry, char *buffer, size_t size) | |||
1066 | 1016 | ||
1067 | REISERFS_I(dentry->d_inode)->i_flags |= i_has_xattr_dir; | 1017 | REISERFS_I(dentry->d_inode)->i_flags |= i_has_xattr_dir; |
1068 | 1018 | ||
1069 | err = xattr_readdir(fp, reiserfs_listxattr_filler, &buf); | 1019 | err = xattr_readdir(dir->d_inode, reiserfs_listxattr_filler, &buf); |
1070 | if (err) | 1020 | if (err) |
1071 | goto out_dir; | 1021 | goto out_dir; |
1072 | 1022 | ||
@@ -1076,7 +1026,7 @@ ssize_t reiserfs_listxattr(struct dentry * dentry, char *buffer, size_t size) | |||
1076 | err = buf.r_pos; | 1026 | err = buf.r_pos; |
1077 | 1027 | ||
1078 | out_dir: | 1028 | out_dir: |
1079 | fput(fp); | 1029 | dput(dir); |
1080 | 1030 | ||
1081 | out: | 1031 | out: |
1082 | reiserfs_read_unlock_xattr_i(dentry->d_inode); | 1032 | reiserfs_read_unlock_xattr_i(dentry->d_inode); |