1 /* 2 * fs/sdcardfs/super.c 3 * 4 * Copyright (c) 2013 Samsung Electronics Co. Ltd 5 * Authors: Daeho Jeong, Woojoong Lee, Seunghwan Hyun, 6 * Sunghwan Yun, Sungjong Seo 7 * 8 * This program has been developed as a stackable file system based on 9 * the WrapFS which written by 10 * 11 * Copyright (c) 1998-2011 Erez Zadok 12 * Copyright (c) 2009 Shrikar Archak 13 * Copyright (c) 2003-2011 Stony Brook University 14 * Copyright (c) 2003-2011 The Research Foundation of SUNY 15 * 16 * This file is dual licensed. It may be redistributed and/or modified 17 * under the terms of the Apache 2.0 License OR version 2 of the GNU 18 * General Public License. 19 */ 20 21 #include "sdcardfs.h" 22 23 /* 24 * The inode cache is used with alloc_inode for both our inode info and the 25 * vfs inode. 26 */ 27 static struct kmem_cache *sdcardfs_inode_cachep; 28 29 /* 30 * To support the top references, we must track some data separately. 31 * An sdcardfs_inode_info always has a reference to its data, and once set up, 32 * also has a reference to its top. The top may be itself, in which case it 33 * holds two references to its data. When top is changed, it takes a ref to the 34 * new data and then drops the ref to the old data. 35 */ 36 static struct kmem_cache *sdcardfs_inode_data_cachep; 37 data_release(struct kref * ref)38 void data_release(struct kref *ref) 39 { 40 struct sdcardfs_inode_data *data = 41 container_of(ref, struct sdcardfs_inode_data, refcount); 42 43 kmem_cache_free(sdcardfs_inode_data_cachep, data); 44 } 45 46 /* final actions when unmounting a file system */ sdcardfs_put_super(struct super_block * sb)47 static void sdcardfs_put_super(struct super_block *sb) 48 { 49 struct sdcardfs_sb_info *spd; 50 struct super_block *s; 51 52 spd = SDCARDFS_SB(sb); 53 if (!spd) 54 return; 55 56 if (spd->obbpath_s) { 57 kfree(spd->obbpath_s); 58 path_put(&spd->obbpath); 59 } 60 61 /* decrement lower super references */ 62 s = sdcardfs_lower_super(sb); 63 sdcardfs_set_lower_super(sb, NULL); 64 atomic_dec(&s->s_active); 65 66 kfree(spd); 67 sb->s_fs_info = NULL; 68 } 69 sdcardfs_statfs(struct dentry * dentry,struct kstatfs * buf)70 static int sdcardfs_statfs(struct dentry *dentry, struct kstatfs *buf) 71 { 72 int err; 73 struct path lower_path; 74 u32 min_blocks; 75 struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dentry->d_sb); 76 77 sdcardfs_get_lower_path(dentry, &lower_path); 78 err = vfs_statfs(&lower_path, buf); 79 sdcardfs_put_lower_path(dentry, &lower_path); 80 81 if (sbi->options.reserved_mb) { 82 /* Invalid statfs informations. */ 83 if (buf->f_bsize == 0) { 84 pr_err("Returned block size is zero.\n"); 85 return -EINVAL; 86 } 87 88 min_blocks = ((sbi->options.reserved_mb * 1024 * 1024)/buf->f_bsize); 89 buf->f_blocks -= min_blocks; 90 91 if (buf->f_bavail > min_blocks) 92 buf->f_bavail -= min_blocks; 93 else 94 buf->f_bavail = 0; 95 96 /* Make reserved blocks invisiable to media storage */ 97 buf->f_bfree = buf->f_bavail; 98 } 99 100 /* set return buf to our f/s to avoid confusing user-level utils */ 101 buf->f_type = SDCARDFS_SUPER_MAGIC; 102 103 return err; 104 } 105 106 /* 107 * @flags: numeric mount options 108 * @options: mount options string 109 */ sdcardfs_remount_fs(struct super_block * sb,int * flags,char * options)110 static int sdcardfs_remount_fs(struct super_block *sb, int *flags, char *options) 111 { 112 int err = 0; 113 114 /* 115 * The VFS will take care of "ro" and "rw" flags among others. We 116 * can safely accept a few flags (RDONLY, MANDLOCK), and honor 117 * SILENT, but anything else left over is an error. 118 */ 119 if ((*flags & ~(MS_RDONLY | MS_MANDLOCK | MS_SILENT)) != 0) { 120 pr_err("sdcardfs: remount flags 0x%x unsupported\n", *flags); 121 err = -EINVAL; 122 } 123 124 return err; 125 } 126 127 /* 128 * @mnt: mount point we are remounting 129 * @sb: superblock we are remounting 130 * @flags: numeric mount options 131 * @options: mount options string 132 */ sdcardfs_remount_fs2(struct vfsmount * mnt,struct super_block * sb,int * flags,char * options)133 static int sdcardfs_remount_fs2(struct vfsmount *mnt, struct super_block *sb, 134 int *flags, char *options) 135 { 136 int err = 0; 137 138 /* 139 * The VFS will take care of "ro" and "rw" flags among others. We 140 * can safely accept a few flags (RDONLY, MANDLOCK), and honor 141 * SILENT, but anything else left over is an error. 142 */ 143 if ((*flags & ~(MS_RDONLY | MS_MANDLOCK | MS_SILENT | MS_REMOUNT)) != 0) { 144 pr_err("sdcardfs: remount flags 0x%x unsupported\n", *flags); 145 err = -EINVAL; 146 } 147 pr_info("Remount options were %s for vfsmnt %p.\n", options, mnt); 148 err = parse_options_remount(sb, options, *flags & ~MS_SILENT, mnt->data); 149 150 151 return err; 152 } 153 sdcardfs_clone_mnt_data(void * data)154 static void *sdcardfs_clone_mnt_data(void *data) 155 { 156 struct sdcardfs_vfsmount_options *opt = kmalloc(sizeof(struct sdcardfs_vfsmount_options), GFP_KERNEL); 157 struct sdcardfs_vfsmount_options *old = data; 158 159 if (!opt) 160 return NULL; 161 opt->gid = old->gid; 162 opt->mask = old->mask; 163 return opt; 164 } 165 sdcardfs_copy_mnt_data(void * data,void * newdata)166 static void sdcardfs_copy_mnt_data(void *data, void *newdata) 167 { 168 struct sdcardfs_vfsmount_options *old = data; 169 struct sdcardfs_vfsmount_options *new = newdata; 170 171 old->gid = new->gid; 172 old->mask = new->mask; 173 } 174 175 /* 176 * Called by iput() when the inode reference count reached zero 177 * and the inode is not hashed anywhere. Used to clear anything 178 * that needs to be, before the inode is completely destroyed and put 179 * on the inode free list. 180 */ sdcardfs_evict_inode(struct inode * inode)181 static void sdcardfs_evict_inode(struct inode *inode) 182 { 183 struct inode *lower_inode; 184 185 truncate_inode_pages(&inode->i_data, 0); 186 set_top(SDCARDFS_I(inode), NULL); 187 clear_inode(inode); 188 /* 189 * Decrement a reference to a lower_inode, which was incremented 190 * by our read_inode when it was created initially. 191 */ 192 lower_inode = sdcardfs_lower_inode(inode); 193 sdcardfs_set_lower_inode(inode, NULL); 194 iput(lower_inode); 195 } 196 sdcardfs_alloc_inode(struct super_block * sb)197 static struct inode *sdcardfs_alloc_inode(struct super_block *sb) 198 { 199 struct sdcardfs_inode_info *i; 200 struct sdcardfs_inode_data *d; 201 202 i = kmem_cache_alloc(sdcardfs_inode_cachep, GFP_KERNEL); 203 if (!i) 204 return NULL; 205 206 /* memset everything up to the inode to 0 */ 207 memset(i, 0, offsetof(struct sdcardfs_inode_info, vfs_inode)); 208 209 d = kmem_cache_alloc(sdcardfs_inode_data_cachep, 210 GFP_KERNEL | __GFP_ZERO); 211 if (!d) { 212 kmem_cache_free(sdcardfs_inode_cachep, i); 213 return NULL; 214 } 215 216 i->data = d; 217 kref_init(&d->refcount); 218 i->top_data = d; 219 spin_lock_init(&i->top_lock); 220 kref_get(&d->refcount); 221 222 i->vfs_inode.i_version = 1; 223 return &i->vfs_inode; 224 } 225 i_callback(struct rcu_head * head)226 static void i_callback(struct rcu_head *head) 227 { 228 struct inode *inode = container_of(head, struct inode, i_rcu); 229 230 release_own_data(SDCARDFS_I(inode)); 231 kmem_cache_free(sdcardfs_inode_cachep, SDCARDFS_I(inode)); 232 } 233 sdcardfs_destroy_inode(struct inode * inode)234 static void sdcardfs_destroy_inode(struct inode *inode) 235 { 236 call_rcu(&inode->i_rcu, i_callback); 237 } 238 239 /* sdcardfs inode cache constructor */ init_once(void * obj)240 static void init_once(void *obj) 241 { 242 struct sdcardfs_inode_info *i = obj; 243 244 inode_init_once(&i->vfs_inode); 245 } 246 sdcardfs_init_inode_cache(void)247 int sdcardfs_init_inode_cache(void) 248 { 249 sdcardfs_inode_cachep = 250 kmem_cache_create("sdcardfs_inode_cache", 251 sizeof(struct sdcardfs_inode_info), 0, 252 SLAB_RECLAIM_ACCOUNT, init_once); 253 254 if (!sdcardfs_inode_cachep) 255 return -ENOMEM; 256 257 sdcardfs_inode_data_cachep = 258 kmem_cache_create("sdcardfs_inode_data_cache", 259 sizeof(struct sdcardfs_inode_data), 0, 260 SLAB_RECLAIM_ACCOUNT, NULL); 261 if (!sdcardfs_inode_data_cachep) { 262 kmem_cache_destroy(sdcardfs_inode_cachep); 263 return -ENOMEM; 264 } 265 266 return 0; 267 } 268 269 /* sdcardfs inode cache destructor */ sdcardfs_destroy_inode_cache(void)270 void sdcardfs_destroy_inode_cache(void) 271 { 272 kmem_cache_destroy(sdcardfs_inode_data_cachep); 273 kmem_cache_destroy(sdcardfs_inode_cachep); 274 } 275 276 /* 277 * Used only in nfs, to kill any pending RPC tasks, so that subsequent 278 * code can actually succeed and won't leave tasks that need handling. 279 */ sdcardfs_umount_begin(struct super_block * sb)280 static void sdcardfs_umount_begin(struct super_block *sb) 281 { 282 struct super_block *lower_sb; 283 284 lower_sb = sdcardfs_lower_super(sb); 285 if (lower_sb && lower_sb->s_op && lower_sb->s_op->umount_begin) 286 lower_sb->s_op->umount_begin(lower_sb); 287 } 288 sdcardfs_show_options(struct vfsmount * mnt,struct seq_file * m,struct dentry * root)289 static int sdcardfs_show_options(struct vfsmount *mnt, struct seq_file *m, 290 struct dentry *root) 291 { 292 struct sdcardfs_sb_info *sbi = SDCARDFS_SB(root->d_sb); 293 struct sdcardfs_mount_options *opts = &sbi->options; 294 struct sdcardfs_vfsmount_options *vfsopts = mnt->data; 295 296 if (opts->fs_low_uid != 0) 297 seq_printf(m, ",fsuid=%u", opts->fs_low_uid); 298 if (opts->fs_low_gid != 0) 299 seq_printf(m, ",fsgid=%u", opts->fs_low_gid); 300 if (vfsopts->gid != 0) 301 seq_printf(m, ",gid=%u", vfsopts->gid); 302 if (opts->multiuser) 303 seq_puts(m, ",multiuser"); 304 if (vfsopts->mask) 305 seq_printf(m, ",mask=%u", vfsopts->mask); 306 if (opts->fs_user_id) 307 seq_printf(m, ",userid=%u", opts->fs_user_id); 308 if (opts->gid_derivation) 309 seq_puts(m, ",derive_gid"); 310 if (opts->default_normal) 311 seq_puts(m, ",default_normal"); 312 if (opts->reserved_mb != 0) 313 seq_printf(m, ",reserved=%uMB", opts->reserved_mb); 314 315 return 0; 316 }; 317 318 const struct super_operations sdcardfs_sops = { 319 .put_super = sdcardfs_put_super, 320 .statfs = sdcardfs_statfs, 321 .remount_fs = sdcardfs_remount_fs, 322 .remount_fs2 = sdcardfs_remount_fs2, 323 .clone_mnt_data = sdcardfs_clone_mnt_data, 324 .copy_mnt_data = sdcardfs_copy_mnt_data, 325 .evict_inode = sdcardfs_evict_inode, 326 .umount_begin = sdcardfs_umount_begin, 327 .show_options2 = sdcardfs_show_options, 328 .alloc_inode = sdcardfs_alloc_inode, 329 .destroy_inode = sdcardfs_destroy_inode, 330 .drop_inode = generic_delete_inode, 331 }; 332