Commit e7f14f4d authored by Steven Whitehouse's avatar Steven Whitehouse

[GFS2] Shrink gfs2_inode (2) - di_major/di_minor

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: default avatarSteven Whitehouse <swhiteho@redhat.com>
parent af339c02
...@@ -51,17 +51,6 @@ void gfs2_inode_attr_in(struct gfs2_inode *ip) ...@@ -51,17 +51,6 @@ void gfs2_inode_attr_in(struct gfs2_inode *ip)
struct gfs2_dinode_host *di = &ip->i_di; struct gfs2_dinode_host *di = &ip->i_di;
inode->i_ino = ip->i_num.no_addr; 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_mode = di->di_mode;
inode->i_nlink = di->di_nlink; inode->i_nlink = di->di_nlink;
inode->i_uid = di->di_uid; inode->i_uid = di->di_uid;
...@@ -222,6 +211,15 @@ static int gfs2_dinode_in(struct gfs2_inode *ip, const void *buf) ...@@ -222,6 +211,15 @@ static int gfs2_dinode_in(struct gfs2_inode *ip, const void *buf)
return -ESTALE; return -ESTALE;
di->di_mode = be32_to_cpu(str->di_mode); 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_uid = be32_to_cpu(str->di_uid);
di->di_gid = be32_to_cpu(str->di_gid); di->di_gid = be32_to_cpu(str->di_gid);
di->di_nlink = be32_to_cpu(str->di_nlink); 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,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_atime = be64_to_cpu(str->di_atime);
di->di_mtime = be64_to_cpu(str->di_mtime); di->di_mtime = be64_to_cpu(str->di_mtime);
di->di_ctime = be64_to_cpu(str->di_ctime); 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_meta = be64_to_cpu(str->di_goal_meta);
di->di_goal_data = be64_to_cpu(str->di_goal_data); di->di_goal_data = be64_to_cpu(str->di_goal_data);
...@@ -270,7 +266,6 @@ int gfs2_inode_refresh(struct gfs2_inode *ip) ...@@ -270,7 +266,6 @@ int gfs2_inode_refresh(struct gfs2_inode *ip)
} }
error = gfs2_dinode_in(ip, dibh->b_data); error = gfs2_dinode_in(ip, dibh->b_data);
brelse(dibh); brelse(dibh);
ip->i_vn = ip->i_gl->gl_vn; ip->i_vn = ip->i_gl->gl_vn;
...@@ -684,7 +679,7 @@ out: ...@@ -684,7 +679,7 @@ out:
static void init_dinode(struct gfs2_inode *dip, struct gfs2_glock *gl, static void init_dinode(struct gfs2_inode *dip, struct gfs2_glock *gl,
const struct gfs2_inum_host *inum, unsigned int mode, const struct gfs2_inum_host *inum, unsigned int mode,
unsigned int uid, unsigned int gid, 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_sbd *sdp = GFS2_SB(&dip->i_inode);
struct gfs2_dinode *di; struct gfs2_dinode *di;
...@@ -705,7 +700,8 @@ static void init_dinode(struct gfs2_inode *dip, struct gfs2_glock *gl, ...@@ -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_size = cpu_to_be64(0);
di->di_blocks = cpu_to_be64(1); di->di_blocks = cpu_to_be64(1);
di->di_atime = di->di_mtime = di->di_ctime = cpu_to_be64(get_seconds()); 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_goal_meta = di->di_goal_data = cpu_to_be64(inum->no_addr);
di->di_generation = cpu_to_be64(*generation); di->di_generation = cpu_to_be64(*generation);
di->di_flags = cpu_to_be32(0); di->di_flags = cpu_to_be32(0);
...@@ -740,7 +736,7 @@ static void init_dinode(struct gfs2_inode *dip, struct gfs2_glock *gl, ...@@ -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, static int make_dinode(struct gfs2_inode *dip, struct gfs2_glock *gl,
unsigned int mode, const struct gfs2_inum_host *inum, 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); struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
unsigned int uid, gid; unsigned int uid, gid;
...@@ -761,7 +757,7 @@ static int make_dinode(struct gfs2_inode *dip, struct gfs2_glock *gl, ...@@ -761,7 +757,7 @@ static int make_dinode(struct gfs2_inode *dip, struct gfs2_glock *gl,
if (error) if (error)
goto out_quota; 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_quota_change(dip, +1, uid, gid);
gfs2_trans_end(sdp); gfs2_trans_end(sdp);
...@@ -892,7 +888,7 @@ static int gfs2_security_init(struct gfs2_inode *dip, struct gfs2_inode *ip) ...@@ -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, 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 inode *inode;
struct gfs2_inode *dip = ghs->gh_gl->gl_object; 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,7 +946,7 @@ struct inode *gfs2_createi(struct gfs2_holder *ghs, const struct qstr *name,
goto fail_gunlock; 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) if (error)
goto fail_gunlock2; goto fail_gunlock2;
......
...@@ -37,7 +37,7 @@ int gfs2_change_nlink(struct gfs2_inode *ip, int diff); ...@@ -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, struct inode *gfs2_lookupi(struct inode *dir, const struct qstr *name,
int is_root, struct nameidata *nd); int is_root, struct nameidata *nd);
struct inode *gfs2_createi(struct gfs2_holder *ghs, const struct qstr *name, 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, int gfs2_rmdiri(struct gfs2_inode *dip, const struct qstr *name,
struct gfs2_inode *ip); struct gfs2_inode *ip);
int gfs2_unlink_ok(struct gfs2_inode *dip, const struct qstr *name, int gfs2_unlink_ok(struct gfs2_inode *dip, const struct qstr *name,
......
...@@ -170,8 +170,6 @@ void gfs2_dinode_out(const struct gfs2_inode *ip, void *buf) ...@@ -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_atime = cpu_to_be64(di->di_atime);
str->di_mtime = cpu_to_be64(di->di_mtime); str->di_mtime = cpu_to_be64(di->di_mtime);
str->di_ctime = cpu_to_be64(di->di_ctime); 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_meta = cpu_to_be64(di->di_goal_meta);
str->di_goal_data = cpu_to_be64(di->di_goal_data); 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,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_atime = %lld\n", (long long)di->di_atime);
printk(KERN_INFO " di_mtime = %lld\n", (long long)di->di_mtime); printk(KERN_INFO " di_mtime = %lld\n", (long long)di->di_mtime);
printk(KERN_INFO " di_ctime = %lld\n", (long long)di->di_ctime); 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_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); printk(KERN_INFO " di_goal_data = %llu\n", (unsigned long long)di->di_goal_data);
......
...@@ -59,7 +59,7 @@ static int gfs2_create(struct inode *dir, struct dentry *dentry, ...@@ -59,7 +59,7 @@ static int gfs2_create(struct inode *dir, struct dentry *dentry,
gfs2_holder_init(dip->i_gl, 0, 0, ghs); gfs2_holder_init(dip->i_gl, 0, 0, ghs);
for (;;) { 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)) { if (!IS_ERR(inode)) {
gfs2_trans_end(sdp); gfs2_trans_end(sdp);
if (dip->i_alloc.al_rgd) if (dip->i_alloc.al_rgd)
...@@ -326,7 +326,7 @@ static int gfs2_symlink(struct inode *dir, struct dentry *dentry, ...@@ -326,7 +326,7 @@ static int gfs2_symlink(struct inode *dir, struct dentry *dentry,
gfs2_holder_init(dip->i_gl, 0, 0, ghs); 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)) { if (IS_ERR(inode)) {
gfs2_holder_uninit(ghs); gfs2_holder_uninit(ghs);
return PTR_ERR(inode); return PTR_ERR(inode);
...@@ -379,7 +379,7 @@ static int gfs2_mkdir(struct inode *dir, struct dentry *dentry, int mode) ...@@ -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); 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)) { if (IS_ERR(inode)) {
gfs2_holder_uninit(ghs); gfs2_holder_uninit(ghs);
return PTR_ERR(inode); return PTR_ERR(inode);
...@@ -504,47 +504,19 @@ out: ...@@ -504,47 +504,19 @@ out:
static int gfs2_mknod(struct inode *dir, struct dentry *dentry, int mode, static int gfs2_mknod(struct inode *dir, struct dentry *dentry, int mode,
dev_t dev) 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_sbd *sdp = GFS2_SB(dir);
struct gfs2_holder ghs[2]; struct gfs2_holder ghs[2];
struct inode *inode; 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); 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)) { if (IS_ERR(inode)) {
gfs2_holder_uninit(ghs); gfs2_holder_uninit(ghs);
return PTR_ERR(inode); 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); gfs2_trans_end(sdp);
if (dip->i_alloc.al_rgd) if (dip->i_alloc.al_rgd)
gfs2_inplace_release(dip); gfs2_inplace_release(dip);
......
...@@ -331,8 +331,6 @@ struct gfs2_dinode_host { ...@@ -331,8 +331,6 @@ struct gfs2_dinode_host {
__u64 di_atime; /* time last accessed */ __u64 di_atime; /* time last accessed */
__u64 di_mtime; /* time last modified */ __u64 di_mtime; /* time last modified */
__u64 di_ctime; /* time last changed */ __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 /* This section varies from gfs1. Padding added to align with
* remainder of dinode * remainder of dinode
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment