Commit d1f3e68e authored by Linus Torvalds's avatar Linus Torvalds

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.
parents cb9cae03 5dad6c39
...@@ -209,7 +209,10 @@ static int ocfs2_acl_set_mode(struct inode *inode, struct buffer_head *di_bh, ...@@ -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_mode = new_mode;
inode->i_ctime = CURRENT_TIME;
di->i_mode = cpu_to_le16(inode->i_mode); 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); ocfs2_journal_dirty(handle, di_bh);
......
...@@ -977,7 +977,7 @@ static int o2net_tx_can_proceed(struct o2net_node *nn, ...@@ -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, int o2net_send_message_vec(u32 msg_type, u32 key, struct kvec *caller_vec,
size_t caller_veclen, u8 target_node, int *status) size_t caller_veclen, u8 target_node, int *status)
{ {
int ret; int ret = 0;
struct o2net_msg *msg = NULL; struct o2net_msg *msg = NULL;
size_t veclen, caller_bytes = 0; size_t veclen, caller_bytes = 0;
struct kvec *vec = NULL; struct kvec *vec = NULL;
......
...@@ -3931,6 +3931,15 @@ static int ocfs2_dx_dir_rebalance(struct ocfs2_super *osb, struct inode *dir, ...@@ -3931,6 +3931,15 @@ static int ocfs2_dx_dir_rebalance(struct ocfs2_super *osb, struct inode *dir,
goto out_commit; 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++) { for (i = 0; i < num_dx_leaves; i++) {
ret = ocfs2_journal_access_dl(handle, INODE_CACHE(dir), ret = ocfs2_journal_access_dl(handle, INODE_CACHE(dir),
orig_dx_leaves[i], orig_dx_leaves[i],
...@@ -3939,15 +3948,14 @@ static int ocfs2_dx_dir_rebalance(struct ocfs2_super *osb, struct inode *dir, ...@@ -3939,15 +3948,14 @@ static int ocfs2_dx_dir_rebalance(struct ocfs2_super *osb, struct inode *dir,
mlog_errno(ret); mlog_errno(ret);
goto out_commit; goto out_commit;
} }
}
cpos = split_hash; ret = ocfs2_journal_access_dl(handle, INODE_CACHE(dir),
ret = ocfs2_dx_dir_new_cluster(dir, &et, cpos, handle, new_dx_leaves[i],
data_ac, meta_ac, new_dx_leaves, OCFS2_JOURNAL_ACCESS_WRITE);
num_dx_leaves); if (ret) {
if (ret) { mlog_errno(ret);
mlog_errno(ret); goto out_commit;
goto out_commit; }
} }
ocfs2_dx_dir_transfer_leaf(dir, split_hash, handle, tmp_dx_leaf, 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, ...@@ -1030,6 +1030,7 @@ int dlm_drop_lockres_ref(struct dlm_ctxt *dlm,
struct dlm_lock_resource *res); struct dlm_lock_resource *res);
void dlm_clean_master_list(struct dlm_ctxt *dlm, void dlm_clean_master_list(struct dlm_ctxt *dlm,
u8 dead_node); 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_lock_basts_flushed(struct dlm_ctxt *dlm, struct dlm_lock *lock);
int __dlm_lockres_has_locks(struct dlm_lock_resource *res); int __dlm_lockres_has_locks(struct dlm_lock_resource *res);
int __dlm_lockres_unused(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) ...@@ -636,8 +636,14 @@ static void *lockres_seq_start(struct seq_file *m, loff_t *pos)
spin_lock(&dlm->track_lock); spin_lock(&dlm->track_lock);
if (oldres) if (oldres)
track_list = &oldres->tracking; track_list = &oldres->tracking;
else else {
track_list = &dlm->tracking_list; 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) { list_for_each_entry(res, track_list, tracking) {
if (&res->tracking == &dlm->tracking_list) if (&res->tracking == &dlm->tracking_list)
...@@ -660,6 +666,7 @@ static void *lockres_seq_start(struct seq_file *m, loff_t *pos) ...@@ -660,6 +666,7 @@ static void *lockres_seq_start(struct seq_file *m, loff_t *pos)
} else } else
dl = NULL; dl = NULL;
bail:
/* passed to seq_show */ /* passed to seq_show */
return dl; return dl;
} }
......
...@@ -693,6 +693,7 @@ void dlm_unregister_domain(struct dlm_ctxt *dlm) ...@@ -693,6 +693,7 @@ void dlm_unregister_domain(struct dlm_ctxt *dlm)
dlm_mark_domain_leaving(dlm); dlm_mark_domain_leaving(dlm);
dlm_leave_domain(dlm); dlm_leave_domain(dlm);
dlm_force_free_mles(dlm);
dlm_complete_dlm_shutdown(dlm); dlm_complete_dlm_shutdown(dlm);
} }
dlm_put(dlm); dlm_put(dlm);
......
...@@ -3433,3 +3433,43 @@ void dlm_lockres_release_ast(struct dlm_ctxt *dlm, ...@@ -3433,3 +3433,43 @@ void dlm_lockres_release_ast(struct dlm_ctxt *dlm,
wake_up(&res->wq); wake_up(&res->wq);
wake_up(&dlm->migration_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 { ...@@ -84,6 +84,7 @@ enum {
OI_LS_PARENT, OI_LS_PARENT,
OI_LS_RENAME1, OI_LS_RENAME1,
OI_LS_RENAME2, OI_LS_RENAME2,
OI_LS_REFLINK_TARGET,
}; };
int ocfs2_dlm_init(struct ocfs2_super *osb); int ocfs2_dlm_init(struct ocfs2_super *osb);
......
...@@ -235,18 +235,31 @@ ...@@ -235,18 +235,31 @@
#define OCFS2_HAS_REFCOUNT_FL (0x0010) #define OCFS2_HAS_REFCOUNT_FL (0x0010)
/* Inode attributes, keep in sync with EXT2 */ /* Inode attributes, keep in sync with EXT2 */
#define OCFS2_SECRM_FL (0x00000001) /* Secure deletion */ #define OCFS2_SECRM_FL FS_SECRM_FL /* Secure deletion */
#define OCFS2_UNRM_FL (0x00000002) /* Undelete */ #define OCFS2_UNRM_FL FS_UNRM_FL /* Undelete */
#define OCFS2_COMPR_FL (0x00000004) /* Compress file */ #define OCFS2_COMPR_FL FS_COMPR_FL /* Compress file */
#define OCFS2_SYNC_FL (0x00000008) /* Synchronous updates */ #define OCFS2_SYNC_FL FS_SYNC_FL /* Synchronous updates */
#define OCFS2_IMMUTABLE_FL (0x00000010) /* Immutable file */ #define OCFS2_IMMUTABLE_FL FS_IMMUTABLE_FL /* Immutable file */
#define OCFS2_APPEND_FL (0x00000020) /* writes to file may only append */ #define OCFS2_APPEND_FL FS_APPEND_FL /* writes to file may only append */
#define OCFS2_NODUMP_FL (0x00000040) /* do not dump file */ #define OCFS2_NODUMP_FL FS_NODUMP_FL /* do not dump file */
#define OCFS2_NOATIME_FL (0x00000080) /* do not update atime */ #define OCFS2_NOATIME_FL FS_NOATIME_FL /* do not update atime */
#define OCFS2_DIRSYNC_FL (0x00010000) /* dirsync behaviour (directories only) */ /* Reserved for compression usage... */
#define OCFS2_DIRTY_FL FS_DIRTY_FL
#define OCFS2_FL_VISIBLE (0x000100FF) /* User visible flags */ #define OCFS2_COMPRBLK_FL FS_COMPRBLK_FL /* One or more compressed clusters */
#define OCFS2_FL_MODIFIABLE (0x000100FF) /* User modifiable flags */ #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 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) * Extent record flags (e_node.leaf.flags)
......
...@@ -23,10 +23,10 @@ ...@@ -23,10 +23,10 @@
/* /*
* ioctl commands * ioctl commands
*/ */
#define OCFS2_IOC_GETFLAGS _IOR('f', 1, long) #define OCFS2_IOC_GETFLAGS FS_IOC_GETFLAGS
#define OCFS2_IOC_SETFLAGS _IOW('f', 2, long) #define OCFS2_IOC_SETFLAGS FS_IOC_SETFLAGS
#define OCFS2_IOC32_GETFLAGS _IOR('f', 1, int) #define OCFS2_IOC32_GETFLAGS FS_IOC32_GETFLAGS
#define OCFS2_IOC32_SETFLAGS _IOW('f', 2, int) #define OCFS2_IOC32_SETFLAGS FS_IOC32_SETFLAGS
/* /*
* Space reservation / allocation / free ioctls and argument structure * Space reservation / allocation / free ioctls and argument structure
......
...@@ -4201,8 +4201,9 @@ static int __ocfs2_reflink(struct dentry *old_dentry, ...@@ -4201,8 +4201,9 @@ static int __ocfs2_reflink(struct dentry *old_dentry,
goto out; goto out;
} }
mutex_lock(&new_inode->i_mutex); mutex_lock_nested(&new_inode->i_mutex, I_MUTEX_CHILD);
ret = ocfs2_inode_lock(new_inode, &new_bh, 1); ret = ocfs2_inode_lock_nested(new_inode, &new_bh, 1,
OI_LS_REFLINK_TARGET);
if (ret) { if (ret) {
mlog_errno(ret); mlog_errno(ret);
goto out_unlock; goto out_unlock;
......
...@@ -732,25 +732,23 @@ int ocfs2_resmap_resv_bits(struct ocfs2_reservation_map *resmap, ...@@ -732,25 +732,23 @@ int ocfs2_resmap_resv_bits(struct ocfs2_reservation_map *resmap,
struct ocfs2_alloc_reservation *resv, struct ocfs2_alloc_reservation *resv,
int *cstart, int *clen) int *cstart, int *clen)
{ {
unsigned int wanted = *clen;
if (resv == NULL || ocfs2_resmap_disabled(resmap)) if (resv == NULL || ocfs2_resmap_disabled(resmap))
return -ENOSPC; return -ENOSPC;
spin_lock(&resv_lock); 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)) { 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 * Try to get a window here. If it works, we must fall
* through and test the bitmap . This avoids some * through and test the bitmap . This avoids some
......
...@@ -357,7 +357,7 @@ int ocfs2_read_group_descriptor(struct inode *inode, struct ocfs2_dinode *di, ...@@ -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, static void ocfs2_bg_discontig_add_extent(struct ocfs2_super *osb,
struct ocfs2_group_desc *bg, struct ocfs2_group_desc *bg,
struct ocfs2_chain_list *cl, 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_list *el = &bg->bg_list;
struct ocfs2_extent_rec *rec; struct ocfs2_extent_rec *rec;
...@@ -369,7 +369,7 @@ static void ocfs2_bg_discontig_add_extent(struct ocfs2_super *osb, ...@@ -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_blkno = cpu_to_le64(p_blkno);
rec->e_cpos = cpu_to_le32(le16_to_cpu(bg->bg_bits) / rec->e_cpos = cpu_to_le32(le16_to_cpu(bg->bg_bits) /
le16_to_cpu(cl->cl_bpc)); 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_bits, clusters * le16_to_cpu(cl->cl_bpc));
le16_add_cpu(&bg->bg_free_bits_count, le16_add_cpu(&bg->bg_free_bits_count,
clusters * le16_to_cpu(cl->cl_bpc)); clusters * le16_to_cpu(cl->cl_bpc));
......
...@@ -1286,13 +1286,11 @@ int ocfs2_xattr_get_nolock(struct inode *inode, ...@@ -1286,13 +1286,11 @@ int ocfs2_xattr_get_nolock(struct inode *inode,
xis.inode_bh = xbs.inode_bh = di_bh; xis.inode_bh = xbs.inode_bh = di_bh;
di = (struct ocfs2_dinode *)di_bh->b_data; di = (struct ocfs2_dinode *)di_bh->b_data;
down_read(&oi->ip_xattr_sem);
ret = ocfs2_xattr_ibody_get(inode, name_index, name, buffer, ret = ocfs2_xattr_ibody_get(inode, name_index, name, buffer,
buffer_size, &xis); buffer_size, &xis);
if (ret == -ENODATA && di->i_xattr_loc) if (ret == -ENODATA && di->i_xattr_loc)
ret = ocfs2_xattr_block_get(inode, name_index, name, buffer, ret = ocfs2_xattr_block_get(inode, name_index, name, buffer,
buffer_size, &xbs); buffer_size, &xbs);
up_read(&oi->ip_xattr_sem);
return ret; return ret;
} }
...@@ -1316,8 +1314,10 @@ static int ocfs2_xattr_get(struct inode *inode, ...@@ -1316,8 +1314,10 @@ static int ocfs2_xattr_get(struct inode *inode,
mlog_errno(ret); mlog_errno(ret);
return ret; return ret;
} }
down_read(&OCFS2_I(inode)->ip_xattr_sem);
ret = ocfs2_xattr_get_nolock(inode, di_bh, name_index, ret = ocfs2_xattr_get_nolock(inode, di_bh, name_index,
name, buffer, buffer_size); name, buffer, buffer_size);
up_read(&OCFS2_I(inode)->ip_xattr_sem);
ocfs2_inode_unlock(inode, 0); ocfs2_inode_unlock(inode, 0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment