summaryrefslogtreecommitdiff
path: root/refs.c
diff options
context:
space:
mode:
Diffstat (limited to 'refs.c')
-rw-r--r--refs.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/refs.c b/refs.c
index 4f495bd762..44e0b1526c 100644
--- a/refs.c
+++ b/refs.c
@@ -3041,6 +3041,8 @@ static int write_ref_sha1(struct ref_lock *lock,
errno = EINVAL;
return -1;
}
+ if (lock->lk->fd == -1)
+ reopen_lock_file(lock->lk);
if (write_in_full(lock->lk->fd, sha1_to_hex(sha1), 40) != 40 ||
write_in_full(lock->lk->fd, &term, 1) != 1 ||
close_ref(lock) < 0) {
@@ -3719,6 +3721,12 @@ int ref_transaction_commit(struct ref_transaction *transaction,
{
int ret = 0, i;
int n = transaction->nr;
+ /*
+ * We may want to open many files in a large transaction, so come up with
+ * a reasonable maximum, keep some spares for stdin/out and other open
+ * files.
+ */
+ int remaining_fds = get_max_fd_limit() - 8;
struct ref_update **updates = transaction->updates;
struct string_list refs_to_delete = STRING_LIST_INIT_NODUP;
struct string_list_item *ref_to_delete;
@@ -3762,6 +3770,11 @@ int ref_transaction_commit(struct ref_transaction *transaction,
update->refname);
goto cleanup;
}
+ if (remaining_fds > 0) {
+ remaining_fds--;
+ } else {
+ close_lock_file(update->lock->lk);
+ }
}
/* Perform updates first so live commits remain referenced */