diff options
-rw-r--r-- | fs/gfs2/dir.c | 3 | ||||
-rw-r--r-- | fs/gfs2/dir.h | 34 | ||||
-rw-r--r-- | fs/gfs2/export.c | 9 | ||||
-rw-r--r-- | fs/gfs2/main.c | 4 | ||||
-rw-r--r-- | fs/gfs2/ops_inode.c | 24 |
5 files changed, 33 insertions, 41 deletions
diff --git a/fs/gfs2/dir.c b/fs/gfs2/dir.c index c1042ae438cc..5c356d09c321 100644 --- a/fs/gfs2/dir.c +++ b/fs/gfs2/dir.c | |||
@@ -79,6 +79,9 @@ | |||
79 | #define gfs2_disk_hash2offset(h) (((u64)(h)) >> 1) | 79 | #define gfs2_disk_hash2offset(h) (((u64)(h)) >> 1) |
80 | #define gfs2_dir_offset2hash(p) ((u32)(((u64)(p)) << 1)) | 80 | #define gfs2_dir_offset2hash(p) ((u32)(((u64)(p)) << 1)) |
81 | 81 | ||
82 | struct qstr gfs2_qdot __read_mostly; | ||
83 | struct qstr gfs2_qdotdot __read_mostly; | ||
84 | |||
82 | typedef int (*leaf_call_t) (struct gfs2_inode *dip, u32 index, u32 len, | 85 | typedef int (*leaf_call_t) (struct gfs2_inode *dip, u32 index, u32 len, |
83 | u64 leaf_no, void *data); | 86 | u64 leaf_no, void *data); |
84 | typedef int (*gfs2_dscan_t)(const struct gfs2_dirent *dent, | 87 | typedef int (*gfs2_dscan_t)(const struct gfs2_dirent *dent, |
diff --git a/fs/gfs2/dir.h b/fs/gfs2/dir.h index 4f919440c3be..a98f644bd3df 100644 --- a/fs/gfs2/dir.h +++ b/fs/gfs2/dir.h | |||
@@ -17,23 +17,24 @@ struct inode; | |||
17 | struct gfs2_inode; | 17 | struct gfs2_inode; |
18 | struct gfs2_inum; | 18 | struct gfs2_inum; |
19 | 19 | ||
20 | struct inode *gfs2_dir_search(struct inode *dir, const struct qstr *filename); | 20 | extern struct inode *gfs2_dir_search(struct inode *dir, |
21 | int gfs2_dir_check(struct inode *dir, const struct qstr *filename, | 21 | const struct qstr *filename); |
22 | const struct gfs2_inode *ip); | 22 | extern int gfs2_dir_check(struct inode *dir, const struct qstr *filename, |
23 | int gfs2_dir_add(struct inode *inode, const struct qstr *filename, | 23 | const struct gfs2_inode *ip); |
24 | const struct gfs2_inode *ip, unsigned int type); | 24 | extern int gfs2_dir_add(struct inode *inode, const struct qstr *filename, |
25 | int gfs2_dir_del(struct gfs2_inode *dip, const struct qstr *filename); | 25 | const struct gfs2_inode *ip, unsigned int type); |
26 | int gfs2_dir_read(struct inode *inode, u64 *offset, void *opaque, | 26 | extern int gfs2_dir_del(struct gfs2_inode *dip, const struct qstr *filename); |
27 | filldir_t filldir); | 27 | extern int gfs2_dir_read(struct inode *inode, u64 *offset, void *opaque, |
28 | int gfs2_dir_mvino(struct gfs2_inode *dip, const struct qstr *filename, | 28 | filldir_t filldir); |
29 | const struct gfs2_inode *nip, unsigned int new_type); | 29 | extern int gfs2_dir_mvino(struct gfs2_inode *dip, const struct qstr *filename, |
30 | const struct gfs2_inode *nip, unsigned int new_type); | ||
30 | 31 | ||
31 | int gfs2_dir_exhash_dealloc(struct gfs2_inode *dip); | 32 | extern int gfs2_dir_exhash_dealloc(struct gfs2_inode *dip); |
32 | 33 | ||
33 | int gfs2_diradd_alloc_required(struct inode *dir, | 34 | extern int gfs2_diradd_alloc_required(struct inode *dir, |
34 | const struct qstr *filename); | 35 | const struct qstr *filename); |
35 | int gfs2_dir_get_new_buffer(struct gfs2_inode *ip, u64 block, | 36 | extern int gfs2_dir_get_new_buffer(struct gfs2_inode *ip, u64 block, |
36 | struct buffer_head **bhp); | 37 | struct buffer_head **bhp); |
37 | 38 | ||
38 | static inline u32 gfs2_disk_hash(const char *data, int len) | 39 | static inline u32 gfs2_disk_hash(const char *data, int len) |
39 | { | 40 | { |
@@ -61,4 +62,7 @@ static inline void gfs2_qstr2dirent(const struct qstr *name, u16 reclen, struct | |||
61 | memcpy(dent + 1, name->name, name->len); | 62 | memcpy(dent + 1, name->name, name->len); |
62 | } | 63 | } |
63 | 64 | ||
65 | extern struct qstr gfs2_qdot; | ||
66 | extern struct qstr gfs2_qdotdot; | ||
67 | |||
64 | #endif /* __DIR_DOT_H__ */ | 68 | #endif /* __DIR_DOT_H__ */ |
diff --git a/fs/gfs2/export.c b/fs/gfs2/export.c index dfe237a3f8ad..06d582732d34 100644 --- a/fs/gfs2/export.c +++ b/fs/gfs2/export.c | |||
@@ -126,16 +126,9 @@ static int gfs2_get_name(struct dentry *parent, char *name, | |||
126 | 126 | ||
127 | static struct dentry *gfs2_get_parent(struct dentry *child) | 127 | static struct dentry *gfs2_get_parent(struct dentry *child) |
128 | { | 128 | { |
129 | struct qstr dotdot; | ||
130 | struct dentry *dentry; | 129 | struct dentry *dentry; |
131 | 130 | ||
132 | /* | 131 | dentry = d_obtain_alias(gfs2_lookupi(child->d_inode, &gfs2_qdotdot, 1)); |
133 | * XXX(hch): it would be a good idea to keep this around as a | ||
134 | * static variable. | ||
135 | */ | ||
136 | gfs2_str2qstr(&dotdot, ".."); | ||
137 | |||
138 | dentry = d_obtain_alias(gfs2_lookupi(child->d_inode, &dotdot, 1)); | ||
139 | if (!IS_ERR(dentry)) | 132 | if (!IS_ERR(dentry)) |
140 | dentry->d_op = &gfs2_dops; | 133 | dentry->d_op = &gfs2_dops; |
141 | return dentry; | 134 | return dentry; |
diff --git a/fs/gfs2/main.c b/fs/gfs2/main.c index 1c8bbf29e602..d7eb1e209aa8 100644 --- a/fs/gfs2/main.c +++ b/fs/gfs2/main.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include "glock.h" | 24 | #include "glock.h" |
25 | #include "quota.h" | 25 | #include "quota.h" |
26 | #include "recovery.h" | 26 | #include "recovery.h" |
27 | #include "dir.h" | ||
27 | 28 | ||
28 | static struct shrinker qd_shrinker = { | 29 | static struct shrinker qd_shrinker = { |
29 | .shrink = gfs2_shrink_qd_memory, | 30 | .shrink = gfs2_shrink_qd_memory, |
@@ -78,6 +79,9 @@ static int __init init_gfs2_fs(void) | |||
78 | { | 79 | { |
79 | int error; | 80 | int error; |
80 | 81 | ||
82 | gfs2_str2qstr(&gfs2_qdot, "."); | ||
83 | gfs2_str2qstr(&gfs2_qdotdot, ".."); | ||
84 | |||
81 | error = gfs2_sys_init(); | 85 | error = gfs2_sys_init(); |
82 | if (error) | 86 | if (error) |
83 | return error; | 87 | return error; |
diff --git a/fs/gfs2/ops_inode.c b/fs/gfs2/ops_inode.c index ce4f1dfb533f..98a94cfc2bb2 100644 --- a/fs/gfs2/ops_inode.c +++ b/fs/gfs2/ops_inode.c | |||
@@ -471,18 +471,15 @@ static int gfs2_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
471 | if (!gfs2_assert_withdraw(sdp, !error)) { | 471 | if (!gfs2_assert_withdraw(sdp, !error)) { |
472 | struct gfs2_dinode *di = (struct gfs2_dinode *)dibh->b_data; | 472 | struct gfs2_dinode *di = (struct gfs2_dinode *)dibh->b_data; |
473 | struct gfs2_dirent *dent = (struct gfs2_dirent *)(di+1); | 473 | struct gfs2_dirent *dent = (struct gfs2_dirent *)(di+1); |
474 | struct qstr str; | ||
475 | 474 | ||
476 | gfs2_str2qstr(&str, "."); | ||
477 | gfs2_trans_add_bh(ip->i_gl, dibh, 1); | 475 | gfs2_trans_add_bh(ip->i_gl, dibh, 1); |
478 | gfs2_qstr2dirent(&str, GFS2_DIRENT_SIZE(str.len), dent); | 476 | gfs2_qstr2dirent(&gfs2_qdot, GFS2_DIRENT_SIZE(gfs2_qdot.len), dent); |
479 | dent->de_inum = di->di_num; /* already GFS2 endian */ | 477 | dent->de_inum = di->di_num; /* already GFS2 endian */ |
480 | dent->de_type = cpu_to_be16(DT_DIR); | 478 | dent->de_type = cpu_to_be16(DT_DIR); |
481 | di->di_entries = cpu_to_be32(1); | 479 | di->di_entries = cpu_to_be32(1); |
482 | 480 | ||
483 | gfs2_str2qstr(&str, ".."); | ||
484 | dent = (struct gfs2_dirent *)((char*)dent + GFS2_DIRENT_SIZE(1)); | 481 | dent = (struct gfs2_dirent *)((char*)dent + GFS2_DIRENT_SIZE(1)); |
485 | gfs2_qstr2dirent(&str, dibh->b_size - GFS2_DIRENT_SIZE(1) - sizeof(struct gfs2_dinode), dent); | 482 | gfs2_qstr2dirent(&gfs2_qdotdot, dibh->b_size - GFS2_DIRENT_SIZE(1) - sizeof(struct gfs2_dinode), dent); |
486 | 483 | ||
487 | gfs2_inum_out(dip, dent); | 484 | gfs2_inum_out(dip, dent); |
488 | dent->de_type = cpu_to_be16(DT_DIR); | 485 | dent->de_type = cpu_to_be16(DT_DIR); |
@@ -523,7 +520,6 @@ static int gfs2_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
523 | static int gfs2_rmdiri(struct gfs2_inode *dip, const struct qstr *name, | 520 | static int gfs2_rmdiri(struct gfs2_inode *dip, const struct qstr *name, |
524 | struct gfs2_inode *ip) | 521 | struct gfs2_inode *ip) |
525 | { | 522 | { |
526 | struct qstr dotname; | ||
527 | int error; | 523 | int error; |
528 | 524 | ||
529 | if (ip->i_entries != 2) { | 525 | if (ip->i_entries != 2) { |
@@ -540,13 +536,11 @@ static int gfs2_rmdiri(struct gfs2_inode *dip, const struct qstr *name, | |||
540 | if (error) | 536 | if (error) |
541 | return error; | 537 | return error; |
542 | 538 | ||
543 | gfs2_str2qstr(&dotname, "."); | 539 | error = gfs2_dir_del(ip, &gfs2_qdot); |
544 | error = gfs2_dir_del(ip, &dotname); | ||
545 | if (error) | 540 | if (error) |
546 | return error; | 541 | return error; |
547 | 542 | ||
548 | gfs2_str2qstr(&dotname, ".."); | 543 | error = gfs2_dir_del(ip, &gfs2_qdotdot); |
549 | error = gfs2_dir_del(ip, &dotname); | ||
550 | if (error) | 544 | if (error) |
551 | return error; | 545 | return error; |
552 | 546 | ||
@@ -695,11 +689,8 @@ static int gfs2_ok_to_move(struct gfs2_inode *this, struct gfs2_inode *to) | |||
695 | struct inode *dir = &to->i_inode; | 689 | struct inode *dir = &to->i_inode; |
696 | struct super_block *sb = dir->i_sb; | 690 | struct super_block *sb = dir->i_sb; |
697 | struct inode *tmp; | 691 | struct inode *tmp; |
698 | struct qstr dotdot; | ||
699 | int error = 0; | 692 | int error = 0; |
700 | 693 | ||
701 | gfs2_str2qstr(&dotdot, ".."); | ||
702 | |||
703 | igrab(dir); | 694 | igrab(dir); |
704 | 695 | ||
705 | for (;;) { | 696 | for (;;) { |
@@ -712,7 +703,7 @@ static int gfs2_ok_to_move(struct gfs2_inode *this, struct gfs2_inode *to) | |||
712 | break; | 703 | break; |
713 | } | 704 | } |
714 | 705 | ||
715 | tmp = gfs2_lookupi(dir, &dotdot, 1); | 706 | tmp = gfs2_lookupi(dir, &gfs2_qdotdot, 1); |
716 | if (IS_ERR(tmp)) { | 707 | if (IS_ERR(tmp)) { |
717 | error = PTR_ERR(tmp); | 708 | error = PTR_ERR(tmp); |
718 | break; | 709 | break; |
@@ -921,9 +912,6 @@ static int gfs2_rename(struct inode *odir, struct dentry *odentry, | |||
921 | } | 912 | } |
922 | 913 | ||
923 | if (dir_rename) { | 914 | if (dir_rename) { |
924 | struct qstr name; | ||
925 | gfs2_str2qstr(&name, ".."); | ||
926 | |||
927 | error = gfs2_change_nlink(ndip, +1); | 915 | error = gfs2_change_nlink(ndip, +1); |
928 | if (error) | 916 | if (error) |
929 | goto out_end_trans; | 917 | goto out_end_trans; |
@@ -931,7 +919,7 @@ static int gfs2_rename(struct inode *odir, struct dentry *odentry, | |||
931 | if (error) | 919 | if (error) |
932 | goto out_end_trans; | 920 | goto out_end_trans; |
933 | 921 | ||
934 | error = gfs2_dir_mvino(ip, &name, ndip, DT_DIR); | 922 | error = gfs2_dir_mvino(ip, &gfs2_qdotdot, ndip, DT_DIR); |
935 | if (error) | 923 | if (error) |
936 | goto out_end_trans; | 924 | goto out_end_trans; |
937 | } else { | 925 | } else { |