Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/ocfs2
* 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/ocfs2: o2dlm: force free mles during dlm exit ocfs2: Sync inode flags with ext2. ocfs2: Move 'wanted' into parens of ocfs2_resmap_resv_bits. ocfs2: Use cpu_to_le16 for e_leaf_clusters in ocfs2_bg_discontig_add_extent. ocfs2: update ctime when changing the file's permission by setfacl ocfs2/net: fix uninitialized ret in o2net_send_message_vec() Ocfs2: Handle empty list in lockres_seq_start() for dlmdebug.c Ocfs2: Re-access the journal after ocfs2_insert_extent() in dxdir codes. ocfs2: Fix lockdep warning in reflink. ocfs2/lockdep: Move ip_xattr_sem out of ocfs2_xattr_get_nolock.
This commit is contained in:
commit
d1f3e68efb
14 changed files with 116 additions and 43 deletions
|
@ -209,7 +209,10 @@ static int ocfs2_acl_set_mode(struct inode *inode, struct buffer_head *di_bh,
|
|||
}
|
||||
|
||||
inode->i_mode = new_mode;
|
||||
inode->i_ctime = CURRENT_TIME;
|
||||
di->i_mode = cpu_to_le16(inode->i_mode);
|
||||
di->i_ctime = cpu_to_le64(inode->i_ctime.tv_sec);
|
||||
di->i_ctime_nsec = cpu_to_le32(inode->i_ctime.tv_nsec);
|
||||
|
||||
ocfs2_journal_dirty(handle, di_bh);
|
||||
|
||||
|
|
|
@ -977,7 +977,7 @@ static int o2net_tx_can_proceed(struct o2net_node *nn,
|
|||
int o2net_send_message_vec(u32 msg_type, u32 key, struct kvec *caller_vec,
|
||||
size_t caller_veclen, u8 target_node, int *status)
|
||||
{
|
||||
int ret;
|
||||
int ret = 0;
|
||||
struct o2net_msg *msg = NULL;
|
||||
size_t veclen, caller_bytes = 0;
|
||||
struct kvec *vec = NULL;
|
||||
|
|
|
@ -3931,6 +3931,15 @@ static int ocfs2_dx_dir_rebalance(struct ocfs2_super *osb, struct inode *dir,
|
|||
goto out_commit;
|
||||
}
|
||||
|
||||
cpos = split_hash;
|
||||
ret = ocfs2_dx_dir_new_cluster(dir, &et, cpos, handle,
|
||||
data_ac, meta_ac, new_dx_leaves,
|
||||
num_dx_leaves);
|
||||
if (ret) {
|
||||
mlog_errno(ret);
|
||||
goto out_commit;
|
||||
}
|
||||
|
||||
for (i = 0; i < num_dx_leaves; i++) {
|
||||
ret = ocfs2_journal_access_dl(handle, INODE_CACHE(dir),
|
||||
orig_dx_leaves[i],
|
||||
|
@ -3939,15 +3948,14 @@ static int ocfs2_dx_dir_rebalance(struct ocfs2_super *osb, struct inode *dir,
|
|||
mlog_errno(ret);
|
||||
goto out_commit;
|
||||
}
|
||||
}
|
||||
|
||||
cpos = split_hash;
|
||||
ret = ocfs2_dx_dir_new_cluster(dir, &et, cpos, handle,
|
||||
data_ac, meta_ac, new_dx_leaves,
|
||||
num_dx_leaves);
|
||||
if (ret) {
|
||||
mlog_errno(ret);
|
||||
goto out_commit;
|
||||
ret = ocfs2_journal_access_dl(handle, INODE_CACHE(dir),
|
||||
new_dx_leaves[i],
|
||||
OCFS2_JOURNAL_ACCESS_WRITE);
|
||||
if (ret) {
|
||||
mlog_errno(ret);
|
||||
goto out_commit;
|
||||
}
|
||||
}
|
||||
|
||||
ocfs2_dx_dir_transfer_leaf(dir, split_hash, handle, tmp_dx_leaf,
|
||||
|
|
|
@ -1030,6 +1030,7 @@ int dlm_drop_lockres_ref(struct dlm_ctxt *dlm,
|
|||
struct dlm_lock_resource *res);
|
||||
void dlm_clean_master_list(struct dlm_ctxt *dlm,
|
||||
u8 dead_node);
|
||||
void dlm_force_free_mles(struct dlm_ctxt *dlm);
|
||||
int dlm_lock_basts_flushed(struct dlm_ctxt *dlm, struct dlm_lock *lock);
|
||||
int __dlm_lockres_has_locks(struct dlm_lock_resource *res);
|
||||
int __dlm_lockres_unused(struct dlm_lock_resource *res);
|
||||
|
|
|
@ -636,8 +636,14 @@ static void *lockres_seq_start(struct seq_file *m, loff_t *pos)
|
|||
spin_lock(&dlm->track_lock);
|
||||
if (oldres)
|
||||
track_list = &oldres->tracking;
|
||||
else
|
||||
else {
|
||||
track_list = &dlm->tracking_list;
|
||||
if (list_empty(track_list)) {
|
||||
dl = NULL;
|
||||
spin_unlock(&dlm->track_lock);
|
||||
goto bail;
|
||||
}
|
||||
}
|
||||
|
||||
list_for_each_entry(res, track_list, tracking) {
|
||||
if (&res->tracking == &dlm->tracking_list)
|
||||
|
@ -660,6 +666,7 @@ static void *lockres_seq_start(struct seq_file *m, loff_t *pos)
|
|||
} else
|
||||
dl = NULL;
|
||||
|
||||
bail:
|
||||
/* passed to seq_show */
|
||||
return dl;
|
||||
}
|
||||
|
|
|
@ -693,6 +693,7 @@ void dlm_unregister_domain(struct dlm_ctxt *dlm)
|
|||
|
||||
dlm_mark_domain_leaving(dlm);
|
||||
dlm_leave_domain(dlm);
|
||||
dlm_force_free_mles(dlm);
|
||||
dlm_complete_dlm_shutdown(dlm);
|
||||
}
|
||||
dlm_put(dlm);
|
||||
|
|
|
@ -3433,3 +3433,43 @@ void dlm_lockres_release_ast(struct dlm_ctxt *dlm,
|
|||
wake_up(&res->wq);
|
||||
wake_up(&dlm->migration_wq);
|
||||
}
|
||||
|
||||
void dlm_force_free_mles(struct dlm_ctxt *dlm)
|
||||
{
|
||||
int i;
|
||||
struct hlist_head *bucket;
|
||||
struct dlm_master_list_entry *mle;
|
||||
struct hlist_node *tmp, *list;
|
||||
|
||||
/*
|
||||
* We notified all other nodes that we are exiting the domain and
|
||||
* marked the dlm state to DLM_CTXT_LEAVING. If any mles are still
|
||||
* around we force free them and wake any processes that are waiting
|
||||
* on the mles
|
||||
*/
|
||||
spin_lock(&dlm->spinlock);
|
||||
spin_lock(&dlm->master_lock);
|
||||
|
||||
BUG_ON(dlm->dlm_state != DLM_CTXT_LEAVING);
|
||||
BUG_ON((find_next_bit(dlm->domain_map, O2NM_MAX_NODES, 0) < O2NM_MAX_NODES));
|
||||
|
||||
for (i = 0; i < DLM_HASH_BUCKETS; i++) {
|
||||
bucket = dlm_master_hash(dlm, i);
|
||||
hlist_for_each_safe(list, tmp, bucket) {
|
||||
mle = hlist_entry(list, struct dlm_master_list_entry,
|
||||
master_hash_node);
|
||||
if (mle->type != DLM_MLE_BLOCK) {
|
||||
mlog(ML_ERROR, "bad mle: %p\n", mle);
|
||||
dlm_print_one_mle(mle);
|
||||
}
|
||||
atomic_set(&mle->woken, 1);
|
||||
wake_up(&mle->wq);
|
||||
|
||||
__dlm_unlink_mle(dlm, mle);
|
||||
__dlm_mle_detach_hb_events(dlm, mle);
|
||||
__dlm_put_mle(mle);
|
||||
}
|
||||
}
|
||||
spin_unlock(&dlm->master_lock);
|
||||
spin_unlock(&dlm->spinlock);
|
||||
}
|
||||
|
|
|
@ -84,6 +84,7 @@ enum {
|
|||
OI_LS_PARENT,
|
||||
OI_LS_RENAME1,
|
||||
OI_LS_RENAME2,
|
||||
OI_LS_REFLINK_TARGET,
|
||||
};
|
||||
|
||||
int ocfs2_dlm_init(struct ocfs2_super *osb);
|
||||
|
|
|
@ -235,18 +235,31 @@
|
|||
#define OCFS2_HAS_REFCOUNT_FL (0x0010)
|
||||
|
||||
/* Inode attributes, keep in sync with EXT2 */
|
||||
#define OCFS2_SECRM_FL (0x00000001) /* Secure deletion */
|
||||
#define OCFS2_UNRM_FL (0x00000002) /* Undelete */
|
||||
#define OCFS2_COMPR_FL (0x00000004) /* Compress file */
|
||||
#define OCFS2_SYNC_FL (0x00000008) /* Synchronous updates */
|
||||
#define OCFS2_IMMUTABLE_FL (0x00000010) /* Immutable file */
|
||||
#define OCFS2_APPEND_FL (0x00000020) /* writes to file may only append */
|
||||
#define OCFS2_NODUMP_FL (0x00000040) /* do not dump file */
|
||||
#define OCFS2_NOATIME_FL (0x00000080) /* do not update atime */
|
||||
#define OCFS2_DIRSYNC_FL (0x00010000) /* dirsync behaviour (directories only) */
|
||||
#define OCFS2_SECRM_FL FS_SECRM_FL /* Secure deletion */
|
||||
#define OCFS2_UNRM_FL FS_UNRM_FL /* Undelete */
|
||||
#define OCFS2_COMPR_FL FS_COMPR_FL /* Compress file */
|
||||
#define OCFS2_SYNC_FL FS_SYNC_FL /* Synchronous updates */
|
||||
#define OCFS2_IMMUTABLE_FL FS_IMMUTABLE_FL /* Immutable file */
|
||||
#define OCFS2_APPEND_FL FS_APPEND_FL /* writes to file may only append */
|
||||
#define OCFS2_NODUMP_FL FS_NODUMP_FL /* do not dump file */
|
||||
#define OCFS2_NOATIME_FL FS_NOATIME_FL /* do not update atime */
|
||||
/* Reserved for compression usage... */
|
||||
#define OCFS2_DIRTY_FL FS_DIRTY_FL
|
||||
#define OCFS2_COMPRBLK_FL FS_COMPRBLK_FL /* One or more compressed clusters */
|
||||
#define OCFS2_NOCOMP_FL FS_NOCOMP_FL /* Don't compress */
|
||||
#define OCFS2_ECOMPR_FL FS_ECOMPR_FL /* Compression error */
|
||||
/* End compression flags --- maybe not all used */
|
||||
#define OCFS2_BTREE_FL FS_BTREE_FL /* btree format dir */
|
||||
#define OCFS2_INDEX_FL FS_INDEX_FL /* hash-indexed directory */
|
||||
#define OCFS2_IMAGIC_FL FS_IMAGIC_FL /* AFS directory */
|
||||
#define OCFS2_JOURNAL_DATA_FL FS_JOURNAL_DATA_FL /* Reserved for ext3 */
|
||||
#define OCFS2_NOTAIL_FL FS_NOTAIL_FL /* file tail should not be merged */
|
||||
#define OCFS2_DIRSYNC_FL FS_DIRSYNC_FL /* dirsync behaviour (directories only) */
|
||||
#define OCFS2_TOPDIR_FL FS_TOPDIR_FL /* Top of directory hierarchies*/
|
||||
#define OCFS2_RESERVED_FL FS_RESERVED_FL /* reserved for ext2 lib */
|
||||
|
||||
#define OCFS2_FL_VISIBLE (0x000100FF) /* User visible flags */
|
||||
#define OCFS2_FL_MODIFIABLE (0x000100FF) /* User modifiable flags */
|
||||
#define OCFS2_FL_VISIBLE FS_FL_USER_VISIBLE /* User visible flags */
|
||||
#define OCFS2_FL_MODIFIABLE FS_FL_USER_MODIFIABLE /* User modifiable flags */
|
||||
|
||||
/*
|
||||
* Extent record flags (e_node.leaf.flags)
|
||||
|
|
|
@ -23,10 +23,10 @@
|
|||
/*
|
||||
* ioctl commands
|
||||
*/
|
||||
#define OCFS2_IOC_GETFLAGS _IOR('f', 1, long)
|
||||
#define OCFS2_IOC_SETFLAGS _IOW('f', 2, long)
|
||||
#define OCFS2_IOC32_GETFLAGS _IOR('f', 1, int)
|
||||
#define OCFS2_IOC32_SETFLAGS _IOW('f', 2, int)
|
||||
#define OCFS2_IOC_GETFLAGS FS_IOC_GETFLAGS
|
||||
#define OCFS2_IOC_SETFLAGS FS_IOC_SETFLAGS
|
||||
#define OCFS2_IOC32_GETFLAGS FS_IOC32_GETFLAGS
|
||||
#define OCFS2_IOC32_SETFLAGS FS_IOC32_SETFLAGS
|
||||
|
||||
/*
|
||||
* Space reservation / allocation / free ioctls and argument structure
|
||||
|
|
|
@ -4201,8 +4201,9 @@ static int __ocfs2_reflink(struct dentry *old_dentry,
|
|||
goto out;
|
||||
}
|
||||
|
||||
mutex_lock(&new_inode->i_mutex);
|
||||
ret = ocfs2_inode_lock(new_inode, &new_bh, 1);
|
||||
mutex_lock_nested(&new_inode->i_mutex, I_MUTEX_CHILD);
|
||||
ret = ocfs2_inode_lock_nested(new_inode, &new_bh, 1,
|
||||
OI_LS_REFLINK_TARGET);
|
||||
if (ret) {
|
||||
mlog_errno(ret);
|
||||
goto out_unlock;
|
||||
|
|
|
@ -732,25 +732,23 @@ int ocfs2_resmap_resv_bits(struct ocfs2_reservation_map *resmap,
|
|||
struct ocfs2_alloc_reservation *resv,
|
||||
int *cstart, int *clen)
|
||||
{
|
||||
unsigned int wanted = *clen;
|
||||
|
||||
if (resv == NULL || ocfs2_resmap_disabled(resmap))
|
||||
return -ENOSPC;
|
||||
|
||||
spin_lock(&resv_lock);
|
||||
|
||||
/*
|
||||
* We don't want to over-allocate for temporary
|
||||
* windows. Otherwise, we run the risk of fragmenting the
|
||||
* allocation space.
|
||||
*/
|
||||
wanted = ocfs2_resv_window_bits(resmap, resv);
|
||||
if ((resv->r_flags & OCFS2_RESV_FLAG_TMP) || wanted < *clen)
|
||||
wanted = *clen;
|
||||
|
||||
if (ocfs2_resv_empty(resv)) {
|
||||
mlog(0, "empty reservation, find new window\n");
|
||||
/*
|
||||
* We don't want to over-allocate for temporary
|
||||
* windows. Otherwise, we run the risk of fragmenting the
|
||||
* allocation space.
|
||||
*/
|
||||
unsigned int wanted = ocfs2_resv_window_bits(resmap, resv);
|
||||
|
||||
if ((resv->r_flags & OCFS2_RESV_FLAG_TMP) || wanted < *clen)
|
||||
wanted = *clen;
|
||||
|
||||
mlog(0, "empty reservation, find new window\n");
|
||||
/*
|
||||
* Try to get a window here. If it works, we must fall
|
||||
* through and test the bitmap . This avoids some
|
||||
|
|
|
@ -357,7 +357,7 @@ int ocfs2_read_group_descriptor(struct inode *inode, struct ocfs2_dinode *di,
|
|||
static void ocfs2_bg_discontig_add_extent(struct ocfs2_super *osb,
|
||||
struct ocfs2_group_desc *bg,
|
||||
struct ocfs2_chain_list *cl,
|
||||
u64 p_blkno, u32 clusters)
|
||||
u64 p_blkno, unsigned int clusters)
|
||||
{
|
||||
struct ocfs2_extent_list *el = &bg->bg_list;
|
||||
struct ocfs2_extent_rec *rec;
|
||||
|
@ -369,7 +369,7 @@ static void ocfs2_bg_discontig_add_extent(struct ocfs2_super *osb,
|
|||
rec->e_blkno = cpu_to_le64(p_blkno);
|
||||
rec->e_cpos = cpu_to_le32(le16_to_cpu(bg->bg_bits) /
|
||||
le16_to_cpu(cl->cl_bpc));
|
||||
rec->e_leaf_clusters = cpu_to_le32(clusters);
|
||||
rec->e_leaf_clusters = cpu_to_le16(clusters);
|
||||
le16_add_cpu(&bg->bg_bits, clusters * le16_to_cpu(cl->cl_bpc));
|
||||
le16_add_cpu(&bg->bg_free_bits_count,
|
||||
clusters * le16_to_cpu(cl->cl_bpc));
|
||||
|
|
|
@ -1286,13 +1286,11 @@ int ocfs2_xattr_get_nolock(struct inode *inode,
|
|||
xis.inode_bh = xbs.inode_bh = di_bh;
|
||||
di = (struct ocfs2_dinode *)di_bh->b_data;
|
||||
|
||||
down_read(&oi->ip_xattr_sem);
|
||||
ret = ocfs2_xattr_ibody_get(inode, name_index, name, buffer,
|
||||
buffer_size, &xis);
|
||||
if (ret == -ENODATA && di->i_xattr_loc)
|
||||
ret = ocfs2_xattr_block_get(inode, name_index, name, buffer,
|
||||
buffer_size, &xbs);
|
||||
up_read(&oi->ip_xattr_sem);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -1316,8 +1314,10 @@ static int ocfs2_xattr_get(struct inode *inode,
|
|||
mlog_errno(ret);
|
||||
return ret;
|
||||
}
|
||||
down_read(&OCFS2_I(inode)->ip_xattr_sem);
|
||||
ret = ocfs2_xattr_get_nolock(inode, di_bh, name_index,
|
||||
name, buffer, buffer_size);
|
||||
up_read(&OCFS2_I(inode)->ip_xattr_sem);
|
||||
|
||||
ocfs2_inode_unlock(inode, 0);
|
||||
|
||||
|
|
Loading…
Reference in a new issue