[GFS2] Shrink gfs2_inode (2) - di_major/di_minor
authorSteven Whitehouse <swhiteho@redhat.com>
Wed, 1 Nov 2006 02:45:08 +0000 (21:45 -0500)
committerSteven Whitehouse <swhiteho@redhat.com>
Thu, 30 Nov 2006 15:34:11 +0000 (10:34 -0500)
This removes the device numbers from this structure by using
inode->i_rdev instead. It also cleans up the code in gfs2_mknod.
It results in shrinking the gfs2_inode by 8 bytes.

Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
fs/gfs2/inode.c
fs/gfs2/inode.h
fs/gfs2/ondisk.c
fs/gfs2/ops_inode.c
include/linux/gfs2_ondisk.h

index 7ba05fc..a995919 100644 (file)
@@ -51,17 +51,6 @@ void gfs2_inode_attr_in(struct gfs2_inode *ip)
        struct gfs2_dinode_host *di = &ip->i_di;
 
        inode->i_ino = ip->i_num.no_addr;
-
-       switch (di->di_mode & S_IFMT) {
-       case S_IFBLK:
-       case S_IFCHR:
-               inode->i_rdev = MKDEV(di->di_major, di->di_minor);
-               break;
-       default:
-               inode->i_rdev = 0;
-               break;
-       };
-
        inode->i_mode = di->di_mode;
        inode->i_nlink = di->di_nlink;
        inode->i_uid = di->di_uid;
@@ -222,6 +211,15 @@ static int gfs2_dinode_in(struct gfs2_inode *ip, const void *buf)
                return -ESTALE;
 
        di->di_mode = be32_to_cpu(str->di_mode);
+       ip->i_inode.i_rdev = 0;
+       switch (di->di_mode & S_IFMT) {
+       case S_IFBLK:
+       case S_IFCHR:
+               ip->i_inode.i_rdev = MKDEV(be32_to_cpu(str->di_major),
+                                          be32_to_cpu(str->di_minor));
+               break;
+       };
+
        di->di_uid = be32_to_cpu(str->di_uid);
        di->di_gid = be32_to_cpu(str->di_gid);
        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)
        di->di_atime = be64_to_cpu(str->di_atime);
        di->di_mtime = be64_to_cpu(str->di_mtime);
        di->di_ctime = be64_to_cpu(str->di_ctime);
-       di->di_major = be32_to_cpu(str->di_major);
-       di->di_minor = be32_to_cpu(str->di_minor);
 
        di->di_goal_meta = be64_to_cpu(str->di_goal_meta);
        di->di_goal_data = be64_to_cpu(str->di_goal_data);
@@ -270,7 +266,6 @@ int gfs2_inode_refresh(struct gfs2_inode *ip)
        }
 
        error = gfs2_dinode_in(ip, dibh->b_data);
-
        brelse(dibh);
        ip->i_vn = ip->i_gl->gl_vn;
 
