aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/gfs2/inode.c58
-rw-r--r--fs/gfs2/inode.h1
-rw-r--r--fs/gfs2/ops_inode.c55
3 files changed, 56 insertions, 58 deletions
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
index 9b17447a0f95..676e750fc84c 100644
--- a/fs/gfs2/inode.c
+++ b/fs/gfs2/inode.c
@@ -1085,63 +1085,7 @@ int gfs2_unlink_ok(struct gfs2_inode *dip, const struct qstr *name,
1085 return 0; 1085 return 0;
1086} 1086}
1087 1087
1088/** 1088static int __gfs2_setattr_simple(struct gfs2_inode *ip, struct iattr *attr)
1089 * gfs2_readlinki - return the contents of a symlink
1090 * @ip: the symlink's inode
1091 * @buf: a pointer to the buffer to be filled
1092 * @len: a pointer to the length of @buf
1093 *
1094 * If @buf is too small, a piece of memory is kmalloc()ed and needs
1095 * to be freed by the caller.
1096 *
1097 * Returns: errno
1098 */
1099
1100int gfs2_readlinki(struct gfs2_inode *ip, char **buf, unsigned int *len)
1101{
1102 struct gfs2_holder i_gh;
1103 struct buffer_head *dibh;
1104 unsigned int x;
1105 int error;
1106
1107 gfs2_holder_init(ip->i_gl, LM_ST_SHARED, 0, &i_gh);
1108 error = gfs2_glock_nq(&i_gh);
1109 if (error) {
1110 gfs2_holder_uninit(&i_gh);
1111 return error;
1112 }
1113
1114 if (!ip->i_disksize) {
1115 gfs2_consist_inode(ip);
1116 error = -EIO;
1117 goto out;
1118 }
1119
1120 error = gfs2_meta_inode_buffer(ip, &dibh);
1121 if (error)
1122 goto out;
1123
1124 x = ip->i_disksize + 1;
1125 if (x > *len) {
1126 *buf = kmalloc(x, GFP_NOFS);
1127 if (!*buf) {
1128 error = -ENOMEM;
1129 goto out_brelse;
1130 }
1131 }
1132
1133 memcpy(*buf, dibh->b_data + sizeof(struct gfs2_dinode), x);
1134 *len = x;
1135
1136out_brelse:
1137 brelse(dibh);
1138out:
1139 gfs2_glock_dq_uninit(&i_gh);
1140 return error;
1141}
1142
1143static int
1144__gfs2_setattr_simple(struct gfs2_inode *ip, struct iattr *attr)
1145{ 1089{
1146 struct buffer_head *dibh; 1090 struct buffer_head *dibh;
1147 int error; 1091 int error;
diff --git a/fs/gfs2/inode.h b/fs/gfs2/inode.h
index 6cd39284eb08..fc9a08f45be7 100644
--- a/fs/gfs2/inode.h
+++ b/fs/gfs2/inode.h
@@ -99,7 +99,6 @@ extern struct inode *gfs2_createi(struct gfs2_holder *ghs,
99extern int gfs2_unlink_ok(struct gfs2_inode *dip, const struct qstr *name, 99extern int gfs2_unlink_ok(struct gfs2_inode *dip, const struct qstr *name,
100 const struct gfs2_inode *ip); 100 const struct gfs2_inode *ip);
101extern int gfs2_permission(struct inode *inode, int mask); 101extern int gfs2_permission(struct inode *inode, int mask);
102extern int gfs2_readlinki(struct gfs2_inode *ip, char **buf, unsigned int *len);
103extern int gfs2_setattr_simple(struct gfs2_inode *ip, struct iattr *attr); 102extern int gfs2_setattr_simple(struct gfs2_inode *ip, struct iattr *attr);
104extern struct inode *gfs2_lookup_simple(struct inode *dip, const char *name); 103extern struct inode *gfs2_lookup_simple(struct inode *dip, const char *name);
105extern void gfs2_dinode_out(const struct gfs2_inode *ip, void *buf); 104extern void gfs2_dinode_out(const struct gfs2_inode *ip, void *buf);
diff --git a/fs/gfs2/ops_inode.c b/fs/gfs2/ops_inode.c
index 5dacd647ff0d..f607f0908cff 100644
--- a/fs/gfs2/ops_inode.c
+++ b/fs/gfs2/ops_inode.c
@@ -938,6 +938,61 @@ out:
938} 938}
939 939
940/** 940/**
941 * gfs2_readlinki - return the contents of a symlink
942 * @ip: the symlink's inode
943 * @buf: a pointer to the buffer to be filled
944 * @len: a pointer to the length of @buf
945 *
946 * If @buf is too small, a piece of memory is kmalloc()ed and needs
947 * to be freed by the caller.
948 *
949 * Returns: errno
950 */
951
952static int gfs2_readlinki(struct gfs2_inode *ip, char **buf, unsigned int *len)
953{
954 struct gfs2_holder i_gh;
955 struct buffer_head *dibh;
956 unsigned int x;
957 int error;
958
959 gfs2_holder_init(ip->i_gl, LM_ST_SHARED, 0, &i_gh);
960 error = gfs2_glock_nq(&i_gh);
961 if (error) {
962 gfs2_holder_uninit(&i_gh);
963 return error;
964 }
965
966 if (!ip->i_disksize) {
967 gfs2_consist_inode(ip);
968 error = -EIO;
969 goto out;
970 }
971
972 error = gfs2_meta_inode_buffer(ip, &dibh);
973 if (error)
974 goto out;
975
976 x = ip->i_disksize + 1;
977 if (x > *len) {
978 *buf = kmalloc(x, GFP_NOFS);
979 if (!*buf) {
980 error = -ENOMEM;
981 goto out_brelse;
982 }
983 }
984
985 memcpy(*buf, dibh->b_data + sizeof(struct gfs2_dinode), x);
986 *len = x;
987
988out_brelse:
989 brelse(dibh);
990out:
991 gfs2_glock_dq_uninit(&i_gh);
992 return error;
993}
994
995/**
941 * gfs2_readlink - Read the value of a symlink 996 * gfs2_readlink - Read the value of a symlink
942 * @dentry: the symlink 997 * @dentry: the symlink
943 * @buf: the buffer to read the symlink data into 998 * @buf: the buffer to read the symlink data into