aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/gfs2/inode.c36
-rw-r--r--fs/gfs2/inode.h2
-rw-r--r--fs/gfs2/ondisk.c4
-rw-r--r--fs/gfs2/ops_inode.c38
-rw-r--r--include/linux/gfs2_ondisk.h2
5 files changed, 22 insertions, 60 deletions
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
index 7ba05fc553aa..a99591956544 100644
--- a/fs/gfs2/inode.c
+++ b/fs/gfs2/inode.c
@@ -51,17 +51,6 @@ void gfs2_inode_attr_in(struct gfs2_inode *ip)
51 struct gfs2_dinode_host *di = &ip->i_di; 51 struct gfs2_dinode_host *di = &ip->i_di;
52 52
53 inode->i_ino = ip->i_num.no_addr; 53 inode->i_ino = ip->i_num.no_addr;
54
55 switch (di->di_mode & S_IFMT) {
56 case S_IFBLK:
57 case S_IFCHR:
58 inode->i_rdev = MKDEV(di->di_major, di->di_minor);
59 break;
60 default:
61 inode->i_rdev = 0;
62 break;
63 };
64
65 inode->i_mode = di->di_mode; 54 inode->i_mode = di->di_mode;
66 inode->i_nlink = di->di_nlink; 55 inode->i_nlink = di->di_nlink;
67 inode->i_uid = di->di_uid; 56 inode->i_uid = di->di_uid;
@@ -222,6 +211,15 @@ static int gfs2_dinode_in(struct gfs2_inode *ip, const void *buf)
222 return -ESTALE; 211 return -ESTALE;
223 212
224 di->di_mode = be32_to_cpu(str->di_mode); 213 di->di_mode = be32_to_cpu(str->di_mode);
214 ip->i_inode.i_rdev = 0;
215 switch (di->di_mode & S_IFMT) {
216 case S_IFBLK:
217 case S_IFCHR:
218 ip->i_inode.i_rdev = MKDEV(be32_to_cpu(str->di_major),
219 be32_to_cpu(str->di_minor));
220 break;
221 };
222
225 di->di_uid = be32_to_cpu(str->di_uid); 223 di->di_uid = be32_to_cpu(str->di_uid);
226 di->di_gid = be32_to_cpu(str->di_gid); 224 di->di_gid = be32_to_cpu(str->di_gid);
227 di->di_nlink = be32_to_cpu(str->di_nlink); 225 di->di_nlink = be32_to_cpu(str->di_nlink);
@@ -230,8 +228,6 @@ static int gfs2_dinode_in(struct gfs2_inode *ip, const void *buf)
230 di->di_atime = be64_to_cpu(str->di_atime); 228 di->di_atime = be64_to_cpu(str->di_atime);
231 di->di_mtime = be64_to_cpu(str->di_mtime); 229 di->di_mtime = be64_to_cpu(str->di_mtime);
232 di->di_ctime = be64_to_cpu(str->di_ctime); 230 di->di_ctime = be64_to_cpu(str->di_ctime);
233 di->di_major = be32_to_cpu(str->di_major);
234 di->di_minor = be32_to_cpu(str->di_minor);
235 231
236 di->di_goal_meta = be64_to_cpu(str->di_goal_meta); 232 di->di_goal_meta = be64_to_cpu(str->di_goal_meta);
237 di->di_goal_data = be64_to_cpu(str->di_goal_data); 233 di->di_goal_data = be64_to_cpu(str->di_goal_data);
@@ -270,7 +266,6 @@ int gfs2_inode_refresh(struct gfs2_inode *ip)
270 } 266 }
271 267
272 error = gfs2_dinode_in(ip, dibh->b_data); 268 error = gfs2_dinode_in(ip, dibh->b_data);
273
274 brelse(dibh); 269 brelse(dibh);
275 ip->i_vn = ip->i_gl->gl_vn; 270 ip->i_vn = ip->i_gl->gl_vn;
276 271
@@ -684,7 +679,7 @@ out:
684static void init_dinode(struct gfs2_inode *dip, struct gfs2_glock *gl, 679static void init_dinode(struct gfs2_inode *dip, struct gfs2_glock *gl,
685 const struct gfs2_inum_host *inum, unsigned int mode, 680 const struct gfs2_inum_host *inum, unsigned int mode,
686 unsigned int uid, unsigned int gid, 681 unsigned int uid, unsigned int gid,
687 const u64 *generation) 682 const u64 *generation, dev_t dev)
688{ 683{
689 struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode); 684 struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
690 struct gfs2_dinode *di; 685 struct gfs2_dinode *di;
@@ -705,7 +700,8 @@ static void init_dinode(struct gfs2_inode *dip, struct gfs2_glock *gl,
705 di->di_size = cpu_to_be64(0); 700 di->di_size = cpu_to_be64(0);
706 di->di_blocks = cpu_to_be64(1); 701 di->di_blocks = cpu_to_be64(1);
707 di->di_atime = di->di_mtime = di->di_ctime = cpu_to_be64(get_seconds()); 702 di->di_atime = di->di_mtime = di->di_ctime = cpu_to_be64(get_seconds());
708 di->di_major = di->di_minor = cpu_to_be32(0); 703 di->di_major = cpu_to_be32(MAJOR(dev));
704 di->di_minor = cpu_to_be32(MINOR(dev));
709 di->di_goal_meta = di->di_goal_data = cpu_to_be64(inum->no_addr); 705 di->di_goal_meta = di->di_goal_data = cpu_to_be64(inum->no_addr);
710 di->di_generation = cpu_to_be64(*generation); 706 di->di_generation = cpu_to_be64(*generation);
711 di->di_flags = cpu_to_be32(0); 707 di->di_flags = cpu_to_be32(0);
@@ -740,7 +736,7 @@ static void init_dinode(struct gfs2_inode *dip, struct gfs2_glock *gl,
740 736
741static int make_dinode(struct gfs2_inode *dip, struct gfs2_glock *gl, 737static int make_dinode(struct gfs2_inode *dip, struct gfs2_glock *gl,
742 unsigned int mode, const struct gfs2_inum_host *inum, 738 unsigned int mode, const struct gfs2_inum_host *inum,
743 const u64 *generation) 739 const u64 *generation, dev_t dev)
744{ 740{
745 struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode); 741 struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
746 unsigned int uid, gid; 742 unsigned int uid, gid;
@@ -761,7 +757,7 @@ static int make_dinode(struct gfs2_inode *dip, struct gfs2_glock *gl,
761 if (error) 757 if (error)
762 goto out_quota; 758 goto out_quota;
763 759
764 init_dinode(dip, gl, inum, mode, uid, gid, generation); 760 init_dinode(dip, gl, inum, mode, uid, gid, generation, dev);
765 gfs2_quota_change(dip, +1, uid, gid); 761 gfs2_quota_change(dip, +1, uid, gid);
766 gfs2_trans_end(sdp); 762 gfs2_trans_end(sdp);
767 763
@@ -892,7 +888,7 @@ static int gfs2_security_init(struct gfs2_inode *dip, struct gfs2_inode *ip)
892 */ 888 */
893 889
894struct inode *gfs2_createi(struct gfs2_holder *ghs, const struct qstr *name, 890struct inode *gfs2_createi(struct gfs2_holder *ghs, const struct qstr *name,
895 unsigned int mode) 891 unsigned int mode, dev_t dev)
896{ 892{
897 struct inode *inode; 893 struct inode *inode;
898 struct gfs2_inode *dip = ghs->gh_gl->gl_object; 894 struct gfs2_inode *dip = ghs->gh_gl->gl_object;
@@ -950,7 +946,7 @@ struct inode *gfs2_createi(struct gfs2_holder *ghs, const struct qstr *name,
950 goto fail_gunlock; 946 goto fail_gunlock;
951 } 947 }
952 948
953 error = make_dinode(dip, ghs[1].gh_gl, mode, &inum, &generation); 949 error = make_dinode(dip, ghs[1].gh_gl, mode, &inum, &generation, dev);
954 if (error) 950 if (error)
955 goto fail_gunlock2; 951 goto fail_gunlock2;
956 952
diff --git a/fs/gfs2/inode.h b/fs/gfs2/inode.h
index d699b9209750..33c9ea68f7e7 100644
--- a/fs/gfs2/inode.h
+++ b/fs/gfs2/inode.h
@@ -37,7 +37,7 @@ int gfs2_change_nlink(struct gfs2_inode *ip, int diff);
37struct inode *gfs2_lookupi(struct inode *dir, const struct qstr *name, 37struct inode *gfs2_lookupi(struct inode *dir, const struct qstr *name,
38 int is_root, struct nameidata *nd); 38 int is_root, struct nameidata *nd);
39struct inode *gfs2_createi(struct gfs2_holder *ghs, const struct qstr *name, 39struct inode *gfs2_createi(struct gfs2_holder *ghs, const struct qstr *name,
40 unsigned int mode); 40 unsigned int mode, dev_t dev);
41int gfs2_rmdiri(struct gfs2_inode *dip, const struct qstr *name, 41int gfs2_rmdiri(struct gfs2_inode *dip, const struct qstr *name,
42 struct gfs2_inode *ip); 42 struct gfs2_inode *ip);
43int gfs2_unlink_ok(struct gfs2_inode *dip, const struct qstr *name, 43int gfs2_unlink_ok(struct gfs2_inode *dip, const struct qstr *name,
diff --git a/fs/gfs2/ondisk.c b/fs/gfs2/ondisk.c
index 4bc590edb60e..60dd943761ab 100644
--- a/fs/gfs2/ondisk.c
+++ b/fs/gfs2/ondisk.c
@@ -170,8 +170,6 @@ void gfs2_dinode_out(const struct gfs2_inode *ip, void *buf)
170 str->di_atime = cpu_to_be64(di->di_atime); 170 str->di_atime = cpu_to_be64(di->di_atime);
171 str->di_mtime = cpu_to_be64(di->di_mtime); 171 str->di_mtime = cpu_to_be64(di->di_mtime);
172 str->di_ctime = cpu_to_be64(di->di_ctime); 172 str->di_ctime = cpu_to_be64(di->di_ctime);
173 str->di_major = cpu_to_be32(di->di_major);
174 str->di_minor = cpu_to_be32(di->di_minor);
175 173
176 str->di_goal_meta = cpu_to_be64(di->di_goal_meta); 174 str->di_goal_meta = cpu_to_be64(di->di_goal_meta);
177 str->di_goal_data = cpu_to_be64(di->di_goal_data); 175 str->di_goal_data = cpu_to_be64(di->di_goal_data);
@@ -202,8 +200,6 @@ void gfs2_dinode_print(const struct gfs2_inode *ip)
202 printk(KERN_INFO " di_atime = %lld\n", (long long)di->di_atime); 200 printk(KERN_INFO " di_atime = %lld\n", (long long)di->di_atime);
203 printk(KERN_INFO " di_mtime = %lld\n", (long long)di->di_mtime); 201 printk(KERN_INFO " di_mtime = %lld\n", (long long)di->di_mtime);
204 printk(KERN_INFO " di_ctime = %lld\n", (long long)di->di_ctime); 202 printk(KERN_INFO " di_ctime = %lld\n", (long long)di->di_ctime);
205 pv(di, di_major, "%u");
206 pv(di, di_minor, "%u");
207 203
208 printk(KERN_INFO " di_goal_meta = %llu\n", (unsigned long long)di->di_goal_meta); 204 printk(KERN_INFO " di_goal_meta = %llu\n", (unsigned long long)di->di_goal_meta);
209 printk(KERN_INFO " di_goal_data = %llu\n", (unsigned long long)di->di_goal_data); 205 printk(KERN_INFO " di_goal_data = %llu\n", (unsigned long long)di->di_goal_data);
diff --git a/fs/gfs2/ops_inode.c b/fs/gfs2/ops_inode.c
index b2c2fe613d70..c10b914bf8cc 100644
--- a/fs/gfs2/ops_inode.c
+++ b/fs/gfs2/ops_inode.c
@@ -59,7 +59,7 @@ static int gfs2_create(struct inode *dir, struct dentry *dentry,
59 gfs2_holder_init(dip->i_gl, 0, 0, ghs); 59 gfs2_holder_init(dip->i_gl, 0, 0, ghs);
60 60
61 for (;;) { 61 for (;;) {
62 inode = gfs2_createi(ghs, &dentry->d_name, S_IFREG | mode); 62 inode = gfs2_createi(ghs, &dentry->d_name, S_IFREG | mode, 0);
63 if (!IS_ERR(inode)) { 63 if (!IS_ERR(inode)) {
64 gfs2_trans_end(sdp); 64 gfs2_trans_end(sdp);
65 if (dip->i_alloc.al_rgd) 65 if (dip->i_alloc.al_rgd)
@@ -326,7 +326,7 @@ static int gfs2_symlink(struct inode *dir, struct dentry *dentry,
326 326
327 gfs2_holder_init(dip->i_gl, 0, 0, ghs); 327 gfs2_holder_init(dip->i_gl, 0, 0, ghs);
328 328
329 inode = gfs2_createi(ghs, &dentry->d_name, S_IFLNK | S_IRWXUGO); 329 inode = gfs2_createi(ghs, &dentry->d_name, S_IFLNK | S_IRWXUGO, 0);
330 if (IS_ERR(inode)) { 330 if (IS_ERR(inode)) {
331 gfs2_holder_uninit(ghs); 331 gfs2_holder_uninit(ghs);
332 return PTR_ERR(inode); 332 return PTR_ERR(inode);
@@ -379,7 +379,7 @@ static int gfs2_mkdir(struct inode *dir, struct dentry *dentry, int mode)
379 379
380 gfs2_holder_init(dip->i_gl, 0, 0, ghs); 380 gfs2_holder_init(dip->i_gl, 0, 0, ghs);
381 381
382 inode = gfs2_createi(ghs, &dentry->d_name, S_IFDIR | mode); 382 inode = gfs2_createi(ghs, &dentry->d_name, S_IFDIR | mode, 0);
383 if (IS_ERR(inode)) { 383 if (IS_ERR(inode)) {
384 gfs2_holder_uninit(ghs); 384 gfs2_holder_uninit(ghs);
385 return PTR_ERR(inode); 385 return PTR_ERR(inode);
@@ -504,47 +504,19 @@ out:
504static int gfs2_mknod(struct inode *dir, struct dentry *dentry, int mode, 504static int gfs2_mknod(struct inode *dir, struct dentry *dentry, int mode,
505 dev_t dev) 505 dev_t dev)
506{ 506{
507 struct gfs2_inode *dip = GFS2_I(dir), *ip; 507 struct gfs2_inode *dip = GFS2_I(dir);
508 struct gfs2_sbd *sdp = GFS2_SB(dir); 508 struct gfs2_sbd *sdp = GFS2_SB(dir);
509 struct gfs2_holder ghs[2]; 509 struct gfs2_holder ghs[2];
510 struct inode *inode; 510 struct inode *inode;
511 struct buffer_head *dibh;
512 u32 major = 0, minor = 0;
513 int error;
514
515 switch (mode & S_IFMT) {
516 case S_IFBLK:
517 case S_IFCHR:
518 major = MAJOR(dev);
519 minor = MINOR(dev);
520 break;
521 case S_IFIFO:
522 case S_IFSOCK:
523 break;
524 default:
525 return -EOPNOTSUPP;
526 };
527 511
528 gfs2_holder_init(dip->i_gl, 0, 0, ghs); 512 gfs2_holder_init(dip->i_gl, 0, 0, ghs);
529 513
530 inode = gfs2_createi(ghs, &dentry->d_name, mode); 514 inode = gfs2_createi(ghs, &dentry->d_name, mode, dev);
531 if (IS_ERR(inode)) { 515 if (IS_ERR(inode)) {
532 gfs2_holder_uninit(ghs); 516 gfs2_holder_uninit(ghs);
533 return PTR_ERR(inode); 517 return PTR_ERR(inode);
534 } 518 }
535 519
536 ip = ghs[1].gh_gl->gl_object;
537
538 ip->i_di.di_major = major;
539 ip->i_di.di_minor = minor;
540
541 error = gfs2_meta_inode_buffer(ip, &dibh);
542
543 if (!gfs2_assert_withdraw(sdp, !error)) {
544 gfs2_dinode_out(ip, dibh->b_data);
545 brelse(dibh);
546 }
547
548 gfs2_trans_end(sdp); 520 gfs2_trans_end(sdp);
549 if (dip->i_alloc.al_rgd) 521 if (dip->i_alloc.al_rgd)
550 gfs2_inplace_release(dip); 522 gfs2_inplace_release(dip);
diff --git a/include/linux/gfs2_ondisk.h b/include/linux/gfs2_ondisk.h
index c0e76fc718c7..5bcf895b2731 100644
--- a/include/linux/gfs2_ondisk.h
+++ b/include/linux/gfs2_ondisk.h
@@ -331,8 +331,6 @@ struct gfs2_dinode_host {
331 __u64 di_atime; /* time last accessed */ 331 __u64 di_atime; /* time last accessed */
332 __u64 di_mtime; /* time last modified */ 332 __u64 di_mtime; /* time last modified */
333 __u64 di_ctime; /* time last changed */ 333 __u64 di_ctime; /* time last changed */
334 __u32 di_major; /* device major number */
335 __u32 di_minor; /* device minor number */
336 334
337 /* This section varies from gfs1. Padding added to align with 335 /* This section varies from gfs1. Padding added to align with
338 * remainder of dinode 336 * remainder of dinode