@@ -684,7 +679,7 @@ out:
 static void init_dinode(struct gfs2_inode *dip, struct gfs2_glock *gl,
                        const struct gfs2_inum_host *inum, unsigned int mode,
                        unsigned int uid, unsigned int gid,
-                       const u64 *generation)
+                       const u64 *generation, dev_t dev)
 {
        struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
        struct gfs2_dinode *di;
@@ -705,7 +700,8 @@ static void init_dinode(struct gfs2_inode *dip, struct gfs2_glock *gl,
        di->di_size = cpu_to_be64(0);
        di->di_blocks = cpu_to_be64(1);
        di->di_atime = di->di_mtime = di->di_ctime = cpu_to_be64(get_seconds());
-       di->di_major = di->di_minor = cpu_to_be32(0);
+       di->di_major = cpu_to_be32(MAJOR(dev));
+       di->di_minor = cpu_to_be32(MINOR(dev));
        di->di_goal_meta = di->di_goal_data = cpu_to_be64(inum->no_addr);
        di->di_generation = cpu_to_be64(*generation);
        di->di_flags = cpu_to_be32(0);
@@ -740,7 +736,7 @@ static void init_dinode(struct gfs2_inode *dip, struct gfs2_glock *gl,
 
 static int make_dinode(struct gfs2_inode *dip, struct gfs2_glock *gl,
                       unsigned int mode, const struct gfs2_inum_host *inum,
-                      const u64 *generation)
+                      const u64 *generation, dev_t dev)
 {
        struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
        unsigned int uid, gid;
@@ -761,7 +757,7 @@ static int make_dinode(struct gfs2_inode *dip, struct gfs2_glock *gl,
        if (error)
                goto out_quota;
 
-       init_dinode(dip, gl, inum, mode, uid, gid, generation);
+       init_dinode(dip, gl, inum, mode, uid, gid, generation, dev);
        gfs2_quota_change(dip, +1, uid, gid);
        gfs2_trans_end(sdp);
 
@@ -892,7 +888,7 @@ static int gfs2_security_init(struct gfs2_inode *dip, struct gfs2_inode *ip)
  */
 
 struct inode *gfs2_createi(struct gfs2_holder *ghs, const struct qstr *name,
-                          unsigned int mode)
+                          unsigned int mode, dev_t dev)
 {
        struct inode *inode;
        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,
                        goto fail_gunlock;
        }
 
-       error = make_dinode(dip, ghs[1].gh_gl, mode, &inum, &generation);
+       error = make_dinode(dip, ghs[1].gh_gl, mode, &inum, &generation, dev);
        if (error)
                goto fail_gunlock2;
 
index d699b92..33c9ea6 100644 (file)
@@ -37,7 +37,7 @@ int gfs2_change_nlink(struct gfs2_inode *ip, int diff);
 struct inode *gfs2_lookupi(struct inode *dir, const struct qstr *name,
                           int is_root, struct nameidata *nd);
 struct inode *gfs2_createi(struct gfs2_holder *ghs, const struct qstr *name,
-                          unsigned int mode);
+                          unsigned int mode, dev_t dev);
 int gfs2_rmdiri(struct gfs2_inode *dip, const struct qstr *name,
                struct gfs2_inode *ip);
 int gfs2_unlink_ok(struct gfs2_inode *dip, const struct qstr *name,
index 4bc590e..60dd943 100644 (file)
@@ -170,8 +170,6 @@ void gfs2_dinode_out(const struct gfs2_inode *ip, void *buf)
        str->di_atime = cpu_to_be64(di->di_atime);
        str->di_mtime = cpu_to_be64(di->di_mtime);
        str->di_ctime = cpu_to_be64(di->di_ctime);
-       str->di_major = cpu_to_be32(di->di_major);
-       str->di_minor = cpu_to_be32(di->di_minor);
 
        str->di_goal_meta = cpu_to_be64(di->di_goal_meta);
        str->di_goal_data = cpu_to_be64(di->di_goal_data);
@@ -202,8 +200,6 @@ void gfs2_dinode_print(const struct gfs2_inode *ip)
        printk(KERN_INFO "  di_atime = %lld\n", (long long)di->di_atime);
        printk(KERN_INFO "  di_mtime = %lld\n", (long long)di->di_mtime);
        printk(KERN_INFO "  di_ctime = %lld\n", (long long)di->di_ctime);
-       pv(di, di_major, "%u");
-       pv(di, di_minor, "%u");
 
        printk(KERN_INFO "  di_goal_meta = %llu\n", (unsigned long long)di->di_goal_meta);
        printk(KERN_INFO "  di_goal_data = %llu\n", (unsigned long long)di->di_goal_data);
index b2c2fe6..c10b914 100644 (file)
@@ -59,7 +59,7 @@ static int gfs2_create(struct inode *dir, struct dentry *dentry,
        gfs2_holder_init(dip->i_gl, 0, 0, ghs);
 
        for (;;) {
-               inode = gfs2_createi(ghs, &dentry->d_name, S_IFREG | mode);
+               inode = gfs2_createi(ghs, &dentry->d_name, S_IFREG | mode, 0);
                if (!IS_ERR(inode)) {
                        gfs2_trans_end(sdp);
                        if (dip->i_alloc.al_rgd)
@@ -326,7 +326,7 @@ static int gfs2_symlink(struct inode *dir, struct dentry *dentry,
 
        gfs2_holder_init(dip->i_gl, 0, 0, ghs);
 
-       inode = gfs2_createi(ghs, &dentry->d_name, S_IFLNK | S_IRWXUGO);
+       inode = gfs2_createi(ghs, &dentry->d_name, S_IFLNK | S_IRWXUGO, 0);
        if (IS_ERR(inode)) {
                gfs2_holder_uninit(ghs);
                return PTR_ERR(inode);
@@ -379,7 +379,7 @@ static int gfs2_mkdir(struct inode *dir, struct dentry *dentry, int mode)
 
        gfs2_holder_init(dip->i_gl, 0, 0, ghs);
 
-       inode = gfs2_createi(ghs, &dentry->d_name, S_IFDIR | mode);
+       inode = gfs2_createi(ghs, &dentry->d_name, S_IFDIR | mode, 0);
        if (IS_ERR(inode)) {
                gfs2_holder_uninit(ghs);
                return PTR_ERR(inode);
@@ -504,47 +504,19 @@ out:
 static int gfs2_mknod(struct inode *dir, struct dentry *dentry, int mode,
                      dev_t dev)
 {
-       struct gfs2_inode *dip = GFS2_I(dir), *ip;
+       struct gfs2_inode *dip = GFS2_I(dir);
        struct gfs2_sbd *sdp = GFS2_SB(dir);
        struct gfs2_holder ghs[2];
        struct inode *inode;
-       struct buffer_head *dibh;
-       u32 major = 0, minor = 0;
-       int error;
-
-       switch (mode & S_IFMT) {
-       case S_IFBLK:
-       case S_IFCHR:
-               major = MAJOR(dev);
-               minor = MINOR(dev);
-               break;
-       case S_IFIFO:
-       case S_IFSOCK:
-               break;
-       default:
-               return -EOPNOTSUPP;
-       };
 
        gfs2_holder_init(dip->i_gl, 0, 0, ghs);
 
-       inode = gfs2_createi(ghs, &dentry->d_name, mode);
+       inode = gfs2_createi(ghs, &dentry->d_name, mode, dev);
        if (IS_ERR(inode)) {
                gfs2_holder_uninit(ghs);
                return PTR_ERR(inode);
        }
 
-       ip = ghs[1].gh_gl->gl_object;
-
-       ip->i_di.di_major = major;
-       ip->i_di.di_minor = minor;
-
-       error = gfs2_meta_inode_buffer(ip, &dibh);
-
-       if (!gfs2_assert_withdraw(sdp, !error)) {
-               gfs2_dinode_out(ip, dibh->b_data);
-               brelse(dibh);
-       }
-
        gfs2_trans_end(sdp);
        if (dip->i_alloc.al_rgd)
                gfs2_inplace_release(dip);
index c0e76fc..5bcf895 100644 (file)
@@ -331,8 +331,6 @@ struct gfs2_dinode_host {
        __u64 di_atime; /* time last accessed */
        __u64 di_mtime; /* time last modified */
        __u64 di_ctime; /* time last changed */
-       __u32 di_major; /* device major number */
-       __u32 di_minor; /* device minor number */
 
        /* This section varies from gfs1. Padding added to align with
          * remainder of dinode