* refs/heads/tmp-bd858d7 Linux 4.4.181 ethtool: check the return value of get_regs_len ipv4: Define __ipv4_neigh_lookup_noref when CONFIG_INET is disabled fuse: Add FOPEN_STREAM to use stream_open() fs: stream_open - opener for stream-like files so that read and write can run simultaneously without deadlock drm/gma500/cdv: Check vbt config bits when detecting lvds panels genwqe: Prevent an integer overflow in the ioctl MIPS: pistachio: Build uImage.gz by default fuse: fallocate: fix return with locked inode parisc: Use implicit space register selection for loading the coherence index of I/O pdirs rcu: locking and unlocking need to always be at least barriers pktgen: do not sleep with the thread lock held. net: rds: fix memory leak in rds_ib_flush_mr_pool net/mlx4_en: ethtool, Remove unsupported SFP EEPROM high pages query neighbor: Call __ipv4_neigh_lookup_noref in neigh_xmit ethtool: fix potential userspace buffer overflow media: uvcvideo: Fix uvc_alloc_entity() allocation alignment usb: gadget: fix request length error for isoc transfer net: cdc_ncm: GetNtbFormat endian fix Revert "x86/build: Move _etext to actual end of .text" userfaultfd: don't pin the user memory in userfaultfd_file_create() brcmfmac: add subtype check for event handling in data path brcmfmac: add length checks in scheduled scan result handler brcmfmac: fix incorrect event channel deduction brcmfmac: revise handling events in receive path brcmfmac: screening firmware event packet brcmfmac: Add length checks on firmware events bnx2x: disable GSO where gso_size is too big for hardware net: create skb_gso_validate_mac_len() binder: replace "%p" with "%pK" binder: Replace "%p" with "%pK" for stable CIFS: cifs_read_allocate_pages: don't iterate through whole page array on ENOMEM kernel/signal.c: trace_signal_deliver when signal_group_exit memcg: make it work on sparse non-0-node systems tty: max310x: Fix external crystal register setup tty: serial: msm_serial: Fix XON/XOFF drm/nouveau/i2c: Disable i2c bus access after ->fini() ALSA: hda/realtek - Set default power save node to 0 Btrfs: fix race updating log root item during fsync scsi: zfcp: fix to prevent port_remove with pure auto scan LUNs (only sdevs) scsi: zfcp: fix missing zfcp_port reference put on -EBUSY from port_remove media: smsusb: better handle optional alignment media: usb: siano: Fix false-positive "uninitialized variable" warning media: usb: siano: Fix general protection fault in smsusb USB: rio500: fix memory leak in close after disconnect USB: rio500: refuse more than one device at a time USB: Add LPM quirk for Surface Dock GigE adapter USB: sisusbvga: fix oops in error path of sisusb_probe USB: Fix slab-out-of-bounds write in usb_get_bos_descriptor usb: xhci: avoid null pointer deref when bos field is NULL xhci: Convert xhci_handshake() to use readl_poll_timeout_atomic() include/linux/bitops.h: sanitize rotate primitives sparc64: Fix regression in non-hypervisor TLB flush xcall tipc: fix modprobe tipc failed after switch order of device registration -v2 Revert "tipc: fix modprobe tipc failed after switch order of device registration" xen/pciback: Don't disable PCI_COMMAND on PCI device reset. crypto: vmx - ghash: do nosimd fallback manually net: mvpp2: fix bad MVPP2_TXQ_SCHED_TOKEN_CNTR_REG queue value bnxt_en: Fix aggregation buffer leak under OOM condition. tipc: Avoid copying bytes beyond the supplied data usbnet: fix kernel crash after disconnect net: stmmac: fix reset gpio free missing net-gro: fix use-after-free read in napi_gro_frags() llc: fix skb leak in llc_build_and_send_ui_pkt() ipv6: Consider sk_bound_dev_if when binding a raw socket to an address ASoC: davinci-mcasp: Fix clang warning without CONFIG_PM spi: Fix zero length xfer bug spi: rspi: Fix sequencer reset during initialization spi : spi-topcliff-pch: Fix to handle empty DMA buffers scsi: lpfc: Fix SLI3 commands being issued on SLI4 devices media: saa7146: avoid high stack usage with clang media: go7007: avoid clang frame overflow warning with KASAN media: m88ds3103: serialize reset messages in m88ds3103_set_frontend scsi: qla4xxx: avoid freeing unallocated dma memory usb: core: Add PM runtime calls to usb_hcd_platform_shutdown rcutorture: Fix cleanup path for invalid torture_type strings tty: ipwireless: fix missing checks for ioremap virtio_console: initialize vtermno value for ports media: wl128x: prevent two potential buffer overflows spi: tegra114: reset controller on probe cxgb3/l2t: Fix undefined behaviour ASoC: fsl_utils: fix a leaked reference by adding missing of_node_put ASoC: eukrea-tlv320: fix a leaked reference by adding missing of_node_put HID: core: move Usage Page concatenation to Main item chardev: add additional check for minor range overlap x86/ia32: Fix ia32_restore_sigcontext() AC leak arm64: cpu_ops: fix a leaked reference by adding missing of_node_put scsi: ufs: Avoid configuring regulator with undefined voltage range scsi: ufs: Fix regulator load and icc-level configuration brcmfmac: fix race during disconnect when USB completion is in progress brcmfmac: convert dev_init_lock mutex to completion b43: shut up clang -Wuninitialized variable warning brcmfmac: fix missing checks for kmemdup rtlwifi: fix a potential NULL pointer dereference iio: common: ssp_sensors: Initialize calculated_time in ssp_common_process_data iio: hmc5843: fix potential NULL pointer dereferences iio: ad_sigma_delta: Properly handle SPI bus locking vs CS assertion x86/build: Keep local relocations with ld.lld cpufreq: pmac32: fix possible object reference leak cpufreq/pasemi: fix possible object reference leak cpufreq: ppc_cbe: fix possible object reference leak s390: cio: fix cio_irb declaration extcon: arizona: Disable mic detect if running when driver is removed PM / core: Propagate dev->power.wakeup_path when no callbacks mmc: sdhci-of-esdhc: add erratum eSDHC-A001 and A-008358 support mmc: sdhci-of-esdhc: add erratum eSDHC5 support mmc_spi: add a status check for spi_sync_locked scsi: libsas: Do discovery on empty PHY to update PHY info hwmon: (f71805f) Use request_muxed_region for Super-IO accesses hwmon: (pc87427) Use request_muxed_region for Super-IO accesses hwmon: (smsc47b397) Use request_muxed_region for Super-IO accesses hwmon: (smsc47m1) Use request_muxed_region for Super-IO accesses hwmon: (vt1211) Use request_muxed_region for Super-IO accesses RDMA/cxgb4: Fix null pointer dereference on alloc_skb failure i40e: don't allow changes to HW VLAN stripping on active port VLANs x86/irq/64: Limit IST stack overflow check to #DB stack USB: core: Don't unbind interfaces following device reset failure sched/core: Handle overflow in cpu_shares_write_u64 sched/core: Check quota and period overflow at usec to nsec conversion powerpc/numa: improve control of topology updates media: pvrusb2: Prevent a buffer overflow media: au0828: Fix NULL pointer dereference in au0828_analog_stream_enable() audit: fix a memory leak bug media: ov2659: make S_FMT succeed even if requested format doesn't match media: au0828: stop video streaming only when last user stops media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper media: coda: clear error return value before picture run dmaengine: at_xdmac: remove BUG_ON macro in tasklet pinctrl: pistachio: fix leaked of_node references HID: logitech-hidpp: use RAP instead of FAP to get the protocol version mm/uaccess: Use 'unsigned long' to placate UBSAN warnings on older GCC versions x86/mm: Remove in_nmi() warning from 64-bit implementation of vmalloc_fault() smpboot: Place the __percpu annotation correctly x86/build: Move _etext to actual end of .text bcache: avoid clang -Wunintialized warning bcache: add failure check to run_cache_set() for journal replay bcache: fix failure in journal relplay bcache: return error immediately in bch_journal_replay() net: cw1200: fix a NULL pointer dereference mwifiex: prevent an array overflow ASoC: fsl_sai: Update is_slave_mode with correct value mac80211/cfg80211: update bss channel on channel switch dmaengine: pl330: _stop: clear interrupt status w1: fix the resume command API rtc: 88pm860x: prevent use-after-free on device remove brcm80211: potential NULL dereference in brcmf_cfg80211_vndr_cmds_dcmd_handler() spi: pxa2xx: fix SCR (divisor) calculation ASoC: imx: fix fiq dependencies powerpc/boot: Fix missing check of lseek() return value mmc: core: Verify SD bus width cxgb4: Fix error path in cxgb4_init_module gfs2: Fix lru_count going negative tools include: Adopt linux/bits.h perf tools: No need to include bitops.h in util.h at76c50x-usb: Don't register led_trigger if usb_register_driver failed ssb: Fix possible NULL pointer dereference in ssb_host_pcmcia_exit media: vivid: use vfree() instead of kfree() for dev->bitmap_cap media: cpia2: Fix use-after-free in cpia2_exit fbdev: fix WARNING in __alloc_pages_nodemask bug hugetlb: use same fault hash key for shared and private mappings fbdev: fix divide error in fb_var_to_videomode btrfs: sysfs: don't leak memory when failing add fsid Btrfs: fix race between ranged fsync and writeback of adjacent ranges gfs2: Fix sign extension bug in gfs2_update_stats crypto: vmx - CTR: always increment IV as quadword Revert "scsi: sd: Keep disk read-only when re-reading partition" bio: fix improper use of smp_mb__before_atomic() KVM: x86: fix return value for reserved EFER ext4: do not delete unlinked inode from orphan list on failed truncate fbdev: sm712fb: fix memory frequency by avoiding a switch/case fallthrough btrfs: Honour FITRIM range constraints during free space trim md/raid: raid5 preserve the writeback action after the parity check Revert "Don't jump to compute_result state from check_result state" perf bench numa: Add define for RUSAGE_THREAD if not present ufs: fix braino in ufs_get_inode_gid() for solaris UFS flavour power: supply: sysfs: prevent endless uevent loop with CONFIG_POWER_SUPPLY_DEBUG KVM: arm/arm64: Ensure vcpu target is unset on reset failure xfrm4: Fix uninitialized memory read in _decode_session4 vti4: ipip tunnel deregistration fixes. xfrm6_tunnel: Fix potential panic when unloading xfrm6_tunnel module xfrm: policy: Fix out-of-bound array accesses in __xfrm_policy_unlink dm delay: fix a crash when invalid device is specified PCI: Mark Atheros AR9462 to avoid bus reset fbdev: sm712fb: fix crashes and garbled display during DPMS modesetting fbdev: sm712fb: use 1024x768 by default on non-MIPS, fix garbled display fbdev: sm712fb: fix support for 1024x768-16 mode fbdev: sm712fb: fix crashes during framebuffer writes by correctly mapping VRAM fbdev: sm712fb: fix boot screen glitch when sm712fb replaces VGA fbdev: sm712fb: fix white screen of death on reboot, don't set CR3B-CR3F fbdev: sm712fb: fix VRAM detection, don't set SR70/71/74/75 fbdev: sm712fb: fix brightness control on reboot, don't set SR30 perf intel-pt: Fix sample timestamp wrt non-taken branches perf intel-pt: Fix improved sample timestamp perf intel-pt: Fix instructions sampling rate memory: tegra: Fix integer overflow on tick value calculation tracing: Fix partial reading of trace event's id file ceph: flush dirty inodes before proceeding with remount iommu/tegra-smmu: Fix invalid ASID bits on Tegra30/114 fuse: honor RLIMIT_FSIZE in fuse_file_fallocate fuse: fix writepages on 32bit clk: tegra: Fix PLLM programming on Tegra124+ when PMC overrides divider NFS4: Fix v4.0 client state corruption when mount media: ov6650: Fix sensor possibly not detected on probe cifs: fix strcat buffer overflow and reduce raciness in smb21_set_oplock_level() of: fix clang -Wunsequenced for be32_to_cpu() intel_th: msu: Fix single mode with IOMMU md: add mddev->pers to avoid potential NULL pointer dereference stm class: Fix channel free in stm output free path tipc: fix modprobe tipc failed after switch order of device registration tipc: switch order of device registration to fix a crash ppp: deflate: Fix possible crash in deflate_init net/mlx4_core: Change the error print to info print net: avoid weird emergency message KVM: x86: Skip EFER vs. guest CPUID checks for host-initiated writes ALSA: hda/realtek - Fix for Lenovo B50-70 inverted internal microphone bug ext4: zero out the unused memory region in the extent tree block fs/writeback.c: use rcu_barrier() to wait for inflight wb switches going into workqueue when umount writeback: synchronize sync(2) against cgroup writeback membership switches crypto: arm/aes-neonbs - don't access already-freed walk.iv crypto: salsa20 - don't access already-freed walk.iv crypto: chacha20poly1305 - set cra_name correctly crypto: gcm - fix incompatibility between "gcm" and "gcm_base" crypto: gcm - Fix error return code in crypto_gcm_create_common() ipmi:ssif: compare block number correctly for multi-part return messages bcache: never set KEY_PTRS of journal key to 0 in journal_reclaim() bcache: fix a race between cache register and cacheset unregister Btrfs: do not start a transaction at iterate_extent_inodes() ext4: fix ext4_show_options for file systems w/o journal ext4: actually request zeroing of inode table after grow tty/vt: fix write/write race in ioctl(KDSKBSENT) handler mfd: da9063: Fix OTP control register names to match datasheets for DA9063/63L ocfs2: fix ocfs2 read inode data panic in ocfs2_iget mm/mincore.c: make mincore() more conservative ASoC: RT5677-SPI: Disable 16Bit SPI Transfers ASoC: max98090: Fix restore of DAPM Muxes ALSA: hda/realtek - EAPD turn on later ALSA: hda/hdmi - Consider eld_valid when reporting jack event ALSA: usb-audio: Fix a memory leak bug crypto: x86/crct10dif-pcl - fix use via crypto_shash_digest() crypto: crct10dif-generic - fix use via crypto_shash_digest() crypto: vmx - fix copy-paste error in CTR mode ARM: exynos: Fix a leaked reference by adding missing of_node_put x86/speculation/mds: Improve CPU buffer clear documentation x86/speculation/mds: Revert CPU buffer clear on double fault exit f2fs: link f2fs quota ops for sysfile fs: sdcardfs: Add missing option to show_options Conflicts: drivers/scsi/sd.c drivers/scsi/ufs/ufshcd.c Change-Id: If6679c7cc8c3fee323c749ac359353fbebfd12d9 Signed-off-by: Srinivasarao P <spathi@codeaurora.org>
335 lines
8.8 KiB
C
335 lines
8.8 KiB
C
/*
|
|
* fs/sdcardfs/super.c
|
|
*
|
|
* Copyright (c) 2013 Samsung Electronics Co. Ltd
|
|
* Authors: Daeho Jeong, Woojoong Lee, Seunghwan Hyun,
|
|
* Sunghwan Yun, Sungjong Seo
|
|
*
|
|
* This program has been developed as a stackable file system based on
|
|
* the WrapFS which written by
|
|
*
|
|
* Copyright (c) 1998-2011 Erez Zadok
|
|
* Copyright (c) 2009 Shrikar Archak
|
|
* Copyright (c) 2003-2011 Stony Brook University
|
|
* Copyright (c) 2003-2011 The Research Foundation of SUNY
|
|
*
|
|
* This file is dual licensed. It may be redistributed and/or modified
|
|
* under the terms of the Apache 2.0 License OR version 2 of the GNU
|
|
* General Public License.
|
|
*/
|
|
|
|
#include "sdcardfs.h"
|
|
|
|
/*
|
|
* The inode cache is used with alloc_inode for both our inode info and the
|
|
* vfs inode.
|
|
*/
|
|
static struct kmem_cache *sdcardfs_inode_cachep;
|
|
|
|
/*
|
|
* To support the top references, we must track some data separately.
|
|
* An sdcardfs_inode_info always has a reference to its data, and once set up,
|
|
* also has a reference to its top. The top may be itself, in which case it
|
|
* holds two references to its data. When top is changed, it takes a ref to the
|
|
* new data and then drops the ref to the old data.
|
|
*/
|
|
static struct kmem_cache *sdcardfs_inode_data_cachep;
|
|
|
|
void data_release(struct kref *ref)
|
|
{
|
|
struct sdcardfs_inode_data *data =
|
|
container_of(ref, struct sdcardfs_inode_data, refcount);
|
|
|
|
kmem_cache_free(sdcardfs_inode_data_cachep, data);
|
|
}
|
|
|
|
/* final actions when unmounting a file system */
|
|
static void sdcardfs_put_super(struct super_block *sb)
|
|
{
|
|
struct sdcardfs_sb_info *spd;
|
|
struct super_block *s;
|
|
|
|
spd = SDCARDFS_SB(sb);
|
|
if (!spd)
|
|
return;
|
|
|
|
if (spd->obbpath_s) {
|
|
kfree(spd->obbpath_s);
|
|
path_put(&spd->obbpath);
|
|
}
|
|
|
|
/* decrement lower super references */
|
|
s = sdcardfs_lower_super(sb);
|
|
sdcardfs_set_lower_super(sb, NULL);
|
|
atomic_dec(&s->s_active);
|
|
|
|
kfree(spd);
|
|
sb->s_fs_info = NULL;
|
|
}
|
|
|
|
static int sdcardfs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
|
{
|
|
int err;
|
|
struct path lower_path;
|
|
u32 min_blocks;
|
|
struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dentry->d_sb);
|
|
|
|
sdcardfs_get_lower_path(dentry, &lower_path);
|
|
err = vfs_statfs(&lower_path, buf);
|
|
sdcardfs_put_lower_path(dentry, &lower_path);
|
|
|
|
if (sbi->options.reserved_mb) {
|
|
/* Invalid statfs informations. */
|
|
if (buf->f_bsize == 0) {
|
|
pr_err("Returned block size is zero.\n");
|
|
return -EINVAL;
|
|
}
|
|
|
|
min_blocks = ((sbi->options.reserved_mb * 1024 * 1024)/buf->f_bsize);
|
|
buf->f_blocks -= min_blocks;
|
|
|
|
if (buf->f_bavail > min_blocks)
|
|
buf->f_bavail -= min_blocks;
|
|
else
|
|
buf->f_bavail = 0;
|
|
|
|
/* Make reserved blocks invisiable to media storage */
|
|
buf->f_bfree = buf->f_bavail;
|
|
}
|
|
|
|
/* set return buf to our f/s to avoid confusing user-level utils */
|
|
buf->f_type = SDCARDFS_SUPER_MAGIC;
|
|
|
|
return err;
|
|
}
|
|
|
|
/*
|
|
* @flags: numeric mount options
|
|
* @options: mount options string
|
|
*/
|
|
static int sdcardfs_remount_fs(struct super_block *sb, int *flags, char *options)
|
|
{
|
|
int err = 0;
|
|
|
|
/*
|
|
* The VFS will take care of "ro" and "rw" flags among others. We
|
|
* can safely accept a few flags (RDONLY, MANDLOCK), and honor
|
|
* SILENT, but anything else left over is an error.
|
|
*/
|
|
if ((*flags & ~(MS_RDONLY | MS_MANDLOCK | MS_SILENT)) != 0) {
|
|
pr_err("sdcardfs: remount flags 0x%x unsupported\n", *flags);
|
|
err = -EINVAL;
|
|
}
|
|
|
|
return err;
|
|
}
|
|
|
|
/*
|
|
* @mnt: mount point we are remounting
|
|
* @sb: superblock we are remounting
|
|
* @flags: numeric mount options
|
|
* @options: mount options string
|
|
*/
|
|
static int sdcardfs_remount_fs2(struct vfsmount *mnt, struct super_block *sb,
|
|
int *flags, char *options)
|
|
{
|
|
int err = 0;
|
|
|
|
/*
|
|
* The VFS will take care of "ro" and "rw" flags among others. We
|
|
* can safely accept a few flags (RDONLY, MANDLOCK), and honor
|
|
* SILENT, but anything else left over is an error.
|
|
*/
|
|
if ((*flags & ~(MS_RDONLY | MS_MANDLOCK | MS_SILENT | MS_REMOUNT)) != 0) {
|
|
pr_err("sdcardfs: remount flags 0x%x unsupported\n", *flags);
|
|
err = -EINVAL;
|
|
}
|
|
pr_info("Remount options were %s for vfsmnt %pK.\n", options, mnt);
|
|
err = parse_options_remount(sb, options, *flags & ~MS_SILENT, mnt->data);
|
|
|
|
|
|
return err;
|
|
}
|
|
|
|
static void *sdcardfs_clone_mnt_data(void *data)
|
|
{
|
|
struct sdcardfs_vfsmount_options *opt = kmalloc(sizeof(struct sdcardfs_vfsmount_options), GFP_KERNEL);
|
|
struct sdcardfs_vfsmount_options *old = data;
|
|
|
|
if (!opt)
|
|
return NULL;
|
|
opt->gid = old->gid;
|
|
opt->mask = old->mask;
|
|
return opt;
|
|
}
|
|
|
|
static void sdcardfs_copy_mnt_data(void *data, void *newdata)
|
|
{
|
|
struct sdcardfs_vfsmount_options *old = data;
|
|
struct sdcardfs_vfsmount_options *new = newdata;
|
|
|
|
old->gid = new->gid;
|
|
old->mask = new->mask;
|
|
}
|
|
|
|
/*
|
|
* Called by iput() when the inode reference count reached zero
|
|
* and the inode is not hashed anywhere. Used to clear anything
|
|
* that needs to be, before the inode is completely destroyed and put
|
|
* on the inode free list.
|
|
*/
|
|
static void sdcardfs_evict_inode(struct inode *inode)
|
|
{
|
|
struct inode *lower_inode;
|
|
|
|
truncate_inode_pages(&inode->i_data, 0);
|
|
set_top(SDCARDFS_I(inode), NULL);
|
|
clear_inode(inode);
|
|
/*
|
|
* Decrement a reference to a lower_inode, which was incremented
|
|
* by our read_inode when it was created initially.
|
|
*/
|
|
lower_inode = sdcardfs_lower_inode(inode);
|
|
sdcardfs_set_lower_inode(inode, NULL);
|
|
iput(lower_inode);
|
|
}
|
|
|
|
static struct inode *sdcardfs_alloc_inode(struct super_block *sb)
|
|
{
|
|
struct sdcardfs_inode_info *i;
|
|
struct sdcardfs_inode_data *d;
|
|
|
|
i = kmem_cache_alloc(sdcardfs_inode_cachep, GFP_KERNEL);
|
|
if (!i)
|
|
return NULL;
|
|
|
|
/* memset everything up to the inode to 0 */
|
|
memset(i, 0, offsetof(struct sdcardfs_inode_info, vfs_inode));
|
|
|
|
d = kmem_cache_alloc(sdcardfs_inode_data_cachep,
|
|
GFP_KERNEL | __GFP_ZERO);
|
|
if (!d) {
|
|
kmem_cache_free(sdcardfs_inode_cachep, i);
|
|
return NULL;
|
|
}
|
|
|
|
i->data = d;
|
|
kref_init(&d->refcount);
|
|
i->top_data = d;
|
|
spin_lock_init(&i->top_lock);
|
|
kref_get(&d->refcount);
|
|
|
|
i->vfs_inode.i_version = 1;
|
|
return &i->vfs_inode;
|
|
}
|
|
|
|
static void i_callback(struct rcu_head *head)
|
|
{
|
|
struct inode *inode = container_of(head, struct inode, i_rcu);
|
|
|
|
release_own_data(SDCARDFS_I(inode));
|
|
kmem_cache_free(sdcardfs_inode_cachep, SDCARDFS_I(inode));
|
|
}
|
|
|
|
static void sdcardfs_destroy_inode(struct inode *inode)
|
|
{
|
|
call_rcu(&inode->i_rcu, i_callback);
|
|
}
|
|
|
|
/* sdcardfs inode cache constructor */
|
|
static void init_once(void *obj)
|
|
{
|
|
struct sdcardfs_inode_info *i = obj;
|
|
|
|
inode_init_once(&i->vfs_inode);
|
|
}
|
|
|
|
int sdcardfs_init_inode_cache(void)
|
|
{
|
|
sdcardfs_inode_cachep =
|
|
kmem_cache_create("sdcardfs_inode_cache",
|
|
sizeof(struct sdcardfs_inode_info), 0,
|
|
SLAB_RECLAIM_ACCOUNT, init_once);
|
|
|
|
if (!sdcardfs_inode_cachep)
|
|
return -ENOMEM;
|
|
|
|
sdcardfs_inode_data_cachep =
|
|
kmem_cache_create("sdcardfs_inode_data_cache",
|
|
sizeof(struct sdcardfs_inode_data), 0,
|
|
SLAB_RECLAIM_ACCOUNT, NULL);
|
|
if (!sdcardfs_inode_data_cachep) {
|
|
kmem_cache_destroy(sdcardfs_inode_cachep);
|
|
return -ENOMEM;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* sdcardfs inode cache destructor */
|
|
void sdcardfs_destroy_inode_cache(void)
|
|
{
|
|
kmem_cache_destroy(sdcardfs_inode_data_cachep);
|
|
kmem_cache_destroy(sdcardfs_inode_cachep);
|
|
}
|
|
|
|
/*
|
|
* Used only in nfs, to kill any pending RPC tasks, so that subsequent
|
|
* code can actually succeed and won't leave tasks that need handling.
|
|
*/
|
|
static void sdcardfs_umount_begin(struct super_block *sb)
|
|
{
|
|
struct super_block *lower_sb;
|
|
|
|
lower_sb = sdcardfs_lower_super(sb);
|
|
if (lower_sb && lower_sb->s_op && lower_sb->s_op->umount_begin)
|
|
lower_sb->s_op->umount_begin(lower_sb);
|
|
}
|
|
|
|
static int sdcardfs_show_options(struct vfsmount *mnt, struct seq_file *m,
|
|
struct dentry *root)
|
|
{
|
|
struct sdcardfs_sb_info *sbi = SDCARDFS_SB(root->d_sb);
|
|
struct sdcardfs_mount_options *opts = &sbi->options;
|
|
struct sdcardfs_vfsmount_options *vfsopts = mnt->data;
|
|
|
|
if (opts->fs_low_uid != 0)
|
|
seq_printf(m, ",fsuid=%u", opts->fs_low_uid);
|
|
if (opts->fs_low_gid != 0)
|
|
seq_printf(m, ",fsgid=%u", opts->fs_low_gid);
|
|
if (vfsopts->gid != 0)
|
|
seq_printf(m, ",gid=%u", vfsopts->gid);
|
|
if (opts->multiuser)
|
|
seq_puts(m, ",multiuser");
|
|
if (vfsopts->mask)
|
|
seq_printf(m, ",mask=%u", vfsopts->mask);
|
|
if (opts->fs_user_id)
|
|
seq_printf(m, ",userid=%u", opts->fs_user_id);
|
|
if (opts->gid_derivation)
|
|
seq_puts(m, ",derive_gid");
|
|
if (opts->default_normal)
|
|
seq_puts(m, ",default_normal");
|
|
if (opts->reserved_mb != 0)
|
|
seq_printf(m, ",reserved=%uMB", opts->reserved_mb);
|
|
if (opts->nocache)
|
|
seq_printf(m, ",nocache");
|
|
if (opts->unshared_obb)
|
|
seq_printf(m, ",unshared_obb");
|
|
|
|
return 0;
|
|
};
|
|
|
|
const struct super_operations sdcardfs_sops = {
|
|
.put_super = sdcardfs_put_super,
|
|
.statfs = sdcardfs_statfs,
|
|
.remount_fs = sdcardfs_remount_fs,
|
|
.remount_fs2 = sdcardfs_remount_fs2,
|
|
.clone_mnt_data = sdcardfs_clone_mnt_data,
|
|
.copy_mnt_data = sdcardfs_copy_mnt_data,
|
|
.evict_inode = sdcardfs_evict_inode,
|
|
.umount_begin = sdcardfs_umount_begin,
|
|
.show_options2 = sdcardfs_show_options,
|
|
.alloc_inode = sdcardfs_alloc_inode,
|
|
.destroy_inode = sdcardfs_destroy_inode,
|
|
.drop_inode = generic_delete_inode,
|
|
};
|