1 /* 2 * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. 3 * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved. 4 * 5 * This copyrighted material is made available to anyone wishing to use, 6 * modify, copy, or redistribute it subject to the terms and conditions 7 * of the GNU General Public License version 2. 8 */ 9 10 #include <linux/slab.h> 11 #include <linux/spinlock.h> 12 #include <linux/completion.h> 13 #include <linux/buffer_head.h> 14 #include <linux/exportfs.h> 15 #include <linux/gfs2_ondisk.h> 16 #include <linux/crc32.h> 17 18 #include "gfs2.h" 19 #include "incore.h" 20 #include "dir.h" 21 #include "glock.h" 22 #include "glops.h" 23 #include "inode.h" 24 #include "super.h" 25 #include "rgrp.h" 26 #include "util.h" 27 28 #define GFS2_SMALL_FH_SIZE 4 29 #define GFS2_LARGE_FH_SIZE 8 30 #define GFS2_OLD_FH_SIZE 10 31 32 static int gfs2_encode_fh(struct dentry *dentry, __u32 *p, int *len, 33 int connectable) 34 { 35 __be32 *fh = (__force __be32 *)p; 36 struct inode *inode = dentry->d_inode; 37 struct super_block *sb = inode->i_sb; 38 struct gfs2_inode *ip = GFS2_I(inode); 39 40 if (*len < GFS2_SMALL_FH_SIZE || 41 (connectable && *len < GFS2_LARGE_FH_SIZE)) 42 return 255; 43 44 fh[0] = cpu_to_be32(ip->i_no_formal_ino >> 32); 45 fh[1] = cpu_to_be32(ip->i_no_formal_ino & 0xFFFFFFFF); 46 fh[2] = cpu_to_be32(ip->i_no_addr >> 32); 47 fh[3] = cpu_to_be32(ip->i_no_addr & 0xFFFFFFFF); 48 *len = GFS2_SMALL_FH_SIZE; 49 50 if (!connectable || inode == sb->s_root->d_inode) 51 return *len; 52 53 spin_lock(&dentry->d_lock); 54 inode = dentry->d_parent->d_inode; 55 ip = GFS2_I(inode); 56 igrab(inode); 57 spin_unlock(&dentry->d_lock); 58 59 fh[4] = cpu_to_be32(ip->i_no_formal_ino >> 32); 60 fh[5] = cpu_to_be32(ip->i_no_formal_ino & 0xFFFFFFFF); 61 fh[6] = cpu_to_be32(ip->i_no_addr >> 32); 62 fh[7] = cpu_to_be32(ip->i_no_addr & 0xFFFFFFFF); 63 *len = GFS2_LARGE_FH_SIZE; 64 65 iput(inode); 66 67 return *len; 68 } 69 70 struct get_name_filldir { 71 struct gfs2_inum_host inum; 72 char *name; 73 }; 74 75 static int get_name_filldir(void *opaque, const char *name, int length, 76 loff_t offset, u64 inum, unsigned int type) 77 { 78 struct get_name_filldir *gnfd = opaque; 79 80 if (inum != gnfd->inum.no_addr) 81 return 0; 82 83 memcpy(gnfd->name, name, length); 84 gnfd->name[length] = 0; 85 86 return 1; 87 } 88 89 static int gfs2_get_name(struct dentry *parent, char *name, 90 struct dentry *child) 91 { 92 struct inode *dir = parent->d_inode; 93 struct inode *inode = child->d_inode; 94 struct gfs2_inode *dip, *ip; 95 struct get_name_filldir gnfd; 96 struct gfs2_holder gh; 97 u64 offset = 0; 98 int error; 99 100 if (!dir) 101 return -EINVAL; 102 103 if (!S_ISDIR(dir->i_mode) || !inode) 104 return -EINVAL; 105 106 dip = GFS2_I(dir); 107 ip = GFS2_I(inode); 108 109 *name = 0; 110 gnfd.inum.no_addr = ip->i_no_addr; 111 gnfd.inum.no_formal_ino = ip->i_no_formal_ino; 112 gnfd.name = name; 113 114 error = gfs2_glock_nq_init(dip->i_gl, LM_ST_SHARED, 0, &gh); 115 if (error) 116 return error; 117 118 error = gfs2_dir_read(dir, &offset, &gnfd, get_name_filldir); 119 120 gfs2_glock_dq_uninit(&gh); 121 122 if (!error && !*name) 123 error = -ENOENT; 124 125 return error; 126 } 127 128 static struct dentry *gfs2_get_parent(struct dentry *child) 129 { 130 struct qstr dotdot; 131 struct dentry *dentry; 132 133 /* 134 * XXX(hch): it would be a good idea to keep this around as a 135 * static variable. 136 */ 137 gfs2_str2qstr(&dotdot, ".."); 138 139 dentry = d_obtain_alias(gfs2_lookupi(child->d_inode, &dotdot, 1)); 140 if (!IS_ERR(dentry)) 141 dentry->d_op = &gfs2_dops; 142 return dentry; 143 } 144 145 static struct dentry *gfs2_get_dentry(struct super_block *sb, 146 struct gfs2_inum_host *inum) 147 { 148 struct gfs2_sbd *sdp = sb->s_fs_info; 149 struct gfs2_holder i_gh, ri_gh, rgd_gh; 150 struct gfs2_rgrpd *rgd; 151 struct inode *inode; 152 struct dentry *dentry; 153 int error; 154 155 /* System files? */ 156 157 inode = gfs2_ilookup(sb, inum->no_addr); 158 if (inode) { 159 if (GFS2_I(inode)->i_no_formal_ino != inum->no_formal_ino) { 160 iput(inode); 161 return ERR_PTR(-ESTALE); 162 } 163 goto out_inode; 164 } 165 166 error = gfs2_glock_nq_num(sdp, inum->no_addr, &gfs2_inode_glops, 167 LM_ST_SHARED, LM_FLAG_ANY, &i_gh); 168 if (error) 169 return ERR_PTR(error); 170 171 error = gfs2_rindex_hold(sdp, &ri_gh); 172 if (error) 173 goto fail; 174 175 error = -EINVAL; 176 rgd = gfs2_blk2rgrpd(sdp, inum->no_addr); 177 if (!rgd) 178 goto fail_rindex; 179 180 error = gfs2_glock_nq_init(rgd->rd_gl, LM_ST_SHARED, 0, &rgd_gh); 181 if (error) 182 goto fail_rindex; 183 184 error = -ESTALE; 185 if (gfs2_get_block_type(rgd, inum->no_addr) != GFS2_BLKST_DINODE) 186 goto fail_rgd; 187 188 gfs2_glock_dq_uninit(&rgd_gh); 189 gfs2_glock_dq_uninit(&ri_gh); 190 191 inode = gfs2_inode_lookup(sb, DT_UNKNOWN, 192 inum->no_addr, 193 0, 0); 194 if (IS_ERR(inode)) { 195 error = PTR_ERR(inode); 196 goto fail; 197 } 198 199 error = gfs2_inode_refresh(GFS2_I(inode)); 200 if (error) { 201 iput(inode); 202 goto fail; 203 } 204 205 /* Pick up the works we bypass in gfs2_inode_lookup */ 206 if (inode->i_state & I_NEW) 207 gfs2_set_iop(inode); 208 209 if (GFS2_I(inode)->i_no_formal_ino != inum->no_formal_ino) { 210 iput(inode); 211 goto fail; 212 } 213 214 error = -EIO; 215 if (GFS2_I(inode)->i_diskflags & GFS2_DIF_SYSTEM) { 216 iput(inode); 217 goto fail; 218 } 219 220 gfs2_glock_dq_uninit(&i_gh); 221 222 out_inode: 223 dentry = d_obtain_alias(inode); 224 if (!IS_ERR(dentry)) 225 dentry->d_op = &gfs2_dops; 226 return dentry; 227 228 fail_rgd: 229 gfs2_glock_dq_uninit(&rgd_gh); 230 231 fail_rindex: 232 gfs2_glock_dq_uninit(&ri_gh); 233 234 fail: 235 gfs2_glock_dq_uninit(&i_gh); 236 return ERR_PTR(error); 237 } 238 239 static struct dentry *gfs2_fh_to_dentry(struct super_block *sb, struct fid *fid, 240 int fh_len, int fh_type) 241 { 242 struct gfs2_inum_host this; 243 __be32 *fh = (__force __be32 *)fid->raw; 244 245 switch (fh_type) { 246 case GFS2_SMALL_FH_SIZE: 247 case GFS2_LARGE_FH_SIZE: 248 case GFS2_OLD_FH_SIZE: 249 this.no_formal_ino = ((u64)be32_to_cpu(fh[0])) << 32; 250 this.no_formal_ino |= be32_to_cpu(fh[1]); 251 this.no_addr = ((u64)be32_to_cpu(fh[2])) << 32; 252 this.no_addr |= be32_to_cpu(fh[3]); 253 return gfs2_get_dentry(sb, &this); 254 default: 255 return NULL; 256 } 257 } 258 259 static struct dentry *gfs2_fh_to_parent(struct super_block *sb, struct fid *fid, 260 int fh_len, int fh_type) 261 { 262 struct gfs2_inum_host parent; 263 __be32 *fh = (__force __be32 *)fid->raw; 264 265 switch (fh_type) { 266 case GFS2_LARGE_FH_SIZE: 267 case GFS2_OLD_FH_SIZE: 268 parent.no_formal_ino = ((u64)be32_to_cpu(fh[4])) << 32; 269 parent.no_formal_ino |= be32_to_cpu(fh[5]); 270 parent.no_addr = ((u64)be32_to_cpu(fh[6])) << 32; 271 parent.no_addr |= be32_to_cpu(fh[7]); 272 return gfs2_get_dentry(sb, &parent); 273 default: 274 return NULL; 275 } 276 } 277 278 const struct export_operations gfs2_export_ops = { 279 .encode_fh = gfs2_encode_fh, 280 .fh_to_dentry = gfs2_fh_to_dentry, 281 .fh_to_parent = gfs2_fh_to_parent, 282 .get_name = gfs2_get_name, 283 .get_parent = gfs2_get_parent, 284 }; 285 286