-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAlre3XwACgkQONu9yGCS aT5KcRAAxB6w9SbjjlGv+PsN3ISQgnIPjWadBQ12WWnpr1sqZi0wrMZRsNiK5+UN wPalUBiLiAIqNoDVSrDUgjyqC+wnQjhM/9tudEBqXQ6TQbSHQfQpZHQabLEtXxCP Yd1EHwEgJrCHqaj17oFZFkps20ooKtSnYQ57pyZNem5EPR/ayaMWvo6WM7k6d2hD E2WE57ShLbvslYaSvmDXML6o9f/bBKHOuL0GymVtDEUcyTLuw3GZaplnuaSLz6kc o7tU2xVV+yajmpiEt4iR40Pgk+pygEGC14OI8dj/YHVotDzJKWnMgQ/HKxr8kyra ImQPwu9DmaWqAUGr2SRmE/SXJpKdeYM1rxA/H3pMSaP9nRc2ccHyQF/ASGfHs+Mv 9hNQBjRugS4UXDzFhRlEh97CyfVa/ZuF0WgiBtBYnXSdXKA1xDq9cVf3UJg7k6om 1X7HLEVLhVLR7/liPjhOlTj9vrUzc6NcN+uVdfnmspI1BjTBe3ezzLqEP8VTUsNQ p/V9r0i6TGR3gYQuTzjU/MaAuBZwj1D5sCnVUphCNUtSJf/0cjQsfYUcgtrtk67U 9Bjlo0pWHpAXxARiegBY3n5ClkZpdqEnt4Dp2MdR65pTSJ4MfC2UDLemUgB18arU IllNzG2GywgQSouH3s5XPNZLkEvX8iK5lUWqRQ7ZiaA/0jVkn70= =K6Qy -----END PGP SIGNATURE----- Merge 4.4.129 into android-4.4 Changes in 4.4.129 media: v4l2-compat-ioctl32: don't oops on overlay parisc: Fix out of array access in match_pci_device() perf intel-pt: Fix overlap detection to identify consecutive buffers correctly perf intel-pt: Fix sync_switch perf intel-pt: Fix error recovery from missing TIP packet perf intel-pt: Fix timestamp following overflow radeon: hide pointless #warning when compile testing Revert "perf tests: Decompress kernel module before objdump" block/loop: fix deadlock after loop_set_status s390/qdio: don't retry EQBS after CCQ 96 s390/qdio: don't merge ERROR output buffers s390/ipl: ensure loadparm valid flag is set getname_kernel() needs to make sure that ->name != ->iname in long case rtl8187: Fix NULL pointer dereference in priv->conf_mutex hwmon: (ina2xx) Fix access to uninitialized mutex cdc_ether: flag the Cinterion AHS8 modem by gemalto as WWAN slip: Check if rstate is initialized before uncompressing lan78xx: Correctly indicate invalid OTP x86/hweight: Get rid of the special calling convention x86/hweight: Don't clobber %rdi tty: make n_tty_read() always abort if hangup is in progress ubifs: Check ubifs_wbuf_sync() return code ubi: fastmap: Don't flush fastmap work on detach ubi: Fix error for write access ubi: Reject MLC NAND fs/reiserfs/journal.c: add missing resierfs_warning() arg resource: fix integer overflow at reallocation ipc/shm: fix use-after-free of shm file via remap_file_pages() mm, slab: reschedule cache_reap() on the same CPU usb: musb: gadget: misplaced out of bounds check ARM: dts: at91: at91sam9g25: fix mux-mask pinctrl property ARM: dts: at91: sama5d4: fix pinctrl compatible string xen-netfront: Fix hang on device removal regmap: Fix reversed bounds check in regmap_raw_write() ACPI / video: Add quirk to force acpi-video backlight on Samsung 670Z5E ACPI / hotplug / PCI: Check presence of slot itself in get_slot_status() USB:fix USB3 devices behind USB3 hubs not resuming at hibernate thaw usb: dwc3: pci: Properly cleanup resource HID: i2c-hid: fix size check and type usage powerpc/powernv: Handle unknown OPAL errors in opal_nvram_write() powerpc/64: Fix smp_wmb barrier definition use use lwsync consistently powerpc/powernv: define a standard delay for OPAL_BUSY type retry loops powerpc/powernv: Fix OPAL NVRAM driver OPAL_BUSY loops HID: Fix hid_report_len usage HID: core: Fix size as type u32 ASoC: ssm2602: Replace reg_default_raw with reg_default thunderbolt: Resume control channel after hibernation image is created random: use a tighter cap in credit_entropy_bits_safe() jbd2: if the journal is aborted then don't allow update of the log tail ext4: don't update checksum of new initialized bitmaps ext4: fail ext4_iget for root directory if unallocated RDMA/ucma: Don't allow setting RDMA_OPTION_IB_PATH without an RDMA device ALSA: pcm: Fix UAF at PCM release via PCM timer access IB/srp: Fix srp_abort() IB/srp: Fix completion vector assignment algorithm dmaengine: at_xdmac: fix rare residue corruption um: Use POSIX ucontext_t instead of struct ucontext iommu/vt-d: Fix a potential memory leak mmc: jz4740: Fix race condition in IRQ mask update clk: mvebu: armada-38x: add support for 1866MHz variants clk: mvebu: armada-38x: add support for missing clocks clk: bcm2835: De-assert/assert PLL reset signal when appropriate thermal: imx: Fix race condition in imx_thermal_probe() watchdog: f71808e_wdt: Fix WD_EN register read ALSA: oss: consolidate kmalloc/memset 0 call to kzalloc ALSA: pcm: Use ERESTARTSYS instead of EINTR in OSS emulation ALSA: pcm: Avoid potential races between OSS ioctls and read/write ALSA: pcm: Return -EBUSY for OSS ioctls changing busy streams ALSA: pcm: Fix mutex unbalance in OSS emulation ioctls ALSA: pcm: Fix endless loop for XRUN recovery in OSS emulation vfio-pci: Virtualize PCIe & AF FLR vfio/pci: Virtualize Maximum Payload Size vfio/pci: Virtualize Maximum Read Request Size ext4: don't allow r/w mounts if metadata blocks overlap the superblock drm/radeon: Fix PCIe lane width calculation ext4: fix crashes in dioread_nolock mode ext4: fix deadlock between inline_data and ext4_expand_extra_isize_ea() ALSA: line6: Use correct endpoint type for midi output ALSA: rawmidi: Fix missing input substream checks in compat ioctls ALSA: hda - New VIA controller suppor no-snoop path HID: hidraw: Fix crash on HIDIOCGFEATURE with a destroyed device MIPS: uaccess: Add micromips clobbers to bzero invocation MIPS: memset.S: EVA & fault support for small_memset MIPS: memset.S: Fix return of __clear_user from Lpartial_fixup MIPS: memset.S: Fix clobber of v1 in last_fixup powerpc/eeh: Fix enabling bridge MMIO windows powerpc/lib: Fix off-by-one in alternate feature patching jffs2_kill_sb(): deal with failed allocations hypfs_kill_super(): deal with failed allocations rpc_pipefs: fix double-dput() Don't leak MNT_INTERNAL away from internal mounts autofs: mount point create should honour passed in mode mm: allow GFP_{FS,IO} for page_cache_read page cache allocation mm/filemap.c: fix NULL pointer in page_cache_tree_insert() ext4: bugfix for mmaped pages in mpage_release_unused_pages() fanotify: fix logic of events on child writeback: safer lock nesting Linux 4.4.129 Change-Id: I8806d2cc92fe512f27a349e8f630ced0cac9a8d7 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
170 lines
5.5 KiB
C
170 lines
5.5 KiB
C
/*
|
|
File: fs/ext4/xattr.h
|
|
|
|
On-disk format of extended attributes for the ext4 filesystem.
|
|
|
|
(C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org>
|
|
*/
|
|
|
|
#include <linux/xattr.h>
|
|
|
|
/* Magic value in attribute blocks */
|
|
#define EXT4_XATTR_MAGIC 0xEA020000
|
|
|
|
/* Maximum number of references to one attribute block */
|
|
#define EXT4_XATTR_REFCOUNT_MAX 1024
|
|
|
|
/* Name indexes */
|
|
#define EXT4_XATTR_INDEX_USER 1
|
|
#define EXT4_XATTR_INDEX_POSIX_ACL_ACCESS 2
|
|
#define EXT4_XATTR_INDEX_POSIX_ACL_DEFAULT 3
|
|
#define EXT4_XATTR_INDEX_TRUSTED 4
|
|
#define EXT4_XATTR_INDEX_LUSTRE 5
|
|
#define EXT4_XATTR_INDEX_SECURITY 6
|
|
#define EXT4_XATTR_INDEX_SYSTEM 7
|
|
#define EXT4_XATTR_INDEX_RICHACL 8
|
|
#define EXT4_XATTR_INDEX_ENCRYPTION 9
|
|
|
|
struct ext4_xattr_header {
|
|
__le32 h_magic; /* magic number for identification */
|
|
__le32 h_refcount; /* reference count */
|
|
__le32 h_blocks; /* number of disk blocks used */
|
|
__le32 h_hash; /* hash value of all attributes */
|
|
__le32 h_checksum; /* crc32c(uuid+id+xattrblock) */
|
|
/* id = inum if refcount=1, blknum otherwise */
|
|
__u32 h_reserved[3]; /* zero right now */
|
|
};
|
|
|
|
struct ext4_xattr_ibody_header {
|
|
__le32 h_magic; /* magic number for identification */
|
|
};
|
|
|
|
struct ext4_xattr_entry {
|
|
__u8 e_name_len; /* length of name */
|
|
__u8 e_name_index; /* attribute name index */
|
|
__le16 e_value_offs; /* offset in disk block of value */
|
|
__le32 e_value_block; /* disk block attribute is stored on (n/i) */
|
|
__le32 e_value_size; /* size of attribute value */
|
|
__le32 e_hash; /* hash value of name and value */
|
|
char e_name[0]; /* attribute name */
|
|
};
|
|
|
|
#define EXT4_XATTR_PAD_BITS 2
|
|
#define EXT4_XATTR_PAD (1<<EXT4_XATTR_PAD_BITS)
|
|
#define EXT4_XATTR_ROUND (EXT4_XATTR_PAD-1)
|
|
#define EXT4_XATTR_LEN(name_len) \
|
|
(((name_len) + EXT4_XATTR_ROUND + \
|
|
sizeof(struct ext4_xattr_entry)) & ~EXT4_XATTR_ROUND)
|
|
#define EXT4_XATTR_NEXT(entry) \
|
|
((struct ext4_xattr_entry *)( \
|
|
(char *)(entry) + EXT4_XATTR_LEN((entry)->e_name_len)))
|
|
#define EXT4_XATTR_SIZE(size) \
|
|
(((size) + EXT4_XATTR_ROUND) & ~EXT4_XATTR_ROUND)
|
|
|
|
#define IHDR(inode, raw_inode) \
|
|
((struct ext4_xattr_ibody_header *) \
|
|
((void *)raw_inode + \
|
|
EXT4_GOOD_OLD_INODE_SIZE + \
|
|
EXT4_I(inode)->i_extra_isize))
|
|
#define IFIRST(hdr) ((struct ext4_xattr_entry *)((hdr)+1))
|
|
|
|
#define BHDR(bh) ((struct ext4_xattr_header *)((bh)->b_data))
|
|
#define ENTRY(ptr) ((struct ext4_xattr_entry *)(ptr))
|
|
#define BFIRST(bh) ENTRY(BHDR(bh)+1)
|
|
#define IS_LAST_ENTRY(entry) (*(__u32 *)(entry) == 0)
|
|
|
|
#define EXT4_ZERO_XATTR_VALUE ((void *)-1)
|
|
|
|
struct ext4_xattr_info {
|
|
int name_index;
|
|
const char *name;
|
|
const void *value;
|
|
size_t value_len;
|
|
};
|
|
|
|
struct ext4_xattr_search {
|
|
struct ext4_xattr_entry *first;
|
|
void *base;
|
|
void *end;
|
|
struct ext4_xattr_entry *here;
|
|
int not_found;
|
|
};
|
|
|
|
struct ext4_xattr_ibody_find {
|
|
struct ext4_xattr_search s;
|
|
struct ext4_iloc iloc;
|
|
};
|
|
|
|
extern const struct xattr_handler ext4_xattr_user_handler;
|
|
extern const struct xattr_handler ext4_xattr_trusted_handler;
|
|
extern const struct xattr_handler ext4_xattr_security_handler;
|
|
|
|
#define EXT4_XATTR_NAME_ENCRYPTION_CONTEXT "c"
|
|
|
|
/*
|
|
* The EXT4_STATE_NO_EXPAND is overloaded and used for two purposes.
|
|
* The first is to signal that there the inline xattrs and data are
|
|
* taking up so much space that we might as well not keep trying to
|
|
* expand it. The second is that xattr_sem is taken for writing, so
|
|
* we shouldn't try to recurse into the inode expansion. For this
|
|
* second case, we need to make sure that we take save and restore the
|
|
* NO_EXPAND state flag appropriately.
|
|
*/
|
|
static inline void ext4_write_lock_xattr(struct inode *inode, int *save)
|
|
{
|
|
down_write(&EXT4_I(inode)->xattr_sem);
|
|
*save = ext4_test_inode_state(inode, EXT4_STATE_NO_EXPAND);
|
|
ext4_set_inode_state(inode, EXT4_STATE_NO_EXPAND);
|
|
}
|
|
|
|
static inline int ext4_write_trylock_xattr(struct inode *inode, int *save)
|
|
{
|
|
if (down_write_trylock(&EXT4_I(inode)->xattr_sem) == 0)
|
|
return 0;
|
|
*save = ext4_test_inode_state(inode, EXT4_STATE_NO_EXPAND);
|
|
ext4_set_inode_state(inode, EXT4_STATE_NO_EXPAND);
|
|
return 1;
|
|
}
|
|
|
|
static inline void ext4_write_unlock_xattr(struct inode *inode, int *save)
|
|
{
|
|
if (*save == 0)
|
|
ext4_clear_inode_state(inode, EXT4_STATE_NO_EXPAND);
|
|
up_write(&EXT4_I(inode)->xattr_sem);
|
|
}
|
|
|
|
extern ssize_t ext4_listxattr(struct dentry *, char *, size_t);
|
|
|
|
extern int ext4_xattr_get(struct inode *, int, const char *, void *, size_t);
|
|
extern int ext4_xattr_set(struct inode *, int, const char *, const void *, size_t, int);
|
|
extern int ext4_xattr_set_handle(handle_t *, struct inode *, int, const char *, const void *, size_t, int);
|
|
|
|
extern void ext4_xattr_delete_inode(handle_t *, struct inode *);
|
|
|
|
extern int ext4_expand_extra_isize_ea(struct inode *inode, int new_extra_isize,
|
|
struct ext4_inode *raw_inode, handle_t *handle);
|
|
|
|
extern const struct xattr_handler *ext4_xattr_handlers[];
|
|
|
|
extern int ext4_xattr_ibody_find(struct inode *inode, struct ext4_xattr_info *i,
|
|
struct ext4_xattr_ibody_find *is);
|
|
extern int ext4_xattr_ibody_get(struct inode *inode, int name_index,
|
|
const char *name,
|
|
void *buffer, size_t buffer_size);
|
|
extern int ext4_xattr_ibody_inline_set(handle_t *handle, struct inode *inode,
|
|
struct ext4_xattr_info *i,
|
|
struct ext4_xattr_ibody_find *is);
|
|
|
|
extern struct mb2_cache *ext4_xattr_create_cache(void);
|
|
extern void ext4_xattr_destroy_cache(struct mb2_cache *);
|
|
|
|
#ifdef CONFIG_EXT4_FS_SECURITY
|
|
extern int ext4_init_security(handle_t *handle, struct inode *inode,
|
|
struct inode *dir, const struct qstr *qstr);
|
|
#else
|
|
static inline int ext4_init_security(handle_t *handle, struct inode *inode,
|
|
struct inode *dir, const struct qstr *qstr)
|
|
{
|
|
return 0;
|
|
}
|
|
#endif
|