diff options
-rw-r--r-- | fs/gfs2/inode.c | 58 | ||||
-rw-r--r-- | fs/gfs2/inode.h | 1 | ||||
-rw-r--r-- | fs/gfs2/ops_inode.c | 55 |
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 | /** | 1088 | static 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 | |||
1100 | int 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 | |||
1136 | out_brelse: | ||
1137 | brelse(dibh); | ||
1138 | out: | ||
1139 | gfs2_glock_dq_uninit(&i_gh); | ||
1140 | return error; | ||
1141 | } | ||
1142 | |||
1143 | static 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, | |||
99 | extern int gfs2_unlink_ok(struct gfs2_inode *dip, const struct qstr *name, | 99 | extern int gfs2_unlink_ok(struct gfs2_inode *dip, const struct qstr *name, |
100 | const struct gfs2_inode *ip); | 100 | const struct gfs2_inode *ip); |
101 | extern int gfs2_permission(struct inode *inode, int mask); | 101 | extern int gfs2_permission(struct inode *inode, int mask); |
102 | extern int gfs2_readlinki(struct gfs2_inode *ip, char **buf, unsigned int *len); | ||
103 | extern int gfs2_setattr_simple(struct gfs2_inode *ip, struct iattr *attr); | 102 | extern int gfs2_setattr_simple(struct gfs2_inode *ip, struct iattr *attr); |
104 | extern struct inode *gfs2_lookup_simple(struct inode *dip, const char *name); | 103 | extern struct inode *gfs2_lookup_simple(struct inode *dip, const char *name); |
105 | extern void gfs2_dinode_out(const struct gfs2_inode *ip, void *buf); | 104 | extern 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 | |||
952 | static 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 | |||
988 | out_brelse: | ||
989 | brelse(dibh); | ||
990 | out: | ||
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 |