mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-25 02:09:42 +00:00
![Duane Griffin](/assets/img/avatar_default.png)
ufs2 fast symlinks can be twice as long as ufs ones, however the code was using the ufs size in various places. Fix that so ufs2 symlinks over 60 characters aren't truncated. Note that we copy the entire area instead of using the maxsymlinklen field from the superblock. This way we will be more robust against corruption (of the superblock). While we are at it, use memcpy instead of open-coding it with for loops. Signed-off-by: Duane Griffin <duaneg@dghda.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
156 lines
4.9 KiB
C
156 lines
4.9 KiB
C
#ifndef _UFS_UFS_H
|
|
#define _UFS_UFS_H 1
|
|
|
|
#define UFS_MAX_GROUP_LOADED 8
|
|
#define UFS_CGNO_EMPTY ((unsigned)-1)
|
|
|
|
struct ufs_sb_private_info;
|
|
struct ufs_cg_private_info;
|
|
struct ufs_csum;
|
|
|
|
struct ufs_sb_info {
|
|
struct ufs_sb_private_info * s_uspi;
|
|
struct ufs_csum * s_csp;
|
|
unsigned s_bytesex;
|
|
unsigned s_flags;
|
|
struct buffer_head ** s_ucg;
|
|
struct ufs_cg_private_info * s_ucpi[UFS_MAX_GROUP_LOADED];
|
|
unsigned s_cgno[UFS_MAX_GROUP_LOADED];
|
|
unsigned short s_cg_loaded;
|
|
unsigned s_mount_opt;
|
|
};
|
|
|
|
struct ufs_inode_info {
|
|
union {
|
|
__fs32 i_data[15];
|
|
__u8 i_symlink[2 * 4 * 15];
|
|
__fs64 u2_i_data[15];
|
|
} i_u1;
|
|
__u32 i_flags;
|
|
__u32 i_shadow;
|
|
__u32 i_unused1;
|
|
__u32 i_unused2;
|
|
__u32 i_oeftflag;
|
|
__u16 i_osync;
|
|
__u64 i_lastfrag;
|
|
__u32 i_dir_start_lookup;
|
|
struct inode vfs_inode;
|
|
};
|
|
|
|
/* mount options */
|
|
#define UFS_MOUNT_ONERROR 0x0000000F
|
|
#define UFS_MOUNT_ONERROR_PANIC 0x00000001
|
|
#define UFS_MOUNT_ONERROR_LOCK 0x00000002
|
|
#define UFS_MOUNT_ONERROR_UMOUNT 0x00000004
|
|
#define UFS_MOUNT_ONERROR_REPAIR 0x00000008
|
|
|
|
#define UFS_MOUNT_UFSTYPE 0x0000FFF0
|
|
#define UFS_MOUNT_UFSTYPE_OLD 0x00000010
|
|
#define UFS_MOUNT_UFSTYPE_44BSD 0x00000020
|
|
#define UFS_MOUNT_UFSTYPE_SUN 0x00000040
|
|
#define UFS_MOUNT_UFSTYPE_NEXTSTEP 0x00000080
|
|
#define UFS_MOUNT_UFSTYPE_NEXTSTEP_CD 0x00000100
|
|
#define UFS_MOUNT_UFSTYPE_OPENSTEP 0x00000200
|
|
#define UFS_MOUNT_UFSTYPE_SUNx86 0x00000400
|
|
#define UFS_MOUNT_UFSTYPE_HP 0x00000800
|
|
#define UFS_MOUNT_UFSTYPE_UFS2 0x00001000
|
|
#define UFS_MOUNT_UFSTYPE_SUNOS 0x00002000
|
|
|
|
#define ufs_clear_opt(o,opt) o &= ~UFS_MOUNT_##opt
|
|
#define ufs_set_opt(o,opt) o |= UFS_MOUNT_##opt
|
|
#define ufs_test_opt(o,opt) ((o) & UFS_MOUNT_##opt)
|
|
|
|
/*
|
|
* Debug code
|
|
*/
|
|
#ifdef CONFIG_UFS_DEBUG
|
|
# define UFSD(f, a...) { \
|
|
printk ("UFSD (%s, %d): %s:", \
|
|
__FILE__, __LINE__, __func__); \
|
|
printk (f, ## a); \
|
|
}
|
|
#else
|
|
# define UFSD(f, a...) /**/
|
|
#endif
|
|
|
|
/* balloc.c */
|
|
extern void ufs_free_fragments (struct inode *, u64, unsigned);
|
|
extern void ufs_free_blocks (struct inode *, u64, unsigned);
|
|
extern u64 ufs_new_fragments(struct inode *, void *, u64, u64,
|
|
unsigned, int *, struct page *);
|
|
|
|
/* cylinder.c */
|
|
extern struct ufs_cg_private_info * ufs_load_cylinder (struct super_block *, unsigned);
|
|
extern void ufs_put_cylinder (struct super_block *, unsigned);
|
|
|
|
/* dir.c */
|
|
extern const struct inode_operations ufs_dir_inode_operations;
|
|
extern int ufs_add_link (struct dentry *, struct inode *);
|
|
extern ino_t ufs_inode_by_name(struct inode *, struct dentry *);
|
|
extern int ufs_make_empty(struct inode *, struct inode *);
|
|
extern struct ufs_dir_entry *ufs_find_entry(struct inode *, struct dentry *, struct page **);
|
|
extern int ufs_delete_entry(struct inode *, struct ufs_dir_entry *, struct page *);
|
|
extern int ufs_empty_dir (struct inode *);
|
|
extern struct ufs_dir_entry *ufs_dotdot(struct inode *, struct page **);
|
|
extern void ufs_set_link(struct inode *dir, struct ufs_dir_entry *de,
|
|
struct page *page, struct inode *inode);
|
|
|
|
/* file.c */
|
|
extern const struct inode_operations ufs_file_inode_operations;
|
|
extern const struct file_operations ufs_file_operations;
|
|
|
|
extern const struct address_space_operations ufs_aops;
|
|
|
|
/* ialloc.c */
|
|
extern void ufs_free_inode (struct inode *inode);
|
|
extern struct inode * ufs_new_inode (struct inode *, int);
|
|
|
|
/* inode.c */
|
|
extern struct inode *ufs_iget(struct super_block *, unsigned long);
|
|
extern int ufs_write_inode (struct inode *, int);
|
|
extern int ufs_sync_inode (struct inode *);
|
|
extern void ufs_delete_inode (struct inode *);
|
|
extern struct buffer_head * ufs_bread (struct inode *, unsigned, int, int *);
|
|
extern int ufs_getfrag_block (struct inode *inode, sector_t fragment, struct buffer_head *bh_result, int create);
|
|
|
|
/* namei.c */
|
|
extern const struct file_operations ufs_dir_operations;
|
|
|
|
/* super.c */
|
|
extern void ufs_warning (struct super_block *, const char *, const char *, ...) __attribute__ ((format (printf, 3, 4)));
|
|
extern void ufs_error (struct super_block *, const char *, const char *, ...) __attribute__ ((format (printf, 3, 4)));
|
|
extern void ufs_panic (struct super_block *, const char *, const char *, ...) __attribute__ ((format (printf, 3, 4)));
|
|
|
|
/* symlink.c */
|
|
extern const struct inode_operations ufs_fast_symlink_inode_operations;
|
|
|
|
/* truncate.c */
|
|
extern int ufs_truncate (struct inode *, loff_t);
|
|
|
|
static inline struct ufs_sb_info *UFS_SB(struct super_block *sb)
|
|
{
|
|
return sb->s_fs_info;
|
|
}
|
|
|
|
static inline struct ufs_inode_info *UFS_I(struct inode *inode)
|
|
{
|
|
return container_of(inode, struct ufs_inode_info, vfs_inode);
|
|
}
|
|
|
|
/*
|
|
* Give cylinder group number for a file system block.
|
|
* Give cylinder group block number for a file system block.
|
|
*/
|
|
/* #define ufs_dtog(d) ((d) / uspi->s_fpg) */
|
|
static inline u64 ufs_dtog(struct ufs_sb_private_info * uspi, u64 b)
|
|
{
|
|
do_div(b, uspi->s_fpg);
|
|
return b;
|
|
}
|
|
/* #define ufs_dtogd(d) ((d) % uspi->s_fpg) */
|
|
static inline u32 ufs_dtogd(struct ufs_sb_private_info * uspi, u64 b)
|
|
{
|
|
return do_div(b, uspi->s_fpg);
|
|
}
|
|
|
|
#endif /* _UFS_UFS_H */
|