Merge branch 'reiserfs-updates' from Jeff Mahoney
* reiserfs-updates: (35 commits)
reiserfs: rename [cn]_* variables
reiserfs: rename p_._ variables
reiserfs: rename p_s_tb to tb
reiserfs: rename p_s_inode to inode
reiserfs: rename p_s_bh to bh
reiserfs: rename p_s_sb to sb
reiserfs: strip trailing whitespace
reiserfs: cleanup path functions
reiserfs: factor out buffer_info initialization
reiserfs: add atomic addition of selinux attributes during inode creation
reiserfs: use generic readdir for operations across all xattrs
reiserfs: journaled xattrs
reiserfs: use generic xattr handlers
reiserfs: remove i_has_xattr_dir
reiserfs: make per-inode xattr locking more fine grained
reiserfs: eliminate per-super xattr lock
reiserfs: simplify xattr internal file lookups/opens
reiserfs: Clean up xattrs when REISERFS_FS_XATTR is unset
reiserfs: remove IS_PRIVATE helpers
reiserfs: remove link detection code
...
Fixed up conflicts manually due to:
- quota name cleanups vs variable naming changes:
fs/reiserfs/inode.c
fs/reiserfs/namei.c
fs/reiserfs/stree.c
fs/reiserfs/xattr.c
- exported include header cleanups
include/linux/reiserfs_fs.h
This commit is contained in:
@@ -49,13 +49,12 @@ static inline int reiserfs_acl_count(size_t size)
|
||||
#ifdef CONFIG_REISERFS_FS_POSIX_ACL
|
||||
struct posix_acl *reiserfs_get_acl(struct inode *inode, int type);
|
||||
int reiserfs_acl_chmod(struct inode *inode);
|
||||
int reiserfs_inherit_default_acl(struct inode *dir, struct dentry *dentry,
|
||||
int reiserfs_inherit_default_acl(struct reiserfs_transaction_handle *th,
|
||||
struct inode *dir, struct dentry *dentry,
|
||||
struct inode *inode);
|
||||
int reiserfs_cache_default_acl(struct inode *dir);
|
||||
extern int reiserfs_xattr_posix_acl_init(void) __init;
|
||||
extern int reiserfs_xattr_posix_acl_exit(void);
|
||||
extern struct reiserfs_xattr_handler posix_acl_default_handler;
|
||||
extern struct reiserfs_xattr_handler posix_acl_access_handler;
|
||||
extern struct xattr_handler reiserfs_posix_acl_default_handler;
|
||||
extern struct xattr_handler reiserfs_posix_acl_access_handler;
|
||||
|
||||
static inline void reiserfs_init_acl_access(struct inode *inode)
|
||||
{
|
||||
@@ -75,16 +74,6 @@ static inline struct posix_acl *reiserfs_get_acl(struct inode *inode, int type)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline int reiserfs_xattr_posix_acl_init(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int reiserfs_xattr_posix_acl_exit(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int reiserfs_acl_chmod(struct inode *inode)
|
||||
{
|
||||
return 0;
|
||||
|
||||
@@ -58,8 +58,6 @@
|
||||
#define reiserfs_write_lock( sb ) lock_kernel()
|
||||
#define reiserfs_write_unlock( sb ) unlock_kernel()
|
||||
|
||||
/* xattr stuff */
|
||||
#define REISERFS_XATTR_DIR_SEM(s) (REISERFS_SB(s)->xattr_dir_sem)
|
||||
struct fid;
|
||||
|
||||
/* in reading the #defines, it may help to understand that they employ
|
||||
@@ -104,15 +102,21 @@ struct fid;
|
||||
*/
|
||||
#define REISERFS_DEBUG_CODE 5 /* extra messages to help find/debug errors */
|
||||
|
||||
void reiserfs_warning(struct super_block *s, const char *fmt, ...);
|
||||
void __reiserfs_warning(struct super_block *s, const char *id,
|
||||
const char *func, const char *fmt, ...);
|
||||
#define reiserfs_warning(s, id, fmt, args...) \
|
||||
__reiserfs_warning(s, id, __func__, fmt, ##args)
|
||||
/* assertions handling */
|
||||
|
||||
/** always check a condition and panic if it's false. */
|
||||
#define __RASSERT( cond, scond, format, args... ) \
|
||||
if( !( cond ) ) \
|
||||
reiserfs_panic( NULL, "reiserfs[%i]: assertion " scond " failed at " \
|
||||
__FILE__ ":%i:%s: " format "\n", \
|
||||
in_interrupt() ? -1 : task_pid_nr(current), __LINE__ , __func__ , ##args )
|
||||
#define __RASSERT(cond, scond, format, args...) \
|
||||
do { \
|
||||
if (!(cond)) \
|
||||
reiserfs_panic(NULL, "assertion failure", "(" #cond ") at " \
|
||||
__FILE__ ":%i:%s: " format "\n", \
|
||||
in_interrupt() ? -1 : task_pid_nr(current), \
|
||||
__LINE__, __func__ , ##args); \
|
||||
} while (0)
|
||||
|
||||
#define RASSERT(cond, format, args...) __RASSERT(cond, #cond, format, ##args)
|
||||
|
||||
@@ -196,7 +200,11 @@ struct reiserfs_super_block {
|
||||
__le32 s_flags; /* Right now used only by inode-attributes, if enabled */
|
||||
unsigned char s_uuid[16]; /* filesystem unique identifier */
|
||||
unsigned char s_label[16]; /* filesystem volume label */
|
||||
char s_unused[88]; /* zero filled by mkreiserfs and
|
||||
__le16 s_mnt_count; /* Count of mounts since last fsck */
|
||||
__le16 s_max_mnt_count; /* Maximum mounts before check */
|
||||
__le32 s_lastcheck; /* Timestamp of last fsck */
|
||||
__le32 s_check_interval; /* Interval between checks */
|
||||
char s_unused[76]; /* zero filled by mkreiserfs and
|
||||
* reiserfs_convert_objectid_map_v1()
|
||||
* so any additions must be updated
|
||||
* there as well. */
|
||||
@@ -578,10 +586,8 @@ static inline int uniqueness2type(__u32 uniqueness)
|
||||
return TYPE_DIRECT;
|
||||
case V1_DIRENTRY_UNIQUENESS:
|
||||
return TYPE_DIRENTRY;
|
||||
default:
|
||||
reiserfs_warning(NULL, "vs-500: unknown uniqueness %d",
|
||||
uniqueness);
|
||||
case V1_ANY_UNIQUENESS:
|
||||
default:
|
||||
return TYPE_ANY;
|
||||
}
|
||||
}
|
||||
@@ -598,9 +604,8 @@ static inline __u32 type2uniqueness(int type)
|
||||
return V1_DIRECT_UNIQUENESS;
|
||||
case TYPE_DIRENTRY:
|
||||
return V1_DIRENTRY_UNIQUENESS;
|
||||
default:
|
||||
reiserfs_warning(NULL, "vs-501: unknown type %d", type);
|
||||
case TYPE_ANY:
|
||||
default:
|
||||
return V1_ANY_UNIQUENESS;
|
||||
}
|
||||
}
|
||||
@@ -712,9 +717,9 @@ static inline void cpu_key_k_offset_dec(struct cpu_key *key)
|
||||
#define is_indirect_cpu_ih(ih) (is_indirect_cpu_key (&((ih)->ih_key)))
|
||||
#define is_statdata_cpu_ih(ih) (is_statdata_cpu_key (&((ih)->ih_key)))
|
||||
|
||||
#define I_K_KEY_IN_ITEM(p_s_ih, p_s_key, n_blocksize) \
|
||||
( ! COMP_SHORT_KEYS(p_s_ih, p_s_key) && \
|
||||
I_OFF_BYTE_IN_ITEM(p_s_ih, k_offset (p_s_key), n_blocksize) )
|
||||
#define I_K_KEY_IN_ITEM(ih, key, n_blocksize) \
|
||||
(!COMP_SHORT_KEYS(ih, key) && \
|
||||
I_OFF_BYTE_IN_ITEM(ih, k_offset(key), n_blocksize))
|
||||
|
||||
/* maximal length of item */
|
||||
#define MAX_ITEM_LEN(block_size) (block_size - BLKH_SIZE - IH_SIZE)
|
||||
@@ -770,25 +775,25 @@ struct block_head {
|
||||
#define DISK_LEAF_NODE_LEVEL 1 /* Leaf node level. */
|
||||
|
||||
/* Given the buffer head of a formatted node, resolve to the block head of that node. */
|
||||
#define B_BLK_HEAD(p_s_bh) ((struct block_head *)((p_s_bh)->b_data))
|
||||
#define B_BLK_HEAD(bh) ((struct block_head *)((bh)->b_data))
|
||||
/* Number of items that are in buffer. */
|
||||
#define B_NR_ITEMS(p_s_bh) (blkh_nr_item(B_BLK_HEAD(p_s_bh)))
|
||||
#define B_LEVEL(p_s_bh) (blkh_level(B_BLK_HEAD(p_s_bh)))
|
||||
#define B_FREE_SPACE(p_s_bh) (blkh_free_space(B_BLK_HEAD(p_s_bh)))
|
||||
#define B_NR_ITEMS(bh) (blkh_nr_item(B_BLK_HEAD(bh)))
|
||||
#define B_LEVEL(bh) (blkh_level(B_BLK_HEAD(bh)))
|
||||
#define B_FREE_SPACE(bh) (blkh_free_space(B_BLK_HEAD(bh)))
|
||||
|
||||
#define PUT_B_NR_ITEMS(p_s_bh,val) do { set_blkh_nr_item(B_BLK_HEAD(p_s_bh),val); } while (0)
|
||||
#define PUT_B_LEVEL(p_s_bh,val) do { set_blkh_level(B_BLK_HEAD(p_s_bh),val); } while (0)
|
||||
#define PUT_B_FREE_SPACE(p_s_bh,val) do { set_blkh_free_space(B_BLK_HEAD(p_s_bh),val); } while (0)
|
||||
#define PUT_B_NR_ITEMS(bh, val) do { set_blkh_nr_item(B_BLK_HEAD(bh), val); } while (0)
|
||||
#define PUT_B_LEVEL(bh, val) do { set_blkh_level(B_BLK_HEAD(bh), val); } while (0)
|
||||
#define PUT_B_FREE_SPACE(bh, val) do { set_blkh_free_space(B_BLK_HEAD(bh), val); } while (0)
|
||||
|
||||
/* Get right delimiting key. -- little endian */
|
||||
#define B_PRIGHT_DELIM_KEY(p_s_bh) (&(blk_right_delim_key(B_BLK_HEAD(p_s_bh))))
|
||||
#define B_PRIGHT_DELIM_KEY(bh) (&(blk_right_delim_key(B_BLK_HEAD(bh))))
|
||||
|
||||
/* Does the buffer contain a disk leaf. */
|
||||
#define B_IS_ITEMS_LEVEL(p_s_bh) (B_LEVEL(p_s_bh) == DISK_LEAF_NODE_LEVEL)
|
||||
#define B_IS_ITEMS_LEVEL(bh) (B_LEVEL(bh) == DISK_LEAF_NODE_LEVEL)
|
||||
|
||||
/* Does the buffer contain a disk internal node */
|
||||
#define B_IS_KEYS_LEVEL(p_s_bh) (B_LEVEL(p_s_bh) > DISK_LEAF_NODE_LEVEL \
|
||||
&& B_LEVEL(p_s_bh) <= MAX_HEIGHT)
|
||||
#define B_IS_KEYS_LEVEL(bh) (B_LEVEL(bh) > DISK_LEAF_NODE_LEVEL \
|
||||
&& B_LEVEL(bh) <= MAX_HEIGHT)
|
||||
|
||||
/***************************************************************************/
|
||||
/* STAT DATA */
|
||||
@@ -1138,12 +1143,13 @@ struct disk_child {
|
||||
#define put_dc_size(dc_p, val) do { (dc_p)->dc_size = cpu_to_le16(val); } while(0)
|
||||
|
||||
/* Get disk child by buffer header and position in the tree node. */
|
||||
#define B_N_CHILD(p_s_bh,n_pos) ((struct disk_child *)\
|
||||
((p_s_bh)->b_data+BLKH_SIZE+B_NR_ITEMS(p_s_bh)*KEY_SIZE+DC_SIZE*(n_pos)))
|
||||
#define B_N_CHILD(bh, n_pos) ((struct disk_child *)\
|
||||
((bh)->b_data + BLKH_SIZE + B_NR_ITEMS(bh) * KEY_SIZE + DC_SIZE * (n_pos)))
|
||||
|
||||
/* Get disk child number by buffer header and position in the tree node. */
|
||||
#define B_N_CHILD_NUM(p_s_bh,n_pos) (dc_block_number(B_N_CHILD(p_s_bh,n_pos)))
|
||||
#define PUT_B_N_CHILD_NUM(p_s_bh,n_pos, val) (put_dc_block_number(B_N_CHILD(p_s_bh,n_pos), val ))
|
||||
#define B_N_CHILD_NUM(bh, n_pos) (dc_block_number(B_N_CHILD(bh, n_pos)))
|
||||
#define PUT_B_N_CHILD_NUM(bh, n_pos, val) \
|
||||
(put_dc_block_number(B_N_CHILD(bh, n_pos), val))
|
||||
|
||||
/* maximal value of field child_size in structure disk_child */
|
||||
/* child size is the combined size of all items and their headers */
|
||||
@@ -1214,33 +1220,33 @@ struct treepath {
|
||||
struct treepath var = {.path_length = ILLEGAL_PATH_ELEMENT_OFFSET, .reada = 0,}
|
||||
|
||||
/* Get path element by path and path position. */
|
||||
#define PATH_OFFSET_PELEMENT(p_s_path,n_offset) ((p_s_path)->path_elements +(n_offset))
|
||||
#define PATH_OFFSET_PELEMENT(path, n_offset) ((path)->path_elements + (n_offset))
|
||||
|
||||
/* Get buffer header at the path by path and path position. */
|
||||
#define PATH_OFFSET_PBUFFER(p_s_path,n_offset) (PATH_OFFSET_PELEMENT(p_s_path,n_offset)->pe_buffer)
|
||||
#define PATH_OFFSET_PBUFFER(path, n_offset) (PATH_OFFSET_PELEMENT(path, n_offset)->pe_buffer)
|
||||
|
||||
/* Get position in the element at the path by path and path position. */
|
||||
#define PATH_OFFSET_POSITION(p_s_path,n_offset) (PATH_OFFSET_PELEMENT(p_s_path,n_offset)->pe_position)
|
||||
#define PATH_OFFSET_POSITION(path, n_offset) (PATH_OFFSET_PELEMENT(path, n_offset)->pe_position)
|
||||
|
||||
#define PATH_PLAST_BUFFER(p_s_path) (PATH_OFFSET_PBUFFER((p_s_path), (p_s_path)->path_length))
|
||||
#define PATH_PLAST_BUFFER(path) (PATH_OFFSET_PBUFFER((path), (path)->path_length))
|
||||
/* you know, to the person who didn't
|
||||
write this the macro name does not
|
||||
at first suggest what it does.
|
||||
Maybe POSITION_FROM_PATH_END? Or
|
||||
maybe we should just focus on
|
||||
dumping paths... -Hans */
|
||||
#define PATH_LAST_POSITION(p_s_path) (PATH_OFFSET_POSITION((p_s_path), (p_s_path)->path_length))
|
||||
#define PATH_LAST_POSITION(path) (PATH_OFFSET_POSITION((path), (path)->path_length))
|
||||
|
||||
#define PATH_PITEM_HEAD(p_s_path) B_N_PITEM_HEAD(PATH_PLAST_BUFFER(p_s_path),PATH_LAST_POSITION(p_s_path))
|
||||
#define PATH_PITEM_HEAD(path) B_N_PITEM_HEAD(PATH_PLAST_BUFFER(path), PATH_LAST_POSITION(path))
|
||||
|
||||
/* in do_balance leaf has h == 0 in contrast with path structure,
|
||||
where root has level == 0. That is why we need these defines */
|
||||
#define PATH_H_PBUFFER(p_s_path, h) PATH_OFFSET_PBUFFER (p_s_path, p_s_path->path_length - (h)) /* tb->S[h] */
|
||||
#define PATH_H_PBUFFER(path, h) PATH_OFFSET_PBUFFER (path, path->path_length - (h)) /* tb->S[h] */
|
||||
#define PATH_H_PPARENT(path, h) PATH_H_PBUFFER (path, (h) + 1) /* tb->F[h] or tb->S[0]->b_parent */
|
||||
#define PATH_H_POSITION(path, h) PATH_OFFSET_POSITION (path, path->path_length - (h))
|
||||
#define PATH_H_B_ITEM_ORDER(path, h) PATH_H_POSITION(path, h + 1) /* tb->S[h]->b_item_order */
|
||||
|
||||
#define PATH_H_PATH_OFFSET(p_s_path, n_h) ((p_s_path)->path_length - (n_h))
|
||||
#define PATH_H_PATH_OFFSET(path, n_h) ((path)->path_length - (n_h))
|
||||
|
||||
#define get_last_bh(path) PATH_PLAST_BUFFER(path)
|
||||
#define get_ih(path) PATH_PITEM_HEAD(path)
|
||||
@@ -1470,6 +1476,16 @@ struct buffer_info {
|
||||
int bi_position;
|
||||
};
|
||||
|
||||
static inline struct super_block *sb_from_tb(struct tree_balance *tb)
|
||||
{
|
||||
return tb ? tb->tb_sb : NULL;
|
||||
}
|
||||
|
||||
static inline struct super_block *sb_from_bi(struct buffer_info *bi)
|
||||
{
|
||||
return bi ? sb_from_tb(bi->tb) : NULL;
|
||||
}
|
||||
|
||||
/* there are 4 types of items: stat data, directory item, indirect, direct.
|
||||
+-------------------+------------+--------------+------------+
|
||||
| | k_offset | k_uniqueness | mergeable? |
|
||||
@@ -1520,7 +1536,7 @@ extern struct item_operations *item_ops[TYPE_ANY + 1];
|
||||
#define COMP_SHORT_KEYS comp_short_keys
|
||||
|
||||
/* number of blocks pointed to by the indirect item */
|
||||
#define I_UNFM_NUM(p_s_ih) ( ih_item_len(p_s_ih) / UNFM_P_SIZE )
|
||||
#define I_UNFM_NUM(ih) (ih_item_len(ih) / UNFM_P_SIZE)
|
||||
|
||||
/* the used space within the unformatted node corresponding to pos within the item pointed to by ih */
|
||||
#define I_POS_UNFM_SIZE(ih,pos,size) (((pos) == I_UNFM_NUM(ih) - 1 ) ? (size) - ih_free_space(ih) : (size))
|
||||
@@ -1623,6 +1639,10 @@ struct reiserfs_journal_header {
|
||||
#define JOURNAL_MAX_COMMIT_AGE 30
|
||||
#define JOURNAL_MAX_TRANS_AGE 30
|
||||
#define JOURNAL_PER_BALANCE_CNT (3 * (MAX_HEIGHT-2) + 9)
|
||||
#define JOURNAL_BLOCKS_PER_OBJECT(sb) (JOURNAL_PER_BALANCE_CNT * 3 + \
|
||||
2 * (REISERFS_QUOTA_INIT_BLOCKS(sb) + \
|
||||
REISERFS_QUOTA_TRANS_BLOCKS(sb)))
|
||||
|
||||
#ifdef CONFIG_QUOTA
|
||||
/* We need to update data and inode (atime) */
|
||||
#define REISERFS_QUOTA_TRANS_BLOCKS(s) (REISERFS_SB(s)->s_mount_opt & (1<<REISERFS_QUOTA) ? 2 : 0)
|
||||
@@ -1697,7 +1717,7 @@ struct reiserfs_transaction_handle {
|
||||
int t_refcount;
|
||||
int t_blocks_logged; /* number of blocks this writer has logged */
|
||||
int t_blocks_allocated; /* number of blocks this writer allocated */
|
||||
unsigned long t_trans_id; /* sanity check, equals the current trans id */
|
||||
unsigned int t_trans_id; /* sanity check, equals the current trans id */
|
||||
void *t_handle_save; /* save existing current->journal_info */
|
||||
unsigned displace_new_blocks:1; /* if new block allocation occurres, that block
|
||||
should be displaced from others */
|
||||
@@ -1773,13 +1793,13 @@ int journal_end_sync(struct reiserfs_transaction_handle *, struct super_block *,
|
||||
int journal_mark_freed(struct reiserfs_transaction_handle *,
|
||||
struct super_block *, b_blocknr_t blocknr);
|
||||
int journal_transaction_should_end(struct reiserfs_transaction_handle *, int);
|
||||
int reiserfs_in_journal(struct super_block *p_s_sb, unsigned int bmap_nr,
|
||||
int bit_nr, int searchall, b_blocknr_t *next);
|
||||
int reiserfs_in_journal(struct super_block *sb, unsigned int bmap_nr,
|
||||
int bit_nr, int searchall, b_blocknr_t *next);
|
||||
int journal_begin(struct reiserfs_transaction_handle *,
|
||||
struct super_block *p_s_sb, unsigned long);
|
||||
struct super_block *sb, unsigned long);
|
||||
int journal_join_abort(struct reiserfs_transaction_handle *,
|
||||
struct super_block *p_s_sb, unsigned long);
|
||||
void reiserfs_journal_abort(struct super_block *sb, int errno);
|
||||
struct super_block *sb, unsigned long);
|
||||
void reiserfs_abort_journal(struct super_block *sb, int errno);
|
||||
void reiserfs_abort(struct super_block *sb, int errno, const char *fmt, ...);
|
||||
int reiserfs_allocate_list_bitmaps(struct super_block *s,
|
||||
struct reiserfs_list_bitmap *, unsigned int);
|
||||
@@ -1796,8 +1816,8 @@ int reiserfs_convert_objectid_map_v1(struct super_block *);
|
||||
|
||||
/* stree.c */
|
||||
int B_IS_IN_TREE(const struct buffer_head *);
|
||||
extern void copy_item_head(struct item_head *p_v_to,
|
||||
const struct item_head *p_v_from);
|
||||
extern void copy_item_head(struct item_head *to,
|
||||
const struct item_head *from);
|
||||
|
||||
// first key is in cpu form, second - le
|
||||
extern int comp_short_keys(const struct reiserfs_key *le_key,
|
||||
@@ -1832,20 +1852,20 @@ static inline void copy_key(struct reiserfs_key *to,
|
||||
memcpy(to, from, KEY_SIZE);
|
||||
}
|
||||
|
||||
int comp_items(const struct item_head *stored_ih, const struct treepath *p_s_path);
|
||||
const struct reiserfs_key *get_rkey(const struct treepath *p_s_chk_path,
|
||||
const struct super_block *p_s_sb);
|
||||
int comp_items(const struct item_head *stored_ih, const struct treepath *path);
|
||||
const struct reiserfs_key *get_rkey(const struct treepath *chk_path,
|
||||
const struct super_block *sb);
|
||||
int search_by_key(struct super_block *, const struct cpu_key *,
|
||||
struct treepath *, int);
|
||||
#define search_item(s,key,path) search_by_key (s, key, path, DISK_LEAF_NODE_LEVEL)
|
||||
int search_for_position_by_key(struct super_block *p_s_sb,
|
||||
const struct cpu_key *p_s_cpu_key,
|
||||
struct treepath *p_s_search_path);
|
||||
extern void decrement_bcount(struct buffer_head *p_s_bh);
|
||||
void decrement_counters_in_path(struct treepath *p_s_search_path);
|
||||
void pathrelse(struct treepath *p_s_search_path);
|
||||
int search_for_position_by_key(struct super_block *sb,
|
||||
const struct cpu_key *cpu_key,
|
||||
struct treepath *search_path);
|
||||
extern void decrement_bcount(struct buffer_head *bh);
|
||||
void decrement_counters_in_path(struct treepath *search_path);
|
||||
void pathrelse(struct treepath *search_path);
|
||||
int reiserfs_check_path(struct treepath *p);
|
||||
void pathrelse_and_restore(struct super_block *s, struct treepath *p_s_search_path);
|
||||
void pathrelse_and_restore(struct super_block *s, struct treepath *search_path);
|
||||
|
||||
int reiserfs_insert_item(struct reiserfs_transaction_handle *th,
|
||||
struct treepath *path,
|
||||
@@ -1868,14 +1888,14 @@ int reiserfs_cut_from_item(struct reiserfs_transaction_handle *th,
|
||||
int reiserfs_delete_item(struct reiserfs_transaction_handle *th,
|
||||
struct treepath *path,
|
||||
const struct cpu_key *key,
|
||||
struct inode *inode, struct buffer_head *p_s_un_bh);
|
||||
struct inode *inode, struct buffer_head *un_bh);
|
||||
|
||||
void reiserfs_delete_solid_item(struct reiserfs_transaction_handle *th,
|
||||
struct inode *inode, struct reiserfs_key *key);
|
||||
int reiserfs_delete_object(struct reiserfs_transaction_handle *th,
|
||||
struct inode *p_s_inode);
|
||||
struct inode *inode);
|
||||
int reiserfs_do_truncate(struct reiserfs_transaction_handle *th,
|
||||
struct inode *p_s_inode, struct page *,
|
||||
struct inode *inode, struct page *,
|
||||
int update_timestamps);
|
||||
|
||||
#define i_block_size(inode) ((inode)->i_sb->s_blocksize)
|
||||
@@ -1919,10 +1939,12 @@ void make_le_item_head(struct item_head *ih, const struct cpu_key *key,
|
||||
loff_t offset, int type, int length, int entry_count);
|
||||
struct inode *reiserfs_iget(struct super_block *s, const struct cpu_key *key);
|
||||
|
||||
struct reiserfs_security_handle;
|
||||
int reiserfs_new_inode(struct reiserfs_transaction_handle *th,
|
||||
struct inode *dir, int mode,
|
||||
const char *symname, loff_t i_size,
|
||||
struct dentry *dentry, struct inode *inode);
|
||||
struct dentry *dentry, struct inode *inode,
|
||||
struct reiserfs_security_handle *security);
|
||||
|
||||
void reiserfs_update_sd_size(struct reiserfs_transaction_handle *th,
|
||||
struct inode *inode, loff_t size);
|
||||
@@ -1980,7 +2002,7 @@ int reiserfs_global_version_in_proc(char *buffer, char **start, off_t offset,
|
||||
#define PROC_INFO_MAX( sb, field, value ) VOID_V
|
||||
#define PROC_INFO_INC( sb, field ) VOID_V
|
||||
#define PROC_INFO_ADD( sb, field, val ) VOID_V
|
||||
#define PROC_INFO_BH_STAT( p_s_sb, p_s_bh, n_node_level ) VOID_V
|
||||
#define PROC_INFO_BH_STAT(sb, bh, n_node_level) VOID_V
|
||||
#endif
|
||||
|
||||
/* dir.c */
|
||||
@@ -1988,6 +2010,7 @@ extern const struct inode_operations reiserfs_dir_inode_operations;
|
||||
extern const struct inode_operations reiserfs_symlink_inode_operations;
|
||||
extern const struct inode_operations reiserfs_special_inode_operations;
|
||||
extern const struct file_operations reiserfs_dir_operations;
|
||||
int reiserfs_readdir_dentry(struct dentry *, void *, filldir_t, loff_t *);
|
||||
|
||||
/* tail_conversion.c */
|
||||
int direct2indirect(struct reiserfs_transaction_handle *, struct inode *,
|
||||
@@ -2004,13 +2027,20 @@ extern const struct address_space_operations reiserfs_address_space_operations;
|
||||
|
||||
/* fix_nodes.c */
|
||||
|
||||
int fix_nodes(int n_op_mode, struct tree_balance *p_s_tb,
|
||||
struct item_head *p_s_ins_ih, const void *);
|
||||
int fix_nodes(int n_op_mode, struct tree_balance *tb,
|
||||
struct item_head *ins_ih, const void *);
|
||||
void unfix_nodes(struct tree_balance *);
|
||||
|
||||
/* prints.c */
|
||||
void reiserfs_panic(struct super_block *s, const char *fmt, ...)
|
||||
void __reiserfs_panic(struct super_block *s, const char *id,
|
||||
const char *function, const char *fmt, ...)
|
||||
__attribute__ ((noreturn));
|
||||
#define reiserfs_panic(s, id, fmt, args...) \
|
||||
__reiserfs_panic(s, id, __func__, fmt, ##args)
|
||||
void __reiserfs_error(struct super_block *s, const char *id,
|
||||
const char *function, const char *fmt, ...);
|
||||
#define reiserfs_error(s, id, fmt, args...) \
|
||||
__reiserfs_error(s, id, __func__, fmt, ##args)
|
||||
void reiserfs_info(struct super_block *s, const char *fmt, ...);
|
||||
void reiserfs_debug(struct super_block *s, int level, const char *fmt, ...);
|
||||
void print_indirect_item(struct buffer_head *bh, int item_num);
|
||||
@@ -2047,7 +2077,7 @@ void leaf_paste_in_buffer(struct buffer_info *bi, int pasted_item_num,
|
||||
int zeros_number);
|
||||
void leaf_cut_from_buffer(struct buffer_info *bi, int cut_item_num,
|
||||
int pos_in_item, int cut_size);
|
||||
void leaf_paste_entries(struct buffer_head *bh, int item_num, int before,
|
||||
void leaf_paste_entries(struct buffer_info *bi, int item_num, int before,
|
||||
int new_entry_count, struct reiserfs_de_head *new_dehs,
|
||||
const char *records, int paste_size);
|
||||
/* ibalance.c */
|
||||
@@ -2203,6 +2233,6 @@ long reiserfs_compat_ioctl(struct file *filp,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
int reiserfs_unpack(struct inode *inode, struct file *filp);
|
||||
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* _LINUX_REISER_FS_H */
|
||||
|
||||
@@ -51,7 +51,7 @@ struct reiserfs_inode_info {
|
||||
/* we use these for fsync or O_SYNC to decide which transaction
|
||||
** needs to be committed in order for this inode to be properly
|
||||
** flushed */
|
||||
unsigned long i_trans_id;
|
||||
unsigned int i_trans_id;
|
||||
struct reiserfs_journal_list *i_jl;
|
||||
struct mutex i_mmap;
|
||||
#ifdef CONFIG_REISERFS_FS_POSIX_ACL
|
||||
@@ -59,7 +59,7 @@ struct reiserfs_inode_info {
|
||||
struct posix_acl *i_acl_default;
|
||||
#endif
|
||||
#ifdef CONFIG_REISERFS_FS_XATTR
|
||||
struct rw_semaphore xattr_sem;
|
||||
struct rw_semaphore i_xattr_sem;
|
||||
#endif
|
||||
struct inode vfs_inode;
|
||||
};
|
||||
|
||||
@@ -14,7 +14,7 @@ typedef enum {
|
||||
} reiserfs_super_block_flags;
|
||||
|
||||
/* struct reiserfs_super_block accessors/mutators
|
||||
* since this is a disk structure, it will always be in
|
||||
* since this is a disk structure, it will always be in
|
||||
* little endian format. */
|
||||
#define sb_block_count(sbp) (le32_to_cpu((sbp)->s_v1.s_block_count))
|
||||
#define set_sb_block_count(sbp,v) ((sbp)->s_v1.s_block_count = cpu_to_le32(v))
|
||||
@@ -73,6 +73,9 @@ typedef enum {
|
||||
#define sb_version(sbp) (le16_to_cpu((sbp)->s_v1.s_version))
|
||||
#define set_sb_version(sbp,v) ((sbp)->s_v1.s_version = cpu_to_le16(v))
|
||||
|
||||
#define sb_mnt_count(sbp) (le16_to_cpu((sbp)->s_mnt_count))
|
||||
#define set_sb_mnt_count(sbp, v) ((sbp)->s_mnt_count = cpu_to_le16(v))
|
||||
|
||||
#define sb_reserved_for_journal(sbp) \
|
||||
(le16_to_cpu((sbp)->s_v1.s_reserved_for_journal))
|
||||
#define set_sb_reserved_for_journal(sbp,v) \
|
||||
@@ -80,16 +83,16 @@ typedef enum {
|
||||
|
||||
/* LOGGING -- */
|
||||
|
||||
/* These all interelate for performance.
|
||||
/* These all interelate for performance.
|
||||
**
|
||||
** If the journal block count is smaller than n transactions, you lose speed.
|
||||
** If the journal block count is smaller than n transactions, you lose speed.
|
||||
** I don't know what n is yet, I'm guessing 8-16.
|
||||
**
|
||||
** typical transaction size depends on the application, how often fsync is
|
||||
** called, and how many metadata blocks you dirty in a 30 second period.
|
||||
** called, and how many metadata blocks you dirty in a 30 second period.
|
||||
** The more small files (<16k) you use, the larger your transactions will
|
||||
** be.
|
||||
**
|
||||
**
|
||||
** If your journal fills faster than dirty buffers get flushed to disk, it must flush them before allowing the journal
|
||||
** to wrap, which slows things down. If you need high speed meta data updates, the journal should be big enough
|
||||
** to prevent wrapping before dirty meta blocks get to disk.
|
||||
@@ -153,7 +156,7 @@ struct reiserfs_journal_list {
|
||||
atomic_t j_commit_left;
|
||||
atomic_t j_older_commits_done; /* all commits older than this on disk */
|
||||
struct mutex j_commit_mutex;
|
||||
unsigned long j_trans_id;
|
||||
unsigned int j_trans_id;
|
||||
time_t j_timestamp;
|
||||
struct reiserfs_list_bitmap *j_list_bitmap;
|
||||
struct buffer_head *j_commit_bh; /* commit buffer head */
|
||||
@@ -182,7 +185,7 @@ struct reiserfs_journal {
|
||||
int j_1st_reserved_block; /* first block on s_dev of reserved area journal */
|
||||
|
||||
unsigned long j_state;
|
||||
unsigned long j_trans_id;
|
||||
unsigned int j_trans_id;
|
||||
unsigned long j_mount_id;
|
||||
unsigned long j_start; /* start of current waiting commit (index into j_ap_blocks) */
|
||||
unsigned long j_len; /* length of current waiting commit */
|
||||
@@ -223,10 +226,10 @@ struct reiserfs_journal {
|
||||
int j_num_work_lists; /* number that need attention from kreiserfsd */
|
||||
|
||||
/* debugging to make sure things are flushed in order */
|
||||
int j_last_flush_id;
|
||||
unsigned int j_last_flush_id;
|
||||
|
||||
/* debugging to make sure things are committed in order */
|
||||
int j_last_commit_id;
|
||||
unsigned int j_last_commit_id;
|
||||
|
||||
struct list_head j_bitmap_nodes;
|
||||
struct list_head j_dirty_buffers;
|
||||
@@ -239,7 +242,7 @@ struct reiserfs_journal {
|
||||
|
||||
struct reiserfs_list_bitmap j_list_bitmap[JOURNAL_NUM_BITMAPS]; /* array of bitmaps to record the deleted blocks */
|
||||
struct reiserfs_journal_cnode *j_hash_table[JOURNAL_HASH_SIZE]; /* hash table for real buffer heads in current trans */
|
||||
struct reiserfs_journal_cnode *j_list_hash_table[JOURNAL_HASH_SIZE]; /* hash table for all the real buffer heads in all
|
||||
struct reiserfs_journal_cnode *j_list_hash_table[JOURNAL_HASH_SIZE]; /* hash table for all the real buffer heads in all
|
||||
the transactions */
|
||||
struct list_head j_prealloc_list; /* list of inodes which have preallocated blocks */
|
||||
int j_persistent_trans;
|
||||
@@ -399,10 +402,7 @@ struct reiserfs_sb_info {
|
||||
int reserved_blocks; /* amount of blocks reserved for further allocations */
|
||||
spinlock_t bitmap_lock; /* this lock on now only used to protect reserved_blocks variable */
|
||||
struct dentry *priv_root; /* root of /.reiserfs_priv */
|
||||
#ifdef CONFIG_REISERFS_FS_XATTR
|
||||
struct dentry *xattr_root; /* root of /.reiserfs_priv/.xa */
|
||||
struct rw_semaphore xattr_dir_sem;
|
||||
#endif
|
||||
int j_errno;
|
||||
#ifdef CONFIG_QUOTA
|
||||
char *s_qf_names[MAXQUOTAS];
|
||||
@@ -426,7 +426,7 @@ enum reiserfs_mount_options {
|
||||
partition will be dealt with in a
|
||||
manner of 3.5.x */
|
||||
|
||||
/* -o hash={tea, rupasov, r5, detect} is meant for properly mounting
|
||||
/* -o hash={tea, rupasov, r5, detect} is meant for properly mounting
|
||||
** reiserfs disks from 3.5.19 or earlier. 99% of the time, this option
|
||||
** is not required. If the normal autodection code can't determine which
|
||||
** hash to use (because both hashes had the same value for a file)
|
||||
@@ -451,7 +451,6 @@ enum reiserfs_mount_options {
|
||||
REISERFS_NO_UNHASHED_RELOCATION,
|
||||
REISERFS_HASHED_RELOCATION,
|
||||
REISERFS_ATTRS,
|
||||
REISERFS_XATTRS,
|
||||
REISERFS_XATTRS_USER,
|
||||
REISERFS_POSIXACL,
|
||||
REISERFS_BARRIER_NONE,
|
||||
@@ -489,7 +488,7 @@ enum reiserfs_mount_options {
|
||||
#define reiserfs_data_log(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_DATA_LOG))
|
||||
#define reiserfs_data_ordered(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_DATA_ORDERED))
|
||||
#define reiserfs_data_writeback(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_DATA_WRITEBACK))
|
||||
#define reiserfs_xattrs(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_XATTRS))
|
||||
#define reiserfs_xattrs(s) ((s)->s_xattr != NULL)
|
||||
#define reiserfs_xattrs_user(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_XATTRS_USER))
|
||||
#define reiserfs_posixacl(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_POSIXACL))
|
||||
#define reiserfs_xattrs_optional(s) (reiserfs_xattrs_user(s) || reiserfs_posixacl(s))
|
||||
|
||||
@@ -15,6 +15,12 @@ struct reiserfs_xattr_header {
|
||||
__le32 h_hash; /* hash of the value */
|
||||
};
|
||||
|
||||
struct reiserfs_security_handle {
|
||||
char *name;
|
||||
void *value;
|
||||
size_t length;
|
||||
};
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include <linux/init.h>
|
||||
@@ -29,22 +35,13 @@ struct iattr;
|
||||
struct super_block;
|
||||
struct nameidata;
|
||||
|
||||
struct reiserfs_xattr_handler {
|
||||
char *prefix;
|
||||
int (*init) (void);
|
||||
void (*exit) (void);
|
||||
int (*get) (struct inode * inode, const char *name, void *buffer,
|
||||
size_t size);
|
||||
int (*set) (struct inode * inode, const char *name, const void *buffer,
|
||||
size_t size, int flags);
|
||||
int (*del) (struct inode * inode, const char *name);
|
||||
int (*list) (struct inode * inode, const char *name, int namelen,
|
||||
char *out);
|
||||
struct list_head handlers;
|
||||
};
|
||||
int reiserfs_xattr_register_handlers(void) __init;
|
||||
void reiserfs_xattr_unregister_handlers(void);
|
||||
int reiserfs_xattr_init(struct super_block *sb, int mount_flags);
|
||||
int reiserfs_delete_xattrs(struct inode *inode);
|
||||
int reiserfs_chown_xattrs(struct inode *inode, struct iattr *attrs);
|
||||
|
||||
#ifdef CONFIG_REISERFS_FS_XATTR
|
||||
#define is_reiserfs_priv_object(inode) IS_PRIVATE(inode)
|
||||
#define has_xattr_dir(inode) (REISERFS_I(inode)->i_flags & i_has_xattr_dir)
|
||||
ssize_t reiserfs_getxattr(struct dentry *dentry, const char *name,
|
||||
void *buffer, size_t size);
|
||||
@@ -52,105 +49,98 @@ int reiserfs_setxattr(struct dentry *dentry, const char *name,
|
||||
const void *value, size_t size, int flags);
|
||||
ssize_t reiserfs_listxattr(struct dentry *dentry, char *buffer, size_t size);
|
||||
int reiserfs_removexattr(struct dentry *dentry, const char *name);
|
||||
int reiserfs_delete_xattrs(struct inode *inode);
|
||||
int reiserfs_chown_xattrs(struct inode *inode, struct iattr *attrs);
|
||||
int reiserfs_xattr_init(struct super_block *sb, int mount_flags);
|
||||
int reiserfs_permission(struct inode *inode, int mask);
|
||||
|
||||
int reiserfs_xattr_del(struct inode *, const char *);
|
||||
int reiserfs_xattr_get(const struct inode *, const char *, void *, size_t);
|
||||
int reiserfs_xattr_get(struct inode *, const char *, void *, size_t);
|
||||
int reiserfs_xattr_set(struct inode *, const char *, const void *, size_t, int);
|
||||
int reiserfs_xattr_set_handle(struct reiserfs_transaction_handle *,
|
||||
struct inode *, const char *, const void *,
|
||||
size_t, int);
|
||||
|
||||
extern struct reiserfs_xattr_handler user_handler;
|
||||
extern struct reiserfs_xattr_handler trusted_handler;
|
||||
extern struct reiserfs_xattr_handler security_handler;
|
||||
extern struct xattr_handler reiserfs_xattr_user_handler;
|
||||
extern struct xattr_handler reiserfs_xattr_trusted_handler;
|
||||
extern struct xattr_handler reiserfs_xattr_security_handler;
|
||||
#ifdef CONFIG_REISERFS_FS_SECURITY
|
||||
int reiserfs_security_init(struct inode *dir, struct inode *inode,
|
||||
struct reiserfs_security_handle *sec);
|
||||
int reiserfs_security_write(struct reiserfs_transaction_handle *th,
|
||||
struct inode *inode,
|
||||
struct reiserfs_security_handle *sec);
|
||||
void reiserfs_security_free(struct reiserfs_security_handle *sec);
|
||||
#endif
|
||||
|
||||
int reiserfs_xattr_register_handlers(void) __init;
|
||||
void reiserfs_xattr_unregister_handlers(void);
|
||||
|
||||
static inline void reiserfs_write_lock_xattrs(struct super_block *sb)
|
||||
#define xattr_size(size) ((size) + sizeof(struct reiserfs_xattr_header))
|
||||
static inline loff_t reiserfs_xattr_nblocks(struct inode *inode, loff_t size)
|
||||
{
|
||||
down_write(&REISERFS_XATTR_DIR_SEM(sb));
|
||||
}
|
||||
static inline void reiserfs_write_unlock_xattrs(struct super_block *sb)
|
||||
{
|
||||
up_write(&REISERFS_XATTR_DIR_SEM(sb));
|
||||
}
|
||||
static inline void reiserfs_read_lock_xattrs(struct super_block *sb)
|
||||
{
|
||||
down_read(&REISERFS_XATTR_DIR_SEM(sb));
|
||||
loff_t ret = 0;
|
||||
if (reiserfs_file_data_log(inode)) {
|
||||
ret = _ROUND_UP(xattr_size(size), inode->i_sb->s_blocksize);
|
||||
ret >>= inode->i_sb->s_blocksize_bits;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline void reiserfs_read_unlock_xattrs(struct super_block *sb)
|
||||
/* We may have to create up to 3 objects: xattr root, xattr dir, xattr file.
|
||||
* Let's try to be smart about it.
|
||||
* xattr root: We cache it. If it's not cached, we may need to create it.
|
||||
* xattr dir: If anything has been loaded for this inode, we can set a flag
|
||||
* saying so.
|
||||
* xattr file: Since we don't cache xattrs, we can't tell. We always include
|
||||
* blocks for it.
|
||||
*
|
||||
* However, since root and dir can be created between calls - YOU MUST SAVE
|
||||
* THIS VALUE.
|
||||
*/
|
||||
static inline size_t reiserfs_xattr_jcreate_nblocks(struct inode *inode)
|
||||
{
|
||||
up_read(&REISERFS_XATTR_DIR_SEM(sb));
|
||||
}
|
||||
size_t nblocks = JOURNAL_BLOCKS_PER_OBJECT(inode->i_sb);
|
||||
|
||||
static inline void reiserfs_write_lock_xattr_i(struct inode *inode)
|
||||
{
|
||||
down_write(&REISERFS_I(inode)->xattr_sem);
|
||||
}
|
||||
static inline void reiserfs_write_unlock_xattr_i(struct inode *inode)
|
||||
{
|
||||
up_write(&REISERFS_I(inode)->xattr_sem);
|
||||
}
|
||||
static inline void reiserfs_read_lock_xattr_i(struct inode *inode)
|
||||
{
|
||||
down_read(&REISERFS_I(inode)->xattr_sem);
|
||||
}
|
||||
if ((REISERFS_I(inode)->i_flags & i_has_xattr_dir) == 0) {
|
||||
nblocks += JOURNAL_BLOCKS_PER_OBJECT(inode->i_sb);
|
||||
if (REISERFS_SB(inode->i_sb)->xattr_root == NULL)
|
||||
nblocks += JOURNAL_BLOCKS_PER_OBJECT(inode->i_sb);
|
||||
}
|
||||
|
||||
static inline void reiserfs_read_unlock_xattr_i(struct inode *inode)
|
||||
{
|
||||
up_read(&REISERFS_I(inode)->xattr_sem);
|
||||
}
|
||||
|
||||
static inline void reiserfs_mark_inode_private(struct inode *inode)
|
||||
{
|
||||
inode->i_flags |= S_PRIVATE;
|
||||
return nblocks;
|
||||
}
|
||||
|
||||
static inline void reiserfs_init_xattr_rwsem(struct inode *inode)
|
||||
{
|
||||
init_rwsem(&REISERFS_I(inode)->xattr_sem);
|
||||
init_rwsem(&REISERFS_I(inode)->i_xattr_sem);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#define is_reiserfs_priv_object(inode) 0
|
||||
#define reiserfs_mark_inode_private(inode) do {;} while(0)
|
||||
#define reiserfs_getxattr NULL
|
||||
#define reiserfs_setxattr NULL
|
||||
#define reiserfs_listxattr NULL
|
||||
#define reiserfs_removexattr NULL
|
||||
#define reiserfs_write_lock_xattrs(sb) do {;} while(0)
|
||||
#define reiserfs_write_unlock_xattrs(sb) do {;} while(0)
|
||||
#define reiserfs_read_lock_xattrs(sb)
|
||||
#define reiserfs_read_unlock_xattrs(sb)
|
||||
|
||||
#define reiserfs_permission NULL
|
||||
|
||||
#define reiserfs_xattr_register_handlers() 0
|
||||
#define reiserfs_xattr_unregister_handlers()
|
||||
|
||||
static inline int reiserfs_delete_xattrs(struct inode *inode)
|
||||
{
|
||||
return 0;
|
||||
};
|
||||
static inline int reiserfs_chown_xattrs(struct inode *inode,
|
||||
struct iattr *attrs)
|
||||
{
|
||||
return 0;
|
||||
};
|
||||
static inline int reiserfs_xattr_init(struct super_block *sb, int mount_flags)
|
||||
{
|
||||
sb->s_flags = (sb->s_flags & ~MS_POSIXACL); /* to be sure */
|
||||
return 0;
|
||||
};
|
||||
static inline void reiserfs_init_xattr_rwsem(struct inode *inode)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_REISERFS_FS_XATTR */
|
||||
|
||||
#ifndef CONFIG_REISERFS_FS_SECURITY
|
||||
static inline int reiserfs_security_init(struct inode *dir,
|
||||
struct inode *inode,
|
||||
struct reiserfs_security_handle *sec)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int
|
||||
reiserfs_security_write(struct reiserfs_transaction_handle *th,
|
||||
struct inode *inode,
|
||||
struct reiserfs_security_handle *sec)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void reiserfs_security_free(struct reiserfs_security_handle *sec)
|
||||
{}
|
||||
#endif
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* _LINUX_REISERFS_XATTR_H */
|
||||
|
||||
Reference in New Issue
Block a user