main.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506
  1. /*
  2. * fs/sdcardfs/main.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. #include "sdcardfs.h"
  21. #include <linux/module.h>
  22. #include <linux/types.h>
  23. #include <linux/parser.h>
  24. enum {
  25. Opt_fsuid,
  26. Opt_fsgid,
  27. Opt_gid,
  28. Opt_debug,
  29. Opt_mask,
  30. Opt_multiuser,
  31. Opt_userid,
  32. Opt_reserved_mb,
  33. Opt_gid_derivation,
  34. Opt_default_normal,
  35. Opt_unshared_obb,
  36. Opt_err,
  37. };
  38. static const match_table_t sdcardfs_tokens = {
  39. {Opt_fsuid, "fsuid=%u"},
  40. {Opt_fsgid, "fsgid=%u"},
  41. {Opt_gid, "gid=%u"},
  42. {Opt_debug, "debug"},
  43. {Opt_mask, "mask=%u"},
  44. {Opt_userid, "userid=%d"},
  45. {Opt_multiuser, "multiuser"},
  46. {Opt_gid_derivation, "derive_gid"},
  47. {Opt_default_normal, "default_normal"},
  48. {Opt_unshared_obb, "unshared_obb"},
  49. {Opt_reserved_mb, "reserved_mb=%u"},
  50. {Opt_err, NULL}
  51. };
  52. static int parse_options(struct super_block *sb, char *options, int silent,
  53. int *debug, struct sdcardfs_vfsmount_options *vfsopts,
  54. struct sdcardfs_mount_options *opts)
  55. {
  56. char *p;
  57. substring_t args[MAX_OPT_ARGS];
  58. int option;
  59. /* by default, we use AID_MEDIA_RW as uid, gid */
  60. opts->fs_low_uid = AID_MEDIA_RW;
  61. opts->fs_low_gid = AID_MEDIA_RW;
  62. vfsopts->mask = 0;
  63. opts->multiuser = false;
  64. opts->fs_user_id = 0;
  65. vfsopts->gid = 0;
  66. /* by default, 0MB is reserved */
  67. opts->reserved_mb = 0;
  68. /* by default, gid derivation is off */
  69. opts->gid_derivation = false;
  70. opts->default_normal = false;
  71. *debug = 0;
  72. if (!options)
  73. return 0;
  74. while ((p = strsep(&options, ",")) != NULL) {
  75. int token;
  76. if (!*p)
  77. continue;
  78. token = match_token(p, sdcardfs_tokens, args);
  79. switch (token) {
  80. case Opt_debug:
  81. *debug = 1;
  82. break;
  83. case Opt_fsuid:
  84. if (match_int(&args[0], &option))
  85. return 0;
  86. opts->fs_low_uid = option;
  87. break;
  88. case Opt_fsgid:
  89. if (match_int(&args[0], &option))
  90. return 0;
  91. opts->fs_low_gid = option;
  92. break;
  93. case Opt_gid:
  94. if (match_int(&args[0], &option))
  95. return 0;
  96. vfsopts->gid = option;
  97. break;
  98. case Opt_userid:
  99. if (match_int(&args[0], &option))
  100. return 0;
  101. opts->fs_user_id = option;
  102. break;
  103. case Opt_mask:
  104. if (match_int(&args[0], &option))
  105. return 0;
  106. vfsopts->mask = option;
  107. break;
  108. case Opt_multiuser:
  109. opts->multiuser = true;
  110. break;
  111. case Opt_reserved_mb:
  112. if (match_int(&args[0], &option))
  113. return 0;
  114. opts->reserved_mb = option;
  115. break;
  116. case Opt_gid_derivation:
  117. opts->gid_derivation = true;
  118. break;
  119. case Opt_default_normal:
  120. opts->default_normal = true;
  121. break;
  122. case Opt_unshared_obb:
  123. opts->unshared_obb = true;
  124. break;
  125. /* unknown option */
  126. default:
  127. if (!silent)
  128. pr_err("Unrecognized mount option \"%s\" or missing value", p);
  129. return -EINVAL;
  130. }
  131. }
  132. if (*debug) {
  133. pr_info("sdcardfs : options - debug:%d\n", *debug);
  134. pr_info("sdcardfs : options - uid:%d\n",
  135. opts->fs_low_uid);
  136. pr_info("sdcardfs : options - gid:%d\n",
  137. opts->fs_low_gid);
  138. }
  139. return 0;
  140. }
  141. int parse_options_remount(struct super_block *sb, char *options, int silent,
  142. struct sdcardfs_vfsmount_options *vfsopts)
  143. {
  144. char *p;
  145. substring_t args[MAX_OPT_ARGS];
  146. int option;
  147. int debug;
  148. if (!options)
  149. return 0;
  150. while ((p = strsep(&options, ",")) != NULL) {
  151. int token;
  152. if (!*p)
  153. continue;
  154. token = match_token(p, sdcardfs_tokens, args);
  155. switch (token) {
  156. case Opt_debug:
  157. debug = 1;
  158. break;
  159. case Opt_gid:
  160. if (match_int(&args[0], &option))
  161. return 0;
  162. vfsopts->gid = option;
  163. break;
  164. case Opt_mask:
  165. if (match_int(&args[0], &option))
  166. return 0;
  167. vfsopts->mask = option;
  168. break;
  169. case Opt_unshared_obb:
  170. case Opt_default_normal:
  171. case Opt_multiuser:
  172. case Opt_userid:
  173. case Opt_fsuid:
  174. case Opt_fsgid:
  175. case Opt_reserved_mb:
  176. case Opt_gid_derivation:
  177. if (!silent)
  178. pr_warn("Option \"%s\" can't be changed during remount\n", p);
  179. break;
  180. /* unknown option */
  181. default:
  182. if (!silent)
  183. pr_err("Unrecognized mount option \"%s\" or missing value", p);
  184. return -EINVAL;
  185. }
  186. }
  187. if (debug) {
  188. pr_info("sdcardfs : options - debug:%d\n", debug);
  189. pr_info("sdcardfs : options - gid:%d\n", vfsopts->gid);
  190. pr_info("sdcardfs : options - mask:%d\n", vfsopts->mask);
  191. }
  192. return 0;
  193. }
  194. #if 0
  195. /*
  196. * our custom d_alloc_root work-alike
  197. *
  198. * we can't use d_alloc_root if we want to use our own interpose function
  199. * unchanged, so we simply call our own "fake" d_alloc_root
  200. */
  201. static struct dentry *sdcardfs_d_alloc_root(struct super_block *sb)
  202. {
  203. struct dentry *ret = NULL;
  204. if (sb) {
  205. static const struct qstr name = {
  206. .name = "/",
  207. .len = 1
  208. };
  209. ret = d_alloc(NULL, &name);
  210. if (ret) {
  211. d_set_d_op(ret, &sdcardfs_ci_dops);
  212. ret->d_sb = sb;
  213. ret->d_parent = ret;
  214. }
  215. }
  216. return ret;
  217. }
  218. #endif
  219. DEFINE_MUTEX(sdcardfs_super_list_lock);
  220. EXPORT_SYMBOL_GPL(sdcardfs_super_list_lock);
  221. LIST_HEAD(sdcardfs_super_list);
  222. EXPORT_SYMBOL_GPL(sdcardfs_super_list);
  223. /*
  224. * There is no need to lock the sdcardfs_super_info's rwsem as there is no
  225. * way anyone can have a reference to the superblock at this point in time.
  226. */
  227. static int sdcardfs_read_super(struct vfsmount *mnt, struct super_block *sb,
  228. const char *dev_name, void *raw_data, int silent)
  229. {
  230. int err = 0;
  231. int debug;
  232. struct super_block *lower_sb;
  233. struct path lower_path;
  234. struct sdcardfs_sb_info *sb_info;
  235. struct sdcardfs_vfsmount_options *mnt_opt = mnt->data;
  236. struct inode *inode;
  237. pr_info("sdcardfs version 2.0\n");
  238. if (!dev_name) {
  239. pr_err("sdcardfs: read_super: missing dev_name argument\n");
  240. err = -EINVAL;
  241. goto out;
  242. }
  243. pr_info("sdcardfs: dev_name -> %s\n", dev_name);
  244. pr_info("sdcardfs: options -> %s\n", (char *)raw_data);
  245. pr_info("sdcardfs: mnt -> %p\n", mnt);
  246. /* parse lower path */
  247. err = kern_path(dev_name, LOOKUP_FOLLOW | LOOKUP_DIRECTORY,
  248. &lower_path);
  249. if (err) {
  250. pr_err("sdcardfs: error accessing lower directory '%s'\n", dev_name);
  251. goto out;
  252. }
  253. /* allocate superblock private data */
  254. sb->s_fs_info = kzalloc(sizeof(struct sdcardfs_sb_info), GFP_KERNEL);
  255. if (!SDCARDFS_SB(sb)) {
  256. pr_crit("sdcardfs: read_super: out of memory\n");
  257. err = -ENOMEM;
  258. goto out_free;
  259. }
  260. sb_info = sb->s_fs_info;
  261. /* parse options */
  262. err = parse_options(sb, raw_data, silent, &debug, mnt_opt, &sb_info->options);
  263. if (err) {
  264. pr_err("sdcardfs: invalid options\n");
  265. goto out_freesbi;
  266. }
  267. /* set the lower superblock field of upper superblock */
  268. lower_sb = lower_path.dentry->d_sb;
  269. atomic_inc(&lower_sb->s_active);
  270. sdcardfs_set_lower_super(sb, lower_sb);
  271. sb->s_stack_depth = lower_sb->s_stack_depth + 1;
  272. if (sb->s_stack_depth > FILESYSTEM_MAX_STACK_DEPTH) {
  273. pr_err("sdcardfs: maximum fs stacking depth exceeded\n");
  274. err = -EINVAL;
  275. goto out_sput;
  276. }
  277. /* inherit maxbytes from lower file system */
  278. sb->s_maxbytes = lower_sb->s_maxbytes;
  279. /*
  280. * Our c/m/atime granularity is 1 ns because we may stack on file
  281. * systems whose granularity is as good.
  282. */
  283. sb->s_time_gran = 1;
  284. sb->s_magic = SDCARDFS_SUPER_MAGIC;
  285. sb->s_op = &sdcardfs_sops;
  286. /* get a new inode and allocate our root dentry */
  287. inode = sdcardfs_iget(sb, lower_path.dentry->d_inode, 0);
  288. if (IS_ERR(inode)) {
  289. err = PTR_ERR(inode);
  290. goto out_sput;
  291. }
  292. sb->s_root = d_make_root(inode);
  293. if (!sb->s_root) {
  294. err = -ENOMEM;
  295. goto out_sput;
  296. }
  297. d_set_d_op(sb->s_root, &sdcardfs_ci_dops);
  298. /* link the upper and lower dentries */
  299. sb->s_root->d_fsdata = NULL;
  300. err = new_dentry_private_data(sb->s_root);
  301. if (err)
  302. goto out_freeroot;
  303. /* set the lower dentries for s_root */
  304. sdcardfs_set_lower_path(sb->s_root, &lower_path);
  305. /*
  306. * No need to call interpose because we already have a positive
  307. * dentry, which was instantiated by d_make_root. Just need to
  308. * d_rehash it.
  309. */
  310. d_rehash(sb->s_root);
  311. /* setup permission policy */
  312. sb_info->obbpath_s = kzalloc(PATH_MAX, GFP_KERNEL);
  313. mutex_lock(&sdcardfs_super_list_lock);
  314. if (sb_info->options.multiuser) {
  315. setup_derived_state(sb->s_root->d_inode, PERM_PRE_ROOT,
  316. sb_info->options.fs_user_id, AID_ROOT);
  317. snprintf(sb_info->obbpath_s, PATH_MAX, "%s/obb", dev_name);
  318. } else {
  319. setup_derived_state(sb->s_root->d_inode, PERM_ROOT,
  320. sb_info->options.fs_user_id, AID_ROOT);
  321. snprintf(sb_info->obbpath_s, PATH_MAX, "%s/Android/obb", dev_name);
  322. }
  323. fixup_tmp_permissions(sb->s_root->d_inode);
  324. sb_info->sb = sb;
  325. list_add(&sb_info->list, &sdcardfs_super_list);
  326. mutex_unlock(&sdcardfs_super_list_lock);
  327. if (!silent)
  328. pr_info("sdcardfs: mounted on top of %s type %s\n",
  329. dev_name, lower_sb->s_type->name);
  330. goto out; /* all is well */
  331. /* no longer needed: free_dentry_private_data(sb->s_root); */
  332. out_freeroot:
  333. dput(sb->s_root);
  334. sb->s_root = NULL;
  335. out_sput:
  336. /* drop refs we took earlier */
  337. atomic_dec(&lower_sb->s_active);
  338. out_freesbi:
  339. kfree(SDCARDFS_SB(sb));
  340. sb->s_fs_info = NULL;
  341. out_free:
  342. path_put(&lower_path);
  343. out:
  344. return err;
  345. }
  346. struct sdcardfs_mount_private {
  347. struct vfsmount *mnt;
  348. const char *dev_name;
  349. void *raw_data;
  350. };
  351. static int __sdcardfs_fill_super(
  352. struct super_block *sb,
  353. void *_priv, int silent)
  354. {
  355. struct sdcardfs_mount_private *priv = _priv;
  356. return sdcardfs_read_super(priv->mnt,
  357. sb, priv->dev_name, priv->raw_data, silent);
  358. }
  359. static struct dentry *sdcardfs_mount(struct vfsmount *mnt,
  360. struct file_system_type *fs_type, int flags,
  361. const char *dev_name, void *raw_data)
  362. {
  363. struct sdcardfs_mount_private priv = {
  364. .mnt = mnt,
  365. .dev_name = dev_name,
  366. .raw_data = raw_data
  367. };
  368. return mount_nodev(fs_type, flags,
  369. &priv, __sdcardfs_fill_super);
  370. }
  371. static struct dentry *sdcardfs_mount_wrn(struct file_system_type *fs_type,
  372. int flags, const char *dev_name, void *raw_data)
  373. {
  374. WARN(1, "sdcardfs does not support mount. Use mount2.\n");
  375. return ERR_PTR(-EINVAL);
  376. }
  377. void *sdcardfs_alloc_mnt_data(void)
  378. {
  379. return kmalloc(sizeof(struct sdcardfs_vfsmount_options), GFP_KERNEL);
  380. }
  381. void sdcardfs_kill_sb(struct super_block *sb)
  382. {
  383. struct sdcardfs_sb_info *sbi;
  384. if (sb->s_magic == SDCARDFS_SUPER_MAGIC && sb->s_fs_info) {
  385. sbi = SDCARDFS_SB(sb);
  386. mutex_lock(&sdcardfs_super_list_lock);
  387. list_del(&sbi->list);
  388. mutex_unlock(&sdcardfs_super_list_lock);
  389. }
  390. kill_anon_super(sb);
  391. }
  392. static struct file_system_type sdcardfs_fs_type = {
  393. .owner = THIS_MODULE,
  394. .name = SDCARDFS_NAME,
  395. .mount = sdcardfs_mount_wrn,
  396. .mount2 = sdcardfs_mount,
  397. .alloc_mnt_data = sdcardfs_alloc_mnt_data,
  398. .kill_sb = sdcardfs_kill_sb,
  399. .fs_flags = 0,
  400. };
  401. MODULE_ALIAS_FS(SDCARDFS_NAME);
  402. static int __init init_sdcardfs_fs(void)
  403. {
  404. int err;
  405. pr_info("Registering sdcardfs " SDCARDFS_VERSION "\n");
  406. err = sdcardfs_init_inode_cache();
  407. if (err)
  408. goto out;
  409. err = sdcardfs_init_dentry_cache();
  410. if (err)
  411. goto out;
  412. err = packagelist_init();
  413. if (err)
  414. goto out;
  415. err = register_filesystem(&sdcardfs_fs_type);
  416. out:
  417. if (err) {
  418. sdcardfs_destroy_inode_cache();
  419. sdcardfs_destroy_dentry_cache();
  420. packagelist_exit();
  421. }
  422. return err;
  423. }
  424. static void __exit exit_sdcardfs_fs(void)
  425. {
  426. sdcardfs_destroy_inode_cache();
  427. sdcardfs_destroy_dentry_cache();
  428. packagelist_exit();
  429. unregister_filesystem(&sdcardfs_fs_type);
  430. pr_info("Completed sdcardfs module unload\n");
  431. }
  432. /* Original wrapfs authors */
  433. MODULE_AUTHOR("Erez Zadok, Filesystems and Storage Lab, Stony Brook University (http://www.fsl.cs.sunysb.edu/)");
  434. /* Original sdcardfs authors */
  435. MODULE_AUTHOR("Woojoong Lee, Daeho Jeong, Kitae Lee, Yeongjin Gil System Memory Lab., Samsung Electronics");
  436. /* Current maintainer */
  437. MODULE_AUTHOR("Daniel Rosenberg, Google");
  438. MODULE_DESCRIPTION("Sdcardfs " SDCARDFS_VERSION);
  439. MODULE_LICENSE("GPL");
  440. module_init(init_sdcardfs_fs);
  441. module_exit(exit_sdcardfs_fs